在我的测试计划中,我有JDBC PreProcessor,它捕获了我要保存到变量中的单个值。然后,我想将此变量作为摘要报告的文件名的一部分重用。
我不知道创建该变量是否为时已晚,因为我总是得到字面值logs/${session_id_1}-summary.cvs
而不是logs/1234-summary.cvs
我也不确定是否需要使用resultVariable
或variableNames
存储值。到目前为止,我没有运气尝试了不同的组合
然后我也不清楚应该在哪一点上将预处理器连接到第一个采样器?
这是我最新的(简短)JMX版本:
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.9" jmeter="3.0 r1743807">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="TPCDS Benchmark Test Plan TPG Flavor" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">true</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="JDBC Users" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">1</stringProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">1</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<longProp name="ThreadGroup.start_time">1370729701000</longProp>
<longProp name="ThreadGroup.end_time">1370729701000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
</ThreadGroup>
<hashTree>
<JDBCDataSource guiclass="TestBeanGUI" testclass="JDBCDataSource" testname="JDBC_Configuration_tpcds" enabled="true">
<boolProp name="autocommit">true</boolProp>
<stringProp name="checkQuery">Select 1</stringProp>
<stringProp name="connectionAge">5000</stringProp>
<stringProp name="dataSource">jdbcConfig_tpcds</stringProp>
<stringProp name="dbUrl">jdbc:teradata://${TDPID}/database=tpcds</stringProp>
<stringProp name="driver">com.teradata.jdbc.TeraDriver</stringProp>
<boolProp name="keepAlive">true</boolProp>
<stringProp name="password">tpcds</stringProp>
<stringProp name="poolMax">10</stringProp>
<stringProp name="timeout">10000</stringProp>
<stringProp name="transactionIsolation">DEFAULT</stringProp>
<stringProp name="trimInterval">60000</stringProp>
<stringProp name="username">tpcds</stringProp>
</JDBCDataSource>
<hashTree/>
<Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="TDPID" elementType="Argument">
<stringProp name="Argument.name">TDPID</stringProp>
<stringProp name="Argument.value">${__P(target_dbs)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DBC_USERNAME" elementType="Argument">
<stringProp name="Argument.name">DBC_USERNAME</stringProp>
<stringProp name="Argument.value">${__P(dbc_username,dbc)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DBC_PASSWORD" elementType="Argument">
<stringProp name="Argument.name">DBC_PASSWORD</stringProp>
<stringProp name="Argument.value">${__P(dbc_password,dbc)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</Arguments>
<hashTree/>
<JDBCSampler guiclass="TestBeanGUI" testclass="JDBCSampler" testname="query1" enabled="true">
<stringProp name="dataSource">jdbcConfig_tpcds</stringProp>
<stringProp name="query">${__FileToString(sql/query1.sql)}</stringProp>
<stringProp name="queryArguments"></stringProp>
<stringProp name="queryArgumentsTypes"></stringProp>
<stringProp name="queryType">Select Statement</stringProp>
<stringProp name="resultVariable"></stringProp>
<stringProp name="variableNames"></stringProp>
<stringProp name="queryTimeout"></stringProp>
<stringProp name="resultSetHandler">Store as String</stringProp>
</JDBCSampler>
<hashTree>
<JDBCPreProcessor guiclass="TestBeanGUI" testclass="JDBCPreProcessor" testname="Session PreProcessor" enabled="true">
<stringProp name="dataSource">jdbcConfig_tpcds</stringProp>
<stringProp name="query">SELECT SESSION as session_id;</stringProp>
<stringProp name="queryArguments"></stringProp>
<stringProp name="queryArgumentsTypes"></stringProp>
<stringProp name="queryTimeout"></stringProp>
<stringProp name="queryType">Select Statement</stringProp>
<stringProp name="resultSetHandler">Store as String</stringProp>
<stringProp name="resultVariable">session_id</stringProp>
<stringProp name="variableNames">session_id</stringProp>
</JDBCPreProcessor>
<hashTree/>
</hashTree>
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>false</assertions>
<subresults>false</subresults>
<responseData>true</responseData>
<samplerData>false</samplerData>
<xml>true</xml>
<fieldNames>true</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<threadCounts>true</threadCounts>
<idleTime>true</idleTime>
<connectTime>true</connectTime>
</value>
</objProp>
<stringProp name="filename">logs/${session_id_1}-summary.xml</stringProp>
</ResultCollector>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
JMeter并不真正支持即时更改侦听器测试元素的文件名,因为侦听器会 在 任何变量 之前 初始化。推荐的方式是:
通过-J命令行参数将值传递给JMeter,例如:
jmeter -Jsession_id_1=1234 -n -t /path/to/testplan.jmx
在需要时通过__P()函数引用会话ID值
${__P(session_id_1,)}
如果出于任何原因您仍然需要在JMeter测试脚本中执行此操作,则可以使用以下解决方案,但是请记住以下几点:
所以:
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引擎安装说明和脚本编写最佳实践的文章。
在我的JMeter测试中,我在其他几个模块中嵌套了一个循环控制器,其中包含一个CSV数据集配置。我的线程组顶部还有一个CSV数据集配置,它从CSV读取文件位置。我要在嵌套的CSV数据集中使用这个文件位置,以便从该位置获取CSV并循环访问该位置。由于在测试开始时一次加载了所有的CSV文件,因此会抛出一个错误。有没有一种方法可以延迟CSV的加载,这样我就可以确保文件路径变量已经设置好了?
问题内容: 有没有办法从一个BeanShell前置/后处理器到另一个BeanShell处理器 (它们在同一个线程组中) 引用变量? 如果我在HTTP Request下的BeanShell PreProcessor中创建一个String变量,那么我可以在同一HTTP Request下的BeanShell PostProcessor中使用或引用该变量。 我尝试通过以下方式访问此变量: + HTTP请求
问题内容: 我有很多Java源代码,需要自定义预处理。我想摆脱它,但是现在不可行,所以我坚持了下来。鉴于我有一个不幸的问题,而这个问题本来不应该存在的,那么我该如何使用Maven解决这个问题呢? (对于整个故事,我要用一个maven替换一个基于python的构建系统,因此请一次进行一次改进。修复非标准源代码会更加困难,并且将在以后发布。) 是否可以使用任何现有的Maven插件在编译时实际更改源文件
汇总报告中最后一行显示的总吞吐量是否正确?我使用的是Jmeter 2.11 有人能帮我一下吗?
预处理器元素在采样器发出请求之前执行,如果预处理器附加到采样器元素,那么它将在该采样器元素运行之前执行。 预处理器元素用于在运行之前修改样本请求的设置,或更新未从响应文本中提取的变量。 以下是JMeter提供的所有预处理器元素的列表: JDBC预处理器 JSR223预处理器 RegEx用户参数 BeanShell预处理器 BSF预处理器 HTML链接解析器 HTTP URL重写修饰符 HTTP用户
我正在使用cucumber扩展报告来生成测试执行的报告。因为我动态地将名称传递给报告文件。我能够传递一个时间戳作为程度报告文件名在@之前的运行类。但是我需要传递场景名称或功能名称以及时间戳。给我一个想法,在运行类中获取场景名称,并将其追加到区域报告名称中。