# 登山活动 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 powershell -ExecutionPolicy Bypass -File .\jmeter\prepare-brand-activity-users.ps1 -UserCount 1300 -PermissionMode AllScope ``` `AllScope` 会导出1300名活动范围人员。根据当前数据库,约290名人员没有报名菜单权限,其报名请求会被权限校验拒绝。 如果只测试具备权限的人员: ```powershell powershell -ExecutionPolicy Bypass -File .\jmeter\prepare-brand-activity-users.ps1 -UserCount 1010 -PermissionMode Authorized ``` 当前数据库只有1010名“有报名权限且尚未报名”的人员,因此 `Authorized` 模式不能生成1300名不同人员。 ## 2. 先进行10人试跑 启动本地项目,确认80端口和 Redis 6378 可访问,然后执行: ```powershell 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 正常、活动仍在报名时间内后执行: ```powershell 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. 生成结果报告 ```powershell 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`。 - 不提供自动删除报名数据的脚本,避免误删真实报名记录。