当运行定义为此的JMeter脚本(3个断言)时,无论第一个断言还是第二个断言都没有错误,唯一将在JTL日志文件中反映的断言是最后一个断言。因此,只有在断言持续时间失败时才会设置s =“true”或s =“false”,而不是在状态码或内容失败时设置。
<httpSample s="true">
<assertionResult>
<name>Assertion Status Code</name>
<failure>true</failure>
<error>false</error>
</assertionResult>
<assertionResult>
<name>Duration Assertion</name>
<failure>true</failure>
<error>false</error>
</assertionResult>
我错过了什么吗?当其中一个或一个断言失败时,有没有办法设置状态代码?
答案 0 :(得分:0)
所有断言都是独立的。
Assertions are used to perform additional checks on samplers, and are processed after every sampler in the same scope. To ensure that an Assertion is applied only to a particular sampler, add it as a child of the sampler.
看起来您的采样器是:
我使用Beanshell Sampler使用以下代码模拟了您的情况:
Thread.sleep(2000);
ResponseCode="200";
ResponseMessage="test";
return "test";
返回200
响应代码,test
响应消息并持续2
秒(以及更多一点)。
我对它应用了3个断言:
并得到了下一个回复:
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<sample t="2033" lt="0" ts="1391084548919" s="false" lb="BeanShell Sampler" rc="200" rm="test" tn="Thread Group 1-1" dt="text" by="4">
<assertionResult>
<name>Duration Assertion</name>
<failure>true</failure>
<error>false</error>
<failureMessage>The operation lasted too long: It took 2,033 milliseconds, but should not have lasted longer than 1,000 milliseconds.</failureMessage>
</assertionResult>
<assertionResult>
<name>Code Assertion</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
<assertionResult>
<name>Text Assertion</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
</sample>
正如你所看到的,“持续时间”断言失败了,其他两个都没问题。您是否有可能使用子样本,将断言应用于采样树或Transaction Controller?如果是这样 - 请重新考虑断言范围,并确保将断言作为孩子的采样器,您要检查。
答案 1 :(得分:0)
感谢德米特里的详细解答。我终于找到了根本原因。通过选中两个响应断言“忽略状态”复选框,错误地设置了上面的断言。这些旗帜对我来说似乎违反直觉。然而,这就是诀窍。以下更改成功:
HTTP请求 - 错误
HTTP请求 - 正确