bash脚本中的jmeter退出代码始终返回0

时间:2018-04-04 13:32:01

标签: bash jmeter load-testing

在bash脚本中使用jmeter,如果任何断言失败,如何管理它返回非零值?

jmeter -n -t someFile.jmx
echo $?

# always returns 0, even if an assertion failed

我使用脚本尝试Bean Shell Assertion

if (ResponseCode.equals("200") == false) {
  System.exit(-1);
}

但是这甚至没有返回0,它只会杀死进程(我猜?)

愿任何人帮我这个吗?

4 个答案:

答案 0 :(得分:2)

将以下代码放入JSR223 Element

System.exit(1);

它将返回错误级别1,将在执行echo $?时在Linux中显示

答案 1 :(得分:1)

如果您只关心发现错误时jmeter返回退出代码,则可以随后在.log中检查有错误的行:

test $(grep -c ERROR jmeter.log) -eq 0

如果调用echo $?,则可以发现错误返回1,否则返回0。

答案 2 :(得分:0)

  1. 我无法重现您的问题,您确定您的主张确实有效吗?该代码或多或少都可以,但是放置位置也很重要。

    #./jmeter -n -t test.jmx
    Creating summariser <summary>
    Created the tree successfully using test.jmx
    Starting the test @ Thu Jun 21 07:34:49 CEST 2018 (1529559289011)
    Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
    #echo $?
    255
    
  2. 您可以使用Jenkins Performance Plugin,如果达到或超过某些阈值,它可以自动将构建标记为不稳定或失败。
  3. 您可以使用Taurus工具作为JMeter测试的包装器。它具有强大而灵活的pass/fail criteria子系统,您可以在其中定义断言逻辑,如果出现故障-Taurus会将非零的退出代码返回到父shell。

答案 3 :(得分:0)

我在taken from here内将JMeter 4.0版使用以下方法(JSR223 Assertion),并将脚本语言设置为groovy。 但是请注意where you use System.exit code

首先使用JSR223 Assertion,我们在所有采样器中收集失败的测试,并将其放入用户定义的变量中:

String expectedCode = "200";
if(!expectedCode.equals(prev.getResponseCode())){
  String currentValue = vars.get("failedTests");
  currentValue = currentValue + "Expected <response code> [" + expectedCode + "] but we got instead [" + prev.getResponseCode() + "] in sampler: '" + sampler.name + "'\n"
  vars.put("failedTests",currentValue);
}

然后在测试结束时基于该变量,我们检查它是否包含任何值。在这种情况下,我们会使整个套件失败并相应地记录日志:

String testResults = vars.get("failedTests");

if(testResults.length() > 0 )
{
  println testResults;
  log.info(testResults);

  println "Exit the system now with: System.exit(1)";
  System.exit(1);
} else {
  println "All test passed!";
  log.info("All test passed!");
}