簡體   English   中英

JMeter JSR223 ExtentReports偵聽器需要改進

[英]JMeter JSR223 Listener for ExtentReports needs improvement

我編寫了一個新的JSR223偵聽器,將測試結果寫到一個rangereports html報告中。 這很好,但可以改進。 我只是不確定改善它的最佳方法。 我看到的一個具體問題是儀表板的“花費的時間”值。 它顯示了最后一個采樣器運行的開始/結束時間。 應該將第一個采樣器的時間顯示為開始時間,將結束采樣器的時間顯示為結束時間,並應從這兩個日期時間中獲取“花費的時間”值。 您能否看一下我的偵聽器腳本並分享您可能有的任何建議?

測試計划設置:在線程組中,我有HTTP Request采樣器登錄,執行一個操作然后注銷。 在線程組的根目錄下,我在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.2tentreports-pro-3.0.5.jar

這是儀表板的屏幕截圖 在此處輸入圖片說明

您的結束時間很好(結束采樣器),您需要的是第一個采樣器的開始

我認為您可以使用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() );

在此處輸入圖片說明

在測試期間,我得到了以下解決方法。 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"); 

它雖然不漂亮,但是卻給了我所需的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM