JMeter中如何获取事务控制器生成的父样本?SampleResult.getParent()返回空值
要解决这个问题,得先搞清楚核心原因:事务控制器的父样本是在所有子样本执行完成之后才生成的,所以当你在子取样器的代码里调用SampleResult.getParent()时,这个父样本还没被创建,自然返回null。
下面给你几个可行的解决办法:
1. 用JSR223监听器忽略父样本
添加一个JSR223监听器到测试计划里,写一段Groovy代码识别事务控制器生成的父样本,然后标记为忽略:
// 替换成你要忽略的事务控制器名称,不想指定名称就删掉这个变量和下面的判断 def targetControllerName = "你的事务控制器名称" // 判断当前样本是否是事务控制器的父样本 if (SampleResult.getClass().name == "org.apache.jmeter.control.TransactionController$TransactionSampleResult") { // 可选:只忽略指定名称的事务控制器 if (SampleResult.getSampleLabel() == targetControllerName) { SampleResult.setIgnore(true) } // 要是想忽略所有事务控制器的父样本,直接用这行就行: // SampleResult.setIgnore(true) }
监听器会在每个样本结果生成后触发,包括事务控制器的父样本,这时候调用setIgnore()就能把它排除出所有报告了。
2. 直接关闭父样本生成(最简单)
如果你本来就不需要事务控制器生成父样本,直接取消勾选它的「生成父样本」复选框就行。这样既不会有父样本,你只需要在JSR223取样器里执行SampleResult.setIgnore()忽略子样本,就完全符合需求了。
3. 用JSR223后置处理器处理特定场景
如果需要在子样本执行后马上处理父样本,可以给事务控制器加一个JSR223后置处理器,通过JMeter上下文获取线程的样本列表并找到目标父样本:
def sampleResults = ctx.getThread().getSampleResults() sampleResults.each { result -> if (result.getClass().name == "org.apache.jmeter.control.TransactionController$TransactionSampleResult" && result.getSampleLabel() == "你的事务控制器名称") { result.setIgnore(true) } }
后置处理器会在子样本执行完毕、父样本生成之后运行,所以能正常找到并修改父样本。
内容的提问来源于stack exchange,提问作者JustNatural
相关产品推荐
相关产品推荐

