如何在JMeter上断言失败时重新发送采样器?

时间:2014-12-11 02:17:54

标签: performance jmeter

我正在JMeter中设计负载测试。 使用我们每当发送HTTP请求时都有的当前应用程序,Web服务器将偶尔发回一个带有消息的页面。要解决此问题,我们只需重新加载页面即可。这个页面可以提供任何HTTP请求。

有没有办法在JMeter中设计测试,当采样器发生故障时,采样器只需重试?
我不确定如何让Beanshell采样器重新发送HTTP请求。

3 个答案:

答案 0 :(得分:3)

可以通过额外的Beanshell Assertion

来实现

您可以从Beanshell Assertion重新运行任意采样器,就像

一样简单
ctx.getCurrentSampler().sample(null);

在所有其他断言之后添加Beanshell断言。这很重要,因为断言正在颠倒执行。

将以下代码放入Beanshell Assertion" Script"区域(只需将"message"更改为服务器在出错时返回的内容。

import org.apache.jmeter.samplers.SampleResult;

if (new String(ResponseData).equals("message")) {
    SampleResult result = ctx.getCurrentSampler().sample(null);
    if (result.getResponseDataAsString().equals("message")) {
        Failure = true;
    } else {
        SampleResult.setSuccessful(true);
    }

}

您只记录了一个结果。

  • 如果断言第一次通过 - 它会成功
  • 如果断言第一次失败并且第二次失败 - 它将成功
  • 如果断言失败2次 - 它将被记录为失败。

有关Beanshell脚本编制的详细信息,请查看How to use BeanShell: JMeter's favorite built-in component指南。

答案 1 :(得分:1)

创建这样的层次结构:

   Thread Group (1 user, 1 second ramp-up, forever)
    -While Controller (empty condition = forever)
    --Counter (start – 1, increment  – 1, reference name – counter)
    --HTTP request
    ---Timer (I prefer constant Timer, responseble for pause betwee retrying)
    ---BeanShell Post Processor

BeanShell后处理器应该包含(伪代码):

if(Integer.parseInt(vars.get("counter")>5)
{
  prev.setSuccessful(false);
  prev.setStopTestNow(true);
}
if(successCondition)
{
  prev.setStopTest(true);
}

答案 2 :(得分:-1)

没有直接的方法来实现它,但我认为您可以使用While控制器与Regex提取器一起重新发送失败的请求。

逻辑流程可以是,

1. HTTP request
2. Regex extractor post processor - check response contains failure extract value in msg variable, default is success    

3. While controller - run till msg=failure, default value of msg is success  

示例屏幕截图,

enter image description here

让我知道这是否有效。