jmeter-如何使groovy脚本更易于为extentreports维护
下面是帮助我为jmeter构建extentreport的脚本。它是一个JSR223后处理器元素。但是,它工作得很好,问题是我在脚本中的每个HTTP请求之后都复制了它。我有几个包含100个HTTP请求的脚本,它们基本上需要相同的后处理器groovy脚本的副本。这=很难维护 我曾尝试将公共部分拆分为外部groovy脚本,并尝试在JSR223后处理器上调用该脚本。我还尝试将脚本的各个部分分块,并将值放入csv中,这样,如果有任何更改,我就可以更新csv值 我确信有一种更干净/更好的方法可以做到这一点,但我仍在学习中,因此我不确定哪种方法更易于维护。这是JSR223后处理器。每个http请求唯一改变的位是“//测试结果”部分 我看到两种选择:jmeter-如何使groovy脚本更易于为extentreports维护,jmeter,Jmeter,下面是帮助我为jmeter构建extentreport的脚本。它是一个JSR223后处理器元素。但是,它工作得很好,问题是我在脚本中的每个HTTP请求之后都复制了它。我有几个包含100个HTTP请求的脚本,它们基本上需要相同的后处理器groovy脚本的副本。这=很难维护 我曾尝试将公共部分拆分为外部groovy脚本,并尝试在JSR223后处理器上调用该脚本。我还尝试将脚本的各个部分分块,并将值放入csv中,这样,如果有任何更改,我就可以更新csv值 我确信有一种更干净/更好的方法可以做到这一点,
- 我建议改用。首先,这样您的脚本中只有一个侦听器,这解决了您最初的问题,但一般来说,它是写入文件的更好选择,因为侦听器只有一个实例用于所有正在运行的线程,所以您在写入文件时不会创建争用条件
- 如果您更愿意使用后处理器,那么可以将其置于更高的级别(而不是任何特定的采样器之下),这将导致它在相同范围内或更低范围内的每个请求之后运行
例如,像
将导致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())
总而言之:
vars
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);