Files
zhgh_zjipc/jmeter/README.md
T
2026-11-03 17:57:19 +08:00

3.6 KiB
Raw Blame History

登山活动 1300 人并发报名压测

本目录用于本地或已明确授权的测试环境。JMeter 会真实调用登录和报名接口,并向报名表写入数据,禁止直接对生产环境执行。

文件说明

  • prepare-brand-activity-users.ps1:从当前项目数据库导出活动范围内、未禁用且尚未报名的人员。
  • brand-activity-mountain-signup-1300.jmx:每线程独立登录,所有线程到达报名步骤后同时提交。
  • data/brand-activity-users.csv:运行准备脚本后生成,不包含密码、手机号、身份证号等敏感数据。

当前登山活动参数:

  • 活动 ID:11619eee67574256ad8ccc8a16630023
  • 子活动 ID:986bf4d48a5948e1810857483f9e5af2
  • 容量:1500 人

1. 准备人员数据

在项目根目录执行:

powershell -ExecutionPolicy Bypass -File .\jmeter\prepare-brand-activity-users.ps1 -UserCount 1300 -PermissionMode AllScope

AllScope 会导出1300名活动范围人员。根据当前数据库,约290名人员没有报名菜单权限,其报名请求会被权限校验拒绝。

如果只测试具备权限的人员:

powershell -ExecutionPolicy Bypass -File .\jmeter\prepare-brand-activity-users.ps1 -UserCount 1010 -PermissionMode Authorized

当前数据库只有1010名“有报名权限且尚未报名”的人员,因此 Authorized 模式不能生成1300名不同人员。

2. 先进行10人试跑

启动本地项目,确认80端口和 Redis 6378 可访问,然后执行:

jmeter -n -t .\jmeter\brand-activity-mountain-signup-1300.jmx `
  -Jthreads=10 `
  -JloginRampSeconds=10 `
  -Jhost=127.0.0.1 `
  -Jport=80 `
  -JusersFile=jmeter/data/brand-activity-users.csv `
  -l .\jmeter\result-smoke.jtl `
  -j .\jmeter\jmeter-smoke.log

试跑会真实产生报名记录。再次运行前必须重新生成 CSV,以排除已经报名的人员。

3. 执行1300人并发

确认测试数据库已备份、应用和 Redis 正常、活动仍在报名时间内后执行:

jmeter -n -t .\jmeter\brand-activity-mountain-signup-1300.jmx `
  -Jthreads=1300 `
  -JloginRampSeconds=60 `
  -JsyncTimeoutMs=300000 `
  -Jhost=127.0.0.1 `
  -Jport=80 `
  -JusersFile=jmeter/data/brand-activity-users.csv `
  -l .\jmeter\result-1300.jtl `
  -j .\jmeter\jmeter-1300.log

登录在60秒内逐步完成;所有仍在运行的线程会在“07-集合后并发提交登山活动报名”前等待,然后同时发送报名请求。

4. 生成结果报告

jmeter -g .\jmeter\result-1300.jtl -o .\jmeter\report-1300

重点查看:

  • 05-人员账号登录:独立账号登录是否成功。
  • 06-报名资格预校验:活动范围、时间、重复报名和名额检查。
  • 07-集合后并发提交登山活动报名:真正的并发报名结果。

报名结果只有返回 code=0 且 msg=报名成功 才计为成功,避免后端异常分支返回成功状态码但消息为“报名失败”时被误判。

注意事项

  • 登录验证码由应用写入本机 Redis,JMX 仅在授权测试环境中从 Redis 读取对应验证码答案。
  • 当前 cas.enable=false。现有登录实现只在 CAS 模式开启时拒绝密码不匹配,因此 JMX 使用测试占位密码;该行为不应复制到生产环境。
  • Controller 使用单 JVM ReentrantLock,单节点下报名请求会排队;多节点下该锁无法跨节点保证一致性。
  • JMeter 1300线程会消耗较多内存。若出现堆内存不足,可在启动前提高 HEAP,例如 -Xms2g -Xmx4g。
  • 不提供自动删除报名数据的脚本,避免误删真实报名记录。