jmeter
jmeter copied to clipboard
CSVDataSet.getFilename() returns null while filename exists in propMap
Expected behavior
When parsing a .jmx file using JMeter's SaveService.loadTree, the getFilename() method of org.apache.jmeter.config.CSVDataSet returns null despite the fact that the filename property is correctly set and visible within the internal propMap, the csvdataset file is: data.csv java code:
private List<String> findDatasetFiles(HashTree hashTree) {
List<String> datasetFiles = new ArrayList<>();
if (hashTree == null) {
return datasetFiles;
}
for (Object item : hashTree.keySet()) {
if (item instanceof org.apache.jmeter.config.CSVDataSet csvDataSet) {
String filename = csvDataSet.getFilename();
if (StringUtils.isNotBlank(filename)) {
datasetFiles.add(filename);
}
}
// 递归搜索子树
HashTree subTree = hashTree.get(item);
if (subTree != null) {
datasetFiles.addAll(findDatasetFiles(subTree));
}
}
return datasetFiles;
}
jxm:
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.3">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="测试计划">
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
<collectionProp name="Arguments.arguments"/>
</elementProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="测试线程组">
<intProp name="ThreadGroup.num_threads">1</intProp>
<intProp name="ThreadGroup.ramp_time">1</intProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器">
<stringProp name="LoopController.loops">1</stringProp>
<boolProp name="LoopController.continue_forever">false</boolProp>
</elementProp>
</ThreadGroup>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="CSV 数据文件设置">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">UTF-8</stringProp>
<stringProp name="filename">data.csv</stringProp>
<boolProp name="ignoreFirstLine">false</boolProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">shareMode.all</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames"></stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
Actual behavior
I got a empty list, but this code could get filename:
private List<String> findDatasetFiles(HashTree hashTree) {
List<String> datasetFiles = new ArrayList<>();
if (hashTree == null) {
return datasetFiles;
}
for (Object item : hashTree.keySet()) {
log.debug("Found config element: {}", item.getClass().getName());
if (item instanceof org.apache.jmeter.config.CSVDataSet csvDataSet) {
JMeterProperty filenameProp = csvDataSet.getPropertyOrNull("filename");
if (filenameProp != null) {
log.debug("Found CSVDataSet: {}", filenameProp.getStringValue());
datasetFiles.add(filenameProp.getStringValue());
}
}
// 递归查找子树
HashTree subTree = hashTree.get(item);
if (subTree != null) {
datasetFiles.addAll(findDatasetFiles(subTree));
}
}
return datasetFiles;
}
Steps to reproduce the problem
- Create a simple JMeter test plan containing at least one ThreadGroup with a CSVDataSet.
- Set a valid filename for the CSVDataSet.
- Save the test plan as a .jmx file.
- Use the following code snippet to load and parse the .jmx file:
SaveService.loadProperties();
HashTree hashTree = SaveService.loadTree(new File(savedFileName));
findDatasetFiles(HashTree hashTree);
JMeter Version
5.6.3
Java Version
jdk21
OS Version
macOS Sequola 15.4.1