JMeter如何调用aggregate_rpt_pct属性实现百分位断言?
JMeter百分位属性阈值校验方案
JMeter没有内置的专门直接调取aggregate_rpt_pct1/aggregate_rpt_pct2/aggregate_rpt_pct3做阈值校验的断言组件,你可以通过以下两种方案实现需求,同时适配本地执行和后续Azure DevOps迁移的场景:
方案1:JSR223断言(推荐,灵活度高)
该方案适合需要自定义多规则校验、后续要对接CI/CD流程的场景,性能和扩展性都更好:
- 校验逻辑需要放在所有业务请求执行完成、聚合报告计算完成之后运行,建议把断言放在独立的Teardown线程组中,避免读取到空的属性值
- 新增JSR223断言,选择Groovy作为脚本语言(JMeter官方推荐,性能远高于其他脚本语言)
- 参考以下代码实现校验逻辑,可根据实际需求调整阈值和判断规则:
// 读取内置百分位属性,转换为double类型用于数值比较 def p90 = props.get("aggregate_rpt_pct1") as double def p95 = props.get("aggregate_rpt_pct2") as double def p99 = props.get("aggregate_rpt_pct3") as double // 阈值可直接写死,也可通过自定义属性传入适配不同环境 def expectP90 = props.get("expect_p90", "1000") as double def expectP95 = props.get("expect_p95", "1500") as double def expectP99 = props.get("expect_p99", "2000") as double // 校验逻辑 String errorMsg = "" if (p90 > expectP90) { errorMsg += "90百分位超出阈值,实际值:${p90}ms,预期值:≤${expectP90}ms;" } if (p95 > expectP95) { errorMsg += "95百分位超出阈值,实际值:${p95}ms,预期值:≤${expectP95}ms;" } if (p99 > expectP99) { errorMsg += "99百分位超出阈值,实际值:${p99}ms,预期值:≤${expectP99}ms;" } if (errorMsg) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage(errorMsg) }
- 对接Azure DevOps时不需要修改脚本,直接在执行命令中通过参数传入阈值即可,示例命令:
jmeter -n -t your_test_plan.jmx -Jexpect_p90=800 -Jexpect_p95=1200 -Jexpect_p99=1800 -l test_result.jtl
方案2:响应断言(无代码方案)
如果不想写代码,可通过变量+响应断言的方式实现基础校验:
- 新增用户定义的变量组件,定义三个变量分别对应三个百分位值,取值分别为
${__P(aggregate_rpt_pct1,)}、${__P(aggregate_rpt_pct2,)}、${__P(aggregate_rpt_pct3,)} - 新增响应断言,匹配字段选择「响应文本」,匹配规则选择「数值小于等于」,填入对应的预期阈值即可
注意:该方案只能单条校验,不支持多规则组合判断,灵活度较低,仅适合简单校验场景
额外注意:aggregate_rpt_pct1等属性是聚合报告组件计算完成后才会写入的全局属性,必须保证聚合报告组件的执行顺序在断言之前,否则会读取到空值导致校验失败
内容的提问来源于stack exchange,提问作者Icaroto
相关产品推荐
相关产品推荐

