【发布时间】:2021-12-04 14:22:33
【问题描述】:
我想通过不断增加负载来运行压力测试,直到响应时间变得不可接受。我需要检查的条件是 95% 的请求所用时间不超过 1 秒。
- 我可以在运行时动态确定吗?如果可以,如何确定?
- 达到此条件后如何停止测试?
我查看了 AutoStop Listener 插件,但它似乎没有我检查这种情况所需的东西。
【问题讨论】:
标签: performance jmeter listener jmeter-5.0 stress-testing
我想通过不断增加负载来运行压力测试,直到响应时间变得不可接受。我需要检查的条件是 95% 的请求所用时间不超过 1 秒。
我查看了 AutoStop Listener 插件,但它似乎没有我检查这种情况所需的东西。
【问题讨论】:
标签: performance jmeter listener jmeter-5.0 stress-testing
最简单的是Taurus 框架,它提供灵活而强大的Pass/Fail Criteria 子系统
示例 Taurus YAML 文件:
execution:
- scenario: simple
scenarios:
simple:
script: /path/to/your/test.jmx
reporting:
- module: passfail
criteria:
- p95.0>1s, stop as failed
如果所有请求的 95% 超过 1 秒,Taurus 将停止测试并返回非零值exit status code,这是一种脚本/CI 友好的方法。
在 JMeter 中也可以使用一些 JSR223 Scripting,您可以定期读取 .jtl 结果文件、计算百分位数、检查预期值等。
【讨论】:
-J command-line argument 将jmeter.save.saveservice.autoflush JMeter Property 设置为true
如果一个采样器超过 1 秒,则停止测试,请使用 Duration Assertion 和 1000 毫秒
测试每个响应是否在给定的时间内收到
如果断言失败,您可以停止测试:
在Thread group 中选择Action to be taken after a sampler error 下的停止测试/立即停止测试
确定发生采样器错误时会发生什么,无论是因为样本本身失败还是断言失败
【讨论】:
更新了答案以修复代码中的错误并改进日志记录
这可能是另一种解决方案。
props.put("total_requests","0")
props.put("total_requests_exceeding_limit","0")
这将确保该元素应用于测试计划中的所有采样器
${__P(stop_test_exceeding_percentile_error,true)} ${__P(percentage_limit,95)} ${__P(response_time_limit_in_seconds,1)}
long rampupTime=60000
long requestCountToStartChecking=50
long startTimeInMillis=vars.get("TESTSTART.MS").toLong()
long currentTimeInMillis = new Date().getTime()
long currentTestDurationInMillis=currentTimeInMillis-startTimeInMillis
log.info("currentTestDurationInMillis ${currentTestDurationInMillis}")
if(args[0].toBoolean() && currentTestDurationInMillis> rampupTime ){
def total_requests_exceeding_limit=0
def percentageOfRequestExceedingLimit=0
int percentile_limit=args[1].toInteger()
int response_time_limit_in_seconds=args[2].toInteger()
long response_time_limit_in_milliseconds=response_time_limit_in_seconds*1000
def totalRequests = props.get("total_requests").toInteger() + 1
props.put("total_requests",totalRequests.toString())
if(prev.getTime() > response_time_limit_in_milliseconds){
total_requests_exceeding_limit= props.get("total_requests_exceeding_limit").toInteger() + 1
percentageOfRequestExceedingLimit = ((total_requests_exceeding_limit/totalRequests)* 100).round()
if (percentageOfRequestExceedingLimit> percentile_limit && totalRequests>requestCountToStartChecking) {
log.info("Requests execeeding ${response_time_limit_in_milliseconds} has reached ${percentageOfRequestExceedingLimit}")
log.info("Stopping the test")
prev.setStopTest(true)
log.info("Stopped the test")
}
props.put("total_requests_exceeding_limit",total_requests_exceeding_limit.toString())
} else {
total_requests_exceeding_limit= props.get("total_requests_exceeding_limit").toInteger()
percentageOfRequestExceedingLimit = ( (total_requests_exceeding_limit/totalRequests)* 100).round()
}
log.info("totalRequests ${totalRequests} total_requests_exceeding_limit ${total_requests_exceeding_limit} percentageOfRequestExceedingLimit ${percentageOfRequestExceedingLimit} ")
} else {
prev.setIgnore()
}
【讨论】: