测试结果中没有考虑JMeter作为代码断言



我使用JMeter作为代码(编程方法而不是GUI,使用Java Maven项目(,以便对AWS Lambda Serverless API进行压力测试。

我已经开发了一个测试计划,线程组,HTTPSamplerProxy等等…

对API调用的执行非常完美,但情况并非如此,例如,对于我添加到HTTP采样器的DurationAssertion。。

我还为输出设置了一个CSV文件,执行后我会看到一切正常(状态代码200..(,但测试应该会失败,因为它超过了我配置的DurationAssertion(以及其他断言测试元素(。

我想也许我必须在DurationAssertion对象中设置"enabled"=true,但没有效果。。此外,我尝试以这种方式访问JMeter上下文:

JMeterContextService.getContext().getPreviousResult()

我期望上面的代码检索SampleResult(它有一个AssertionResult集合(,但SampleResult为null。。

带有测试元素的测试计划(在本例中为DurationAssertion(没有对这些断言的结果进行相应的分析,这是没有意义的。。我希望在每个超过特定阈值的呼叫中看到一条失败消息。。如果我使用JMeter GUI,我会添加一个ViewResultTree,它显示一个Sampler Result视图,其中包含请求、响应和相关测试断言的详细信息。除了断言结果(每个请求(之外,我还想查看请求负载、完整响应、标头。。但在编程模式下(不使用GUI(。

因此,如果有人能给我一些提示,告诉我如何通过代码实现这一目标,我将不胜感激。

UPDATE 1:我与整个源代码共享一个github片段,例如用户建议的UBIK LOAD PACK:

https://gist.github.com/svillarreal/5eb90a66b8972633b95c249abb3566da

UPDATE 2:上下文对象的检查(在JMeter引擎完成运行后评估(-内全部为空

更新3

i( 我最近发现了一个jmeter.properties文件,在其中我配置了以下属性:

jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.assertion_results=all

现在,XML而不是CSV的输出至少显示了发送的请求负载和响应数据,这对于分析错误案例非常有用。

ii(我在JMeterEngine执行内部检查了JMeterContextService.getContext((,而不是在它完成运行之后,然后我可以意识到每个线程组有一个上下文,在它运行期间,这个对象是满的,所以现在很清楚为什么在UPDATE 2中所有属性都为null。。

致以最良好的问候和感谢!

当您的方法不起作用时,我可以考虑至少一个用例:JMeter根本没有收到服务器的响应。

例如,如果您的服务器过载,那么JMeter可能永远不会得到响应,因此您的Duration Assertion将不会被应用,因为在SampleResult为null的情况下,不会触发PostProcessors、Listeners和Assertions。

因此,为了安全起见,我建议将连接和响应超时应用于HTTP请求采样器

HTTPSamplerProxy httpSampler = new HTTPSamplerProxy();
httpSampler.setConnectTimeout("3000");
httpSampler.setResponseTimeout("3000");
//etc.

如果您在测试计划中有>1个HTTP请求采样器,那么选择HTTP请求默认值而不是单独设置超时是有意义的。

我终于可以解决这个问题了。问题是我错误地管理了传递给StandardJMeterEngine的树。

在JMeter中,一切都基于这个树,就像在GUI中一样,我们应该注意元素在其层次结构中的定位。

通过对库的分析和深入调试,我更加深入地了解了JMeter的工作原理,并且我明白了一切都是从HashTree开始管理的。因此,解决方案是将DurationAssertion和ResponseAssertion添加为HTTPSamplerProxy节点的子级,而不是将它们作为HTTPSamplerProxy的测试元素。

特别是,在执行后填充断言以进行检查的方法如下(这让我知道如何管理哈希树(:

// org.apache.jmeter.threads.TestCompiler 
private void saveSamplerConfigs(Sampler sam) {
List<ConfigTestElement> configs = new LinkedList<>();
List<Controller> controllers = new LinkedList<>();
List<SampleListener> listeners = new LinkedList<>();
List<Timer> timers = new LinkedList<>();
List<Assertion> assertions = new LinkedList<>();
LinkedList<PostProcessor> posts = new LinkedList<>();
LinkedList<PreProcessor> pres = new LinkedList<>();
for (int i = stack.size(); i > 0; i--) {
addDirectParentControllers(controllers, stack.get(i - 1));
List<PreProcessor>  tempPre = new LinkedList<>();
List<PostProcessor> tempPost = new LinkedList<>();
List<Assertion> tempAssertions = new LinkedList<>();
for (Object item : testTree.list(stack.subList(0, i))) {
if (item instanceof ConfigTestElement) {
configs.add((ConfigTestElement) item);
}
if (item instanceof SampleListener) {
listeners.add((SampleListener) item);
}
if (item instanceof Timer) {
timers.add((Timer) item);
}
if (item instanceof Assertion) {
tempAssertions.add((Assertion) item);
}
if (item instanceof PostProcessor) {
tempPost.add((PostProcessor) item);
}
if (item instanceof PreProcessor) {
tempPre.add((PreProcessor) item);
}
}
assertions.addAll(0, tempAssertions);
pres.addAll(0, tempPre);
posts.addAll(0, tempPost);
}
SamplePackage pack = new SamplePackage(configs, listeners, timers, assertions,
posts, pres, controllers);
pack.setSampler(sam);
pack.setRunningVersion(true);
samplerConfigMap.put(sam, pack);
}

此外,我必须激活以下属性:

jmeter.save.saveservice.assertion_results_failure_message=true

因此,现在我有了CSV文件报告,其中断言结果消息包含在一个独占列中。

问题解决了。**我已经用最终的解决方案更新了github片段要点**非常感谢所有阅读这篇文章并尝试合作的人。

致问候,

最新更新