2014-09-12 50 views
1

比方说,我有一个模拟一些用户登录和几个更多操作的Jmeter测试。我也有'开始新的线程出现错误'打开。因此,如果某些用户失败 - 它只会让另一个用户继续处理测试指定的时间。Jmeter中可能对线程故障执行某些操作吗?

但我有一些定期调用授权用户和模拟他们,我需要使用“线程间通信”和附加线程组(-s)。基本上,这在以下方式中工作正常 - 在主线程中,我登录并填充一些具有所需cookie的FIFO队列,并在另一个线程组中获取该cookie。在另一个线程组中,我还检查了另外一个FIFO队列(在用户注销时填充),如果得到我需要的,停止该线程。

这里的问题是主线程在登录后失败。在这种情况下,子线程将被永久执行,因为该定期调用会保持会话活动。

而这个问题 - 是否有一些可能性让Jmeter在线程失败时执行一些操作(像finally块一样运行)。基本上我需要在注销或线程故障时填写第二个FIFO队列

+0

不能使用IF控制器用JavaScript处理您所需的代码登录失败后的处理加工。 – 2014-09-12 13:19:57

+0

没有。因为我不知道可能发生错误的确切位置。问题是登录后我有很多请求,并且每个都可能失败。 – 2014-09-12 14:01:49

回答

1

在与所有请求相同的级别添加Beanshell Assertion。它将适用于每个请求,如果发生故障,您将能够满足您的需求。

喜欢的东西:

  • 线程组
    • 登录样
    • 其他一些采样
    • 一些其他采样
    • 的BeanShell断言

示例断言的代码:

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

参见How to Use JMeter Assertions in 3 Easy Steps指南的详细信息,JMeter Assertions

+0

谢谢,但这不起作用。我不确定这是一个功能还是问题,但在beanshell中使用的Jmeter函数总是执行,即使它们不可访问{}块,即使它们已被注释。 所以有下面的BS断言: 'if(Failure){$ {__ fifoPut(JSESSIONID,true)}; } print(“$ {__ fifoGet(JSESSIONID,)}”); ' 我会为所有样本打印'true'(如果它们没有失败,则无关紧要)。 – 2014-09-16 07:39:24

+0

'Failure'是指示断言是否失败的属性,它默认为'false'。如果你想检查父采样器是否失败,你应该使用'SampleResult.isSuccessful()'而不是像我在上面的回答中提到的那样 – 2014-09-16 08:16:52

+0

Failure或者SampleResult.isSuccessful()无关紧要,结果是相同的 - 函数总是执行 – 2014-09-16 08:47:55

0

我还必须注销样本错误,它需要try-catch-finally之类的东西。与条件${JMeterThread.last_sample_ok}IF Controller和下方勾选Evaluate for all children?,满足我的清洁方式需要:

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) 
相关问题