我创建了一个测试计划并添加了设置线程组,其中使用不同的 HTTP 请求和相应的 JSR223 断言验证了一些先决条件。失败断言相关数据,即采样器名称和期望值放置在属性中,名称以 failedSampler_ 开头。下面是代码。
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.assertions.AssertionResult;
// JSR223 Assertion (Groovy)
String expectedValue = "test"; // Replace with your expected value
String jsonString = prev.getResponseDataAsString();
def jsonSlurper = new groovy.json.JsonSlurper()
def jsonObject = jsonSlurper.parseText(jsonString)
log.info(jsonObject.toString());
boolean matchFound = false;
// Iterate over the hits array and get the ab_name from each _src document
jsonObject.data.record.hits.each { hit ->
String actualValue = hit._name;
log.info("Actual value is: " + actualValue);
if (expectedValue.equals(actualValue)) {
matchFound = true;
}
}
if (!matchFound) {
String sampleName = SampleResult.getSampleLabel();
String failureMessage = "Assertion failed for sample: " + sampleName +
"\nExpected value: " + expectedValue +
"\nNo matching actual value found";
props.put("failedSampler_" + sampleName, expectedValue);
log.error(failureMessage);
// Create a new AssertionResult
AssertionResult result = new AssertionResult("${expectedValue} Not Found");
result.setFailure(true);
result.setFailureMessage(failureMessage);
prev.addAssertionResult(result);
prev.setSuccessful(false);
}
为了验证清理部分,有一个拆解线程组,其中 JSR223 后处理器配置为删除 props 数据。但它并没有清除道具数据,并且在下次运行时道具也会显示上次运行的数据。 TearDown 线程组下 JSR223 后处理器的代码如下。
import org.apache.jmeter.reporters.ResultCollector
import org.apache.jorphan.collections.SearchByClass
def engine = engine = ctx.getEngine()
def test = engine.getClass().getDeclaredField('test')
test.setAccessible(true)
def testPlanTree = test.get(engine)
SearchByClass<ResultCollector> listenerSearch = new SearchByClass<>(ResultCollector.class)
testPlanTree.traverse(listenerSearch)
Collection<ResultCollector> listeners = listenerSearch.getSearchResults()
listeners.each { listener ->
def files = listener.files
files.each { file ->
file.value.pw.close()
}
}
log.info('Before clear:' +props.size())
props.clear()
log.info('After clear:' +props.size())
注意: 目前setup 和tearDown 线程组之间没有定义普通线程组。需要实现的目的是,所有失败断言的期望值应保存在带有采样器名称的 prop 中,并且可以在正常线程组中访问,以对在设置线程组中验证的丢失数据执行某些操作。
测试计划如下图
JSR223 后处理器仅在采样器的上下文中执行。如果线程组中没有 Sampler - 它不会运行。
您需要将其转换为 JSR223 Sampler 或将另一个 Sampler 添加到拆解线程组,例如 Debug Sampler 或 Dummy Sampler 或其他