H,我在JSR223断言中有这样的代码

import groovy.json.JsonSlurper;
import org.apache.jmeter.services.FileServer;

failureMessage = "";
sampleLabel = SampleResult.getSampleLabel();

isResponseCodeCorrect("204");


def isResponseCodeCorrect(String expCode)
{
  String actualCode = prev.getResponseCode();

  if(!expCode.equals(actualCode)){

    failureMessage += "ERROR code: Expected <"+ expCode +"> but we got instead  " + actualCode + ";";
  }
}


问题可能是用groovy或Java创建一些代码库并将对象从执行的sampler注入(例如公共变量:ctx,vars,props,SamplerResult)吗?

目的是注入诸如SampleResult,AssertionResult之类的对象(以调用-> SampleResult.getSampleLabel()),AssertionResult.setFailureMessage(“ failureMessage);
AssertionResult.setFailure(true); )和自己的功能。

想要使包装器(某些对象)具有与Assertion一起播放的方法,将数据保存到CSV ...包装器将被导入到JSR223 Assertion中,然后我想调用一些特定的方法。

预期的包装器:

 @groovy.transform.MapConstructor
   class Foo {
    SampleResult results,
    AssertionResult assertionResult

    isResponseCodeCorrect(String expCode) {
        String actualCode = prev.getResponseCode();

    if(!expCode.equals(actualCode)){

        failureMessage += "ERROR code: Expected <"+ expCode +"> but we got instead  " + actualCode + ";";
     assertionResult.setFailureMessage(failureMessage);
     assertionResult.setFailure(true);

     log.error(sampleLabel + " Error is going to be saved to the logs");
     PrintLogToFile();
       }
    }
}


JSR223断言:

import org.foo. wrapper

Foo wrapper = new Foo();
wrapper.isResponseCodeCorrect("200");


或一些有用的东西,以避免调用之间的代码重复

最佳答案

您可以将Groovy或Java代码编译为.jar file并将其放入JMeter Classpath

完成后,您将可以从任何JSR223 Test Element和/或__groovy() function访问.jar文件中的可用功能。

我只能想到您需要的一个类:JMeterContext可以像以下这样简单地获得其实例:

def ctx = org.apache.jmeter.threads.JMeterContextService.getContext()


完成后,您将可以访问所需的任何内容:


SampleResult == ctx.getPreviousResult()
AssertionResult == ctx.getPreviousResult().getAssertionResults()
vars == ctx.getVariables()
props == ctx.getProperties()
等等


如果需要,请查看How to Reuse Your JMeter Code with JAR Files and Save Time文章以获取更多详细信息。

08-28 22:55