jmeter-如何使groovy脚本更易于为extentreports维护

jmeter-如何使groovy脚本更易于为extentreports维护,jmeter,Jmeter,下面是帮助我为jmeter构建extentreport的脚本。它是一个JSR223后处理器元素。但是,它工作得很好,问题是我在脚本中的每个HTTP请求之后都复制了它。我有几个包含100个HTTP请求的脚本,它们基本上需要相同的后处理器groovy脚本的副本。这=很难维护 我曾尝试将公共部分拆分为外部groovy脚本,并尝试在JSR223后处理器上调用该脚本。我还尝试将脚本的各个部分分块,并将值放入csv中,这样,如果有任何更改,我就可以更新csv值 我确信有一种更干净/更好的方法可以做到这一点,

下面是帮助我为jmeter构建extentreport的脚本。它是一个JSR223后处理器元素。但是,它工作得很好,问题是我在脚本中的每个HTTP请求之后都复制了它。我有几个包含100个HTTP请求的脚本,它们基本上需要相同的后处理器groovy脚本的副本。这=很难维护

我曾尝试将公共部分拆分为外部groovy脚本,并尝试在JSR223后处理器上调用该脚本。我还尝试将脚本的各个部分分块,并将值放入csv中,这样,如果有任何更改,我就可以更新csv值

我确信有一种更干净/更好的方法可以做到这一点,但我仍在学习中,因此我不确定哪种方法更易于维护。这是JSR223后处理器。每个http请求唯一改变的位是“//测试结果”部分

我看到两种选择:

  • 我建议改用。首先,这样您的脚本中只有一个侦听器,这解决了您最初的问题,但一般来说,它是写入文件的更好选择,因为侦听器只有一个实例用于所有正在运行的线程,所以您在写入文件时不会创建争用条件

  • 如果您更愿意使用后处理器,那么可以将其置于更高的级别(而不是任何特定的采样器之下),这将导致它在相同范围内或更低范围内的每个请求之后运行

    例如,像

    Thread Group
        Post-processor
        Sampler 1
        ...
        Sampler N
    
    将导致
    后处理器
    在每个
    采样器1
    ..
    采样器N

在这两种情况下,您可能需要检查正在处理的采样器,并跳过不想添加到报告中的采样器(最简单的方法是为排除的采样器制定一些名称约定)

我看到两个选项:

  • 我建议改用。首先,这样您的脚本中只有一个侦听器,这解决了您最初的问题,但一般来说,它是写入文件的更好选择,因为侦听器只有一个实例用于所有正在运行的线程,所以您在写入文件时不会创建争用条件

  • 如果您更愿意使用后处理器,那么可以将其置于更高的级别(而不是任何特定的采样器之下),这将导致它在相同范围内或更低范围内的每个请求之后运行

    例如,像

    Thread Group
        Post-processor
        Sampler 1
        ...
        Sampler N
    
    将导致
    后处理器
    在每个
    采样器1
    ..
    采样器N


在这两种情况下,您可能需要检查正在处理的采样器,并跳过不想添加到报告中的采样器(最简单的方法是为排除的采样器想出一些名称约定)

我也面临同样的挑战。在我的例子中,我需要检查REST服务的JSON响应是否正确。我用下面的方法解决了它

我在脚本根目录下创建了一个JSR223预处理器。它包含处理JSON解析和断言的自定义类

import groovy.json.JsonSlurper
导入org.apache.jmeter.assertions.AssertionResult
类CustomAssert{
def parseResponse(json){
def jsonSlurper=新的jsonSlurper()
返回jsonSlurper.parseText(json)
}
def assertResult(断言结果、预期结果、实际结果){
如果(!expectedResult.equals(actualResult)){
assertionResult.setFailure(true);
assertionResult.setFailureMessage(“预期为${expectedResult},但为${actualResult}”);
}
}
}
vars.putObject('customAssert',new customAssert())
请注意最后一行:

vars.putObject('customAssert',new customAssert())
我将我的
CustomAssert
的一个实例放入
vars

然后在我的HTTP请求下,我添加了JSR233断言

defa=vars.getObject('customAssert'))
def response=a.parseResponse(prev.getResponseDataAsString())
a、 assertResult(AssertionResult'DRY',response.SensorResultTholderUI[0]。result.toString()
a、 assertResult(AssertionResult'DRY',response.SensorResultTholderUI[1]。result.toString()
a、 assertResult(AssertionResult'DRY',response.SensorResultTholderUI[2]。result.toString()
它基本上从
vars
检索
CustomAssert
的实例并调用其方法。我可以放入任意数量的JSR233断言。复制的唯一代码是上面的两行:

defa=vars.getObject('customAssert'))
def response=a.parseResponse(prev.getResponseDataAsString())
总而言之:

  • 获取代码的公共部分(不必复制)
  • 把它包装成一个类
  • 将类放入根目录下的JSR233预处理器中,并通过
    vars
  • 将代码的其余部分调整为使用2中定义的类
  • 将该代码放入尽可能多的JSR233断言中,记住检索在3中创建的实例。从
    vars

  • 我也面临同样的挑战。在我的例子中,我需要检查REST服务的JSON响应是否正确。我用下面的方法解决了它

    我在脚本根目录下创建了一个JSR223预处理器。它包含处理JSON解析和断言的自定义类

    import groovy.json.JsonSlurper
    导入org.apache.jmeter.assertions.AssertionResult
    类CustomAssert{
    def parseResponse(json){
    def jsonSlurper=新的jsonSlurper()
    返回jsonSlurper.parseText(json)
    }
    def assertResult(断言结果、预期结果、实际结果){
    如果(!expectedResult.equals(actualResult)){
    assertionResult.setFailure(true);
    assertionResult.setFailureMessage(“应为${expectedResult}),但为
    
    import com.aventstack.extentreports.*;
    import com.aventstack.extentreports.reporter.*;
    import com.aventstack.extentreports.markuputils.*;
    
    ExtentHtmlReporter htmlReporter;
    ExtentReports extent;
    ExtentTest test;
    
    // create the HtmlReporter
    htmlReporter = new ExtentHtmlReporter("C:/AUTO_Results/Results_${testApp}_${reportDate}_${currentTime}_${testenv}.html");
    
    //configure report
    htmlReporter.config().setCreateOfflineReport(true);
    htmlReporter.config().setChartVisibilityOnOpen(true);
    htmlReporter.config().setDocumentTitle("${testApp} Results");
    htmlReporter.config().setEncoding("utf-8");
    htmlReporter.config().setReportName("${testApp} Results ${reportDate}_${currentTime}_${testenv}");
    htmlReporter.setAppendExisting(true);
    
    // create ExtentReports
    extent = new ExtentReports();
    
    // attach reporter to ExtentReports
    extent.attachReporter(htmlReporter);
    extent.setReportUsesManualConfiguration(true); 
    
    // Show Env section and set data on dashboard
    extent.setSystemInfo("Tool","JMeter");
    extent.setSystemInfo("Test Env","${testenv}");
    extent.setSystemInfo("Test Date","${reportDate}");
    extent.setSystemInfo("Test Time","${currentTime}");
    
    //stringify test info
    String threadName = sampler.getThreadName();
    String samplerName = sampler.getName();
    String requestData = props.get("propRequestData");
    String respCode = props.get("propRespCode");
    String respMessage = props.get("propRespMessage");
    String responseData = props.get("propResponse");
    
    
    // create test
    test = extent.createTest(threadName+" - "+samplerName);
    //test.assignCategory("API Testing");
    
    // analyze sampler result
    if (vars.get("JMeterThread.last_sample_ok") == "false") {
       log.error("FAILED: "+samplerName);
       print("FAILED: "+samplerName);
       test.fail(MarkupHelper.createLabel("FAILED:  "+sampler.getName(),ExtentColor.RED));
    
    } else if (vars.get("JMeterThread.last_sample_ok") == "true") {
        if(responseData.contains("@error")) {
            log.info("FAILED: "+sampler.getName());
             print("FAILED: "+sampler.getName());
            test.fail(MarkupHelper.createLabel("FAILED:   "+sampler.getName(),ExtentColor.RED));
    
        } else if (responseData.contains("{")) {
                log.info("Passed: "+sampler.getName());
            print("Passed: "+sampler.getName());
                test.pass(MarkupHelper.createLabel("Passed:   "+sampler.getName(),ExtentColor.GREEN));
        }
    
    } else {
        log.error("Something is really wonky");
        print("Something is really wonky");
        test.fatal("Something is really wonky");
    }
    
    //info messages
        test.info("RequestData:   "+requestData);
        test.info("Response Code and Message:    "+respCode+"   "+respMessage);
        test.info("ResponseData:    "+responseData);
    
    
    
    //playing around
    //markupify json into code blocks
    //Markup m = MarkupHelper.createCodeBlock(requestData);
    //test.info(MarkupHelper.createModal("Modal text"));
    //Markup mCard = MarkupHelper.createCard(requestData, ExtentColor.CYAN);
    //   test.info("Request  "+m);
    //  test.info(mCard);
    //     test.info("Response Data:     "+MarkupHelper.createCodeBlock(props.get("propResponse")));
    //   test.info("ASSERTION MESSAGE:     "+props.get("propAssertion"));
    
    
    // end the reporting and save the file
    extent.flush();
    
    //request data
    String requestData = new String(prev.SamplerData);
    //String requestData = new String(requestData);
    props.put("propRequestData", requestData);
    //response data
    String respData = new String(prev.ResponseData);
    //String respData = new String(prev.getResponseDataAsString());
    props.put("propResponse", respData);
    //response code
    String respCode = new String(prev.ResponseCode);
    props.put("propRespCode",respCode);
    //response message
    String respMessage = new String(prev.ResponseMessage);
    props.put("propRespMessage",respMessage);