0

我写了一个新的 JSR223 Listener 来将测试结果写到一个 extentreports html 报告中。这工作得很好,但可以改进。我只是不确定改进它的最佳方法。我看到的一个具体问题是仪表板的 Time Taken 值。它显示了最后一次采样器运行的开始/结束时间。它应该将第一个采样器的时间显示为开始时间,将结束采样器的时间显示为结束时间,并且应该从这两个日期时间中获取 Time Taken 值。你能看看我的听众脚本并分享你可能有的任何建议吗?

测试计划设置:在线程组中,我有登录、执行一项操作并注销的 HTTP 请求采样器。在线程组的根目录下,我在 BeanShell 断言中有这段代码,其中包含以下代码:

//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);

在我的测试计划的根部,我有这个 JSR223 监听器代码:

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();

您在 JSR223 侦听器中看到的 ${variables} 是在用户定义的变量元素中定义的。我正在使用:我的 lib 文件夹中的 jmeter-3.2 extentreports-pro-3.0.5.jar

这是仪表板的屏幕截图 在此处输入图像描述

4

2 回答 2

0

您的结束时间很好(结束采样器),您需要的是第一个采样器的开始

我认为您可以使用START 预定义属性

START 属性也被复制到具有相同名称的变量中。

  • START.MS - JMeter 开始时间(以毫秒为单位)
  • START.YMD - JMeter 开始时间为 yyyyMMdd
  • START.HMS - JMeter 开始时间为 HHmmss
  • TESTSTART.MS - 测试开始时间,以毫秒为单位

将 JSR223 PostProcessor 添加到第一个采样器并将开始时间添加到变量的另一个选项:

log.info("start time is " + prev.getStartTime() );
vars.put("startTimeFirstSample", "" + prev.getStartTime() );
于 2018-01-10T07:50:20.047 回答
0

在此处输入图像描述

在测试期间,我最终得到了以下解决方法。1. 在一个设置线程组中,我添加了一个带有以下代码的 JSR223 采样器:

log.info("--------------Initialize");
import java.time.Duration;
import java.time.Instant;

Instant myStart = Instant.now();
props.put("varmyStart",myStart);
log.info("Test Start time: ----  "+props.get("varmyStart"));

//response
props.put("propResponse","Test Start time { "+props.get("varmyStart")+" }");
SampleResult.setResponseData(props.get("propResponse"));
  1. 在拆解线程组中,我使用以下代码添加了一个 JSR223 采样器:

    log.info("---------------End Test JSR223Sampler");
    //props.put("varEndTest","Yes"); 
    import java.time.Duration;
    import java.time.Instant;
    Instant myEnd = Instant.now();
    props.put("varmyEnd",myEnd);
    log.info("varmyEnd----  "+props.get("varmyEnd"));
    Duration timeElapsed = Duration.between(props.get("varmyStart"), 
    props.get("varmyEnd"));
    //millis
    props.put("varTimeTakenMS",timeElapsed.toMillis().toString());
    log.info("prop varTimeTaken(MS): --"+props.get("varTimeTakenMS"));
    //seconds
    props.put("varTimeTakenSEC",timeElapsed.getSeconds());
    log.info("prop varTimeTaken(SEC): --"+props.get("varTimeTakenSEC"));
    //minutes
    props.put("varTimeTakenMINS",timeElapsed.toMinutes().toString());
    log.info("prop varTimeTaken(MINS): --"+props.get("varTimeTakenMINS"));
    //response
    props.put("propResponse","Test End time { "+props.get("varmyEnd")+" }.  
    Test Duration: "+props.get("varTimeTakenMINS")+" Minutes");
    SampleResult.setResponseData(props.get("propResponse"));
    
  2. 在侦听器代码中,在 // Show Env 部分并在仪表板上设置数据下,我添加了以下几行:

    //extent.setSystemInfo("Actual Test Duration(ms)",props.get("varTimeTakenMS")+" milliseconds");
    extent.setSystemInfo("Actual Test Duration(seconds)",props.get("varTimeTakenSEC")+" seconds");
    extent.setSystemInfo("Actual Test Duration(mins)",props.get("varTimeTakenMINS")+" minutes");
    

它不漂亮,但它给了我我需要的东西。

于 2018-01-10T14:22:07.647 回答