JMeter脚本仅反映JTL日志文件中最后一个断言的状态

时间:2014-01-30 06:08:06

标签: jmeter

当运行定义为此的JMeter脚本(3个断言)时,无论第一个断言还是第二个断言都没有错误,唯一将在JTL日志文件中反映的断言是最后一个断言。因此,只有在断言持续时间失败时才会设置s =“true”或s =“false”,而不是在状态码或内容失败时设置。

  • HTTP请求
    • 断言状态码
    • 断言内容
    • 断言持续时间


    <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>

我错过了什么吗?当其中一个或一个断言失败时,有没有办法设置状态代码?

2 个答案:

答案 0 :(得分:0)

所有断言都是独立的。

根据JMeter Manual

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个断言:

  1. 检查响应代码为“200”;
  2. 检查响应消息是否为“test”;
  3. 检查采样器持续时间不超过“1000 ms”
  4. 并得到了下一个回复:

    <?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请求 - 正确

    • 断言状态代码(忽略状态选中)
    • 断言内容 (忽略状态未选中)
    • 断言持续时间

另见这一个。 JMeter how to NOT fail 500 Internal Server Errors