是否可以在Jmeter中对线程故障执行某些操作?

是否可以在Jmeter中对线程故障执行某些操作?,jmeter,try-catch-finally,Jmeter,Try Catch Finally,假设我有一个Jmeter测试,它模拟一些用户登录和其他一些操作。我还启用了“错误时启动新线程”。因此,如果某个用户失败,它只会得到另一个用户,并在指定的时间内继续处理测试 但我会定期调用授权用户,为了模拟它们,我需要使用“线程间通信”和额外的线程组(-s)。基本上,这可以按照以下方式工作——在主线程中,我登录并用所需的cookie填充一些FIFO队列,然后在另一个线程组中获得该cookie。在另一个线程组中,我还检查了一个FIFO队列(在用户注销时填充),如果得到所需的内容,则停止该线程 这里的

假设我有一个Jmeter测试,它模拟一些用户登录和其他一些操作。我还启用了“错误时启动新线程”。因此,如果某个用户失败,它只会得到另一个用户,并在指定的时间内继续处理测试

但我会定期调用授权用户,为了模拟它们,我需要使用“线程间通信”和额外的线程组(-s)。基本上,这可以按照以下方式工作——在主线程中,我登录并用所需的cookie填充一些FIFO队列,然后在另一个线程组中获得该cookie。在另一个线程组中,我还检查了一个FIFO队列(在用户注销时填充),如果得到所需的内容,则停止该线程

这里的问题是当主线程在登录后失败时。在这种情况下,子线程将“永远”执行,因为周期性调用使会话保持活动状态

问题是——Jmeter中是否有可能在线程失败时执行某些操作(类似smth的finally块)。基本上,我需要在注销或线程失败时填充第二个FIFO队列,并在所有请求执行时添加一个相同级别的FIFO。它将应用于每个请求,如果失败,您将能够执行您需要的操作

比如:

  • 螺纹组
    • 登录采样器
    • 其他采样器
    • 其他一些采样器
    • 比恩希尔断言
示例断言代码:

if (!SampleResult.isSuccessful()){
    log.info("Test " + SampleResult.getSampleLabel() + " has failed");
    // handle the error
}

有关详细信息,请参阅指南

我还必须在示例错误上注销,这需要类似于try-catch-finally的东西。带有条件
${JMeterThread.last_sample_ok}
IF控制器
,并选中
评估所有子项?
如下,以干净的方式满足了我的需要:

TestPlan
    HTTP Cookie Manager
    HTTP Request Defaults
    ThreadGroup - (continue on error)
            HTTP Request - login
       IfController - (Evaluate ${JMeterThread.last_sample_ok} for all children)
                  HTTP Request 1
                  HTTP Request 2
                  ....
                  HTTP Request n
            HTTP Request - logout (after and outside of IF)

您不能使用带有javascript的IF控制器来处理登录失败后所需的代码处理。否。因为我不知道发生错误的确切地点。问题是我在登录后有很多请求,每个请求都可能失败。谢谢,但这不起作用。我不确定这是一个特性还是一个问题,但是beanshell中使用的Jmeter函数总是被执行的,即使它们在不可访问的{}块中,即使它们被注释。所以有下面的BS断言:
if(Failure){/${{uu-fifoPut(JSESSIONID,true)};}print(${uu-fifoGet(JSESSIONID,true)})
我将为所有样本打印“true”(不管它们是否失败)。
Failure
是指示断言是否失败的属性,它默认为
false
。如果您想检查父采样器是否失败,您应该使用
SampleResult.issusccessful()
而不是我在上面的回答中提到的那样,无论失败还是SampleResult.issusccessful(),结果都是相同的-始终执行函数