CI中高并发测试需规避线程阻塞等陷阱,JMeter须用-n非GUI模式、CSV参数化;Locust需实例独立登录并按标签执行;Gatling需继承Simulation类且显式传参;断言要求P95≤800ms且错误率<0.5%或偏差超15%即阻断。

在CI流水线中模拟高并发场景,用于验证服务在瞬时流量激增下的稳定性与资源调度能力,需避开线程阻塞、上下文切换爆炸、缓存击穿等典型陷阱,不能仅靠增加虚拟用户数硬扛。
用JMeter模拟高并发并嵌入CI
方法一:基于GUI录制后导出脚本 → 在CI中用CLI模式运行
启动JMeter非GUI模式执行:jmeter -n -t load_test.jmx -l result.jtl -e -o report/
⚠️ 注意:-n参数必须显式指定,否则JMeter会尝试初始化AWT图形环境,在无桌面的CI节点上直接崩溃。
方法二:用CSV参数化用户行为,避免所有线程执行完全一致的请求序列
在CSV Data Set Config中勾选“Recycle on EOF”和“Stop thread on EOF”,否则线程读完数据后空转或报错退出。
将用户ID、token、时间戳等字段从CSV加载,使每个线程携带唯一标识,真实复现分布式调用特征。
用Locust实现代码级并发控制
第一步:定义用户类时禁用全局共享状态
class ApiUser(HttpUser):
wait_time = between(0.5, 1.5)
host = "https://api.example.com"
def on_start(self):
【self.token = self.login()】
# 每个实例独立登录,不共用token,否则压测失效
第二步:用@tag标记关键链路,便于CI中按标签筛选执行
@task
@tag("payment")
def pay_order(self):
self.client.post("/v1/pay", json={"order_id": self.order_id})
第三步:CI中按需启动指定标签任务
locust -f locustfile.py --headless --users=2000 --spawn-rate=200 --run-time=3m --tags payment
用Gatling DSL构建可版本化的并发场景
创建Simulation类时,必须继承io.gatling.core.scenario.Simulation,否则编译失败
session.attributes中存储的变量默认不跨request持久化,需显式调用.sessionAttribute("key")传递上下文
在CI脚本中执行:sbt "gatling:testOnly *PaymentSimu*" → 该命令只运行匹配类名的仿真,跳过其他无关压测逻辑
生成的HTML报告自动归档至target/gatling/目录下,CI任务结束后立即上传至制品库供质量门禁校验
并发测试结果断言策略
方法1:响应时间P95 ≤ 800ms且错误率<0.5% → 作为CI流水线通过的硬性阈值
方法2:对比基线数据自动判定回归异常
提取上一次成功构建的result.jtl中avgRT值,当前轮次偏差>15%即触发阻断
⚠️ 提醒:JTL日志中timestamp为毫秒级Unix时间戳,解析时务必除以1000转换为秒,否则P95计算全错

















