JMeter并不真正支持即时更改侦听器测试元素的文件名,因为侦听器会 在 任何变量 之前 初始化。推荐的方式是:
- 在JMeter之外 获取Terradata会话ID ,即使用BTEQ或同等功能
通过-J命令行参数将值传递给JMeter,例如:
jmeter -Jsession_id_1=1234 -n -t /path/to/testplan.jmx
在需要时通过__P()函数引用会话ID值
${__P(session_id_1,)}
如果出于任何原因仍然需要在JMeter测试脚本中执行此操作,则可以使用以下解决方案,但是请记住以下几点:
- 您需要从“摘要报告”侦听器的“文件名”输入中删除 所有内容 。只是让它空白。
- 确保下面的代码仅执行 一次 且只有一个线程。
所以:
- 添加JSR223 PostProcessor中的一个子
query1
采样和 之后 的Session PreProcessor
- 选择
groovy
在“语言”下拉列表 - 将以下代码放入JSR223 PostProcessor“脚本”区域:
import org.apache.jmeter.engine.StandardJMeterEngine; import org.apache.jmeter.reporters.ResultCollector; import org.apache.jorphan.collections.HashTree; import org.apache.jorphan.collections.SearchByClass; import java.lang.reflect.Field; import java.lang.reflect.Method; StandardJMeterEngine engine = ctx.getEngine(); Field test = engine.getClass().getDeclaredField("test"); test.setAccessible(true); HashTree testPlanTree = (HashTree) test.get(engine); SearchByClass summaryReportsSearch = new SearchByClass(ResultCollector.class); testPlanTree.traverse(summaryReportsSearch); Collection summaryReports = summaryReportsSearch.getSearchResults(); ResultCollector summaryReport = summaryReports.iterator().next(); Class [] fileNameParam = new Class[1]; fileNameParam[0] = String.class; Method setFileName = summaryReport.getClass().getDeclaredMethod("setFilenameProperty", fileNameParam); setFileName.setAccessible(true); setFileName.invoke(summaryReport, new String(vars.get("session_id_1"))); Method init = summaryReport.getClass().getDeclaredMethod("initializeFileOutput"); init.setAccessible(true); init.invoke(summaryReport);如果您使用的是JMeter
3.0,则将groovy捆绑在一起。对于以前的JMeter版本,您将需要手动安装groovy语言支持,请查看Beanshell,JSR223和Java
JMeter脚本:您一直在等待的性能下降!有关groovy引擎安装说明和脚本最佳实践的文章。



