OpenCart性能压测复盘|JMeter+Locust双工具实操,附5个踩坑记录

28 阅读7分钟

本文记录了一个完整的电商系统性能压测项目从设计到落地的全过程,涵盖 Locust 与 JMeter 双工具实操、15→25→50→100 梯度加压、踩坑记录与飞书自动通知等核心实践。

一、前言:为什么要做性能压测?

之前完成了 OpenCart 接口自动化UI自动化,只能证明系统“功能可用、流程正常”。

但真实线上场景,用户是并发访问的:多人同时登录、同时浏览商品、同时查询详情。

自动化测的是“对不对”,压测测的是“扛不扛得住”。

因此本次基于同一套 OpenCart 本地环境,使用 Locust(代码化网页压测)+ JMeter(接口梯度加压) 完成完整性能压测实操,记录真实性能变化、踩坑问题与本地压测的局限性。

注意:Locust 压测完整网页页面,JMeter 直接调用后端接口,两者测试对象不一样,响应时间不可直接拿来对比。

二、环境与工具准备

完全复用自动化测试本地环境,保证整套项目统一、连贯。

  • 被测系统:OpenCart 4.x

  • 服务依赖:XAMPP(Apache + MySQL)

  • 压测接口:网页登录、商品分类页面、商品详情页面;后端登录接口、商品分类接口、商品详情接口

  • 压测工具:Locust、JMeter

三、Locust 代码化压测(15 / 25 并发稳压)

Locust 基于 Python 编写压测脚本,无需繁琐点点点,支持自定义用户行为,适合做网页端稳压测试。本次实操同时使用 WebUI 界面手动压测,下面也提供无头模式脚本作为拓展,可以后台自动运行输出报告。

3.1 压测脚本编写

核心优化:登录放入 on_start每个虚拟用户仅登录一次,避免循环登录造成数据失真。

from locust import HttpUser, task

class UserBehavior(HttpUser):
    def on_start(self):
        # 每个虚拟用户启动时执行一次登录,维持会话Cookie
        self.client.post("/index.php?route=account/login", data={
            "email": "testuser01@demo.local",
            "password": "Test@123456"
        })

    @task
    def browse_category(self):
        # 访问商品分类页
        self.client.get("/index.php?route=product/category&path=20")

    @task
    def view_goods(self):
        # 访问商品详情页
        self.client.get("/index.php?route=product/product&product_id=43")

3.2 无头模式自动运行

不打开网页、全程后台运行,自动输出 CSV 性能报告,可对接后续飞书解析推送。

# 15并发压测,运行2分钟
locust -f locustfile.py --host=http://127.0.0.1/opencart \
--users 15 --spawn-rate 5 --run-time 2m \
--headless --csv=reports/locust_15user

# 25并发压测,运行2分钟
locust -f locustfile.py --host=http://127.0.0.1/opencart \
--users 25 --spawn-rate 5 --run-time 2m \
--headless --csv=reports/locust_25user

3.3 压测结果分析

并发数总请求数失败数平均响应时间吞吐量(req/s)
1561110201.73 ms6.4
25113520229.98 ms11.2

小结:并发从 15 提升至 25,吞吐量线性上涨,响应时间小幅上升,全程无失败请求,系统在低并发下表现稳定。

注:15 并发累计总请求数小于 25 并发;即使 15 并发运行时长更长,但虚拟用户数量少,每秒处理请求更低。评判性能优先看吞吐量、平均响应时间,不要直接对比累计总请求数。

四、JMeter 梯度加压(50 / 100 并发)

使用 JMeter 做梯度加压测试,模拟用户量逐步上涨,观察系统性能拐点,更直观体现性能变化趋势。

4.1 脚本准备规范

在项目 jmeter/ 目录统一管理脚本:

  • opencart_category_50vu.jmx 50并发脚本

  • opencart_category_100vu.jmx 100并发脚本

压测规范:仅保留汇总报告监听器,关闭查看结果树等耗资源组件,避免监听器抢占资源导致结果失真。

4.2 非GUI自动化执行命令

# 50并发压测 + 自动生成HTML报告
jmeter -n -t jmeter/opencart_category_50vu.jmx -l jmeter/result_50vu.jtl -e -o jmeter/report_50vu -f

# 100并发压测 + 自动生成HTML报告
jmeter -n -t jmeter/opencart_category_100vu.jmx -l jmeter/result_100vu.jtl -e -o jmeter/report_100vu -f

-f 参数作用:强制覆盖旧报告,解决文件夹非空报错,实现一键批量跑压测。

4.3 梯度压测结果

并发数总请求数失败率平均响应时间P95
501036200.00%25.03 ms110 ms
1001090680.00%47.69 ms264 ms

注:单机本地压测,压测工具和被测服务共用硬件资源。当本机 CPU / 内存负载高时,会出现样本量变少、响应时间急剧恶化;本文表格选取机器空闲状态下稳压完成的 Dashboard 导出结果。

image.png

小结:并发翻倍后,虽然无任何失败请求,但平均响应时间、P95 大幅上涨,系统性能出现明显衰减,达到本地环境性能拐点。

同时发现:本机资源充足时 100并发完全稳定;后台负载过高时偶发失败,属于本机资源波动导致,非系统BUG

五、实操踩坑记录

坑1:本地机器资源互相抢占,结果无法复现

JMeter、Apache、MySQL 全部跑在同一台 Windows 机器,后台软件、系统更新、弹窗都会抢占资源。

同一脚本、同一并发,有时全成功、有时偶发失败,数据波动极大。

解决:压测前关闭无关软件、多次运行取平均值,仅能缓解,无法彻底根除。

坑2:刚启动压测的数据不能用

压测前30秒系统处于预热阶段,RPS、响应时间波动巨大,数据无参考意义。

解决:等待曲线平稳、系统进入稳态后再记录指标。

坑3:JMeter 开启查看结果树导致压测失真

GUI模式下开启「查看结果树/表格」会记录每条请求明细,高并发极度消耗内存,直接拖垮压测结果。

解决:正式压测只保留汇总报告,高并发优先使用非GUI模式。

坑4:Locust CSV编码问题,飞书推送解析失败

Windows下 Locust 导出 CSV 为 GBK 编码,Python 默认 UTF-8 读取直接报错。

拓展:可以读取压测完成后的 csv 指标,组装消息发送飞书机器人,实现压测结果自动通知。代码块不动。

解决(兼容多编码读取)

encodings = ['utf-8', 'gbk', 'gb2312', 'latin-1']
for enc in encodings:
    try:
        with open(csv_path, 'r', encoding=enc) as f:
            lines = f.readlines()
            break
    except UnicodeDecodeError:
        continue

坑5:JMeter 报告目录无法覆盖

重复运行脚本会提示 folder not empty,无法生成新报告。

解决:命令行添加 -f 强制覆盖参数。

六、本地压测的局限性

本次所有测试仅用于工具练习与实操学习不能作为线上性能依据

  • Windows 无资源隔离,后台进程严重干扰测试数据

  • 单机部署:压测工具、服务、数据库抢同一套硬件资源

  • 硬件性能上限低,并发稍微拉高性能立刻衰减

七、整体总结

通过本次双工具压测实操,完整掌握:

  • Locust 代码化压测、虚拟用户、孵化速率、稳压测试

  • JMeter 梯度加压、非GUI自动化、HTML报告生成

  • 通过 15/25/50/100 多梯度并发,直观观察性能拐点

同时也理解单机本地压测存在诸多局限,生产环境性能测试需要使用分布式压测、服务资源隔离环境执行。

全梯度数据汇总表

说明:15、25并发为Locust网页页面压测;50、100并发为JMeter接口压测,两者测试对象不同,响应时间不做直接对比。

并发级别工具总请求数失败率平均响应时间
15Locust61110%201.73 ms
25Locust113520%229.98 ms
50JMeter1036200%25.03 ms
100JMeter1090680%47.69 ms

系列自动化实战专栏

相关链接