JMeter:在JMeter测试计划中提取并传递事务控制器名称

时间:2017-03-27 11:39:36

标签: jmeter jmeter-plugins

在我的JMeter测试计划中,我有3个交易控制器。 我想提取事务控制器名称并将其传递给Jmeter脚本。 我无法提取事务控制器名称,该名称显示在“日志查看器面板”中。

要打印事务名称,我使用了BeanShell Listener,代码如下:

String tname= sampleResult.toString();

if(tname.startsWith("T01_Login"))
{
log.info("*Transaction Name = " +sampleResult.toString() + " - Response time = " + sampleResult.getTime());
String temp = sampleResult.toString();
String temp2 = sampleResult.getTime().toString();
vars.put("Transaction_Name",temp);
vars.put("Response", temp2);
log.info(vars.get("Response"));
log.info(vars.get("Transaction_Name"));
}

我使用BSF后处理器来存储/提取事务名称,使用以下代码:

选择的语言:Javascript

var transact = ${Transaction_Name};
vars.put ("TRANSACT",transact);
log.info(TRANSACT);

选中LogViewer面板后,将显示以下文本:

2017/03/27 17:06:13 INFO  - jmeter.util.BeanShellTestElement: *Transaction Name = T01_Login - Response time = 39829 
2017/03/27 17:06:13 INFO  - jmeter.util.BeanShellTestElement: 39829 
2017/03/27 17:06:13 INFO  - jmeter.util.BeanShellTestElement: T01_Login 

请提供宝贵的建议。

1 个答案:

答案 0 :(得分:1)

要解决阻止后处理器运行的错误,请使用vars.get,而不是var transact = ${Transaction_Name};,即

var transact = vars.get("Transaction_Name");

设置另一个变量(vars.put ("TRANSACT",transact);)是不必要的:只需使用Transaction_Name即可。 (另一个小注:BSF对象集现已弃用,因此将它们切换为JSR322或BeanShell)

但它无论如何都行不通,因为执行的顺序是

Sampler > Post-processor > Listener > Transaction Controller > Listener

因此,后处理器中Transaction_Name的值将为空(在第一次迭代时),或者将来自上一次迭代,我猜这不是你想要的。

您没有提及您的用例,但您有一些选择:

  1. 在交易控制器之后有一个特殊的采样器,可以在后处理器中执行您想要的操作。例如:

    Transaction Controller
        Some Sampler 
        ...
    JSR223 / Beanshell sampler
    

    第二个采样器可以获得正确的交易名称,因为它在交易后运行

  2. 在调用事务之前将事务名称保存到变量中。将事务控制器名称设置为该变量:

    JSR223 / Beanshell sampler 
      sets variable: vars.put("Transaction_Name", "T01_Login"); 
    ${Transaction_Name} <-- this is the name of the transaction controller
        Sampler
            Post-processor <-- here the Transaction_Name can be obtained.