Jmeter读取CSV文件返回<EOF>错误,写入后调用变量失败如何解决
问题解决方法
你遇到的报错根本原因是JMeter的CSV Data Set Config组件的加载时机为测试计划启动阶段,运行过程中对CSV文件的更新不会被CSV Config重新读取,所以你运行时写入的税率数据,CSV Config感知不到,读的时候就会触发EOF错误。
以下是按优先级排序的解决方案:
最优方案:避免用临时文件传递变量,直接使用JMeter属性跨处理器传值
不需要依赖临时CSV文件传递变量,直接在第一个JSR223 PostProcessor中将税率存入JMeter全局属性,第二个处理器直接读取即可,完全规避文件读写时序问题:
- 在写入税率的JSR223中添加属性存储代码:
temp_tax = new FileOutputStream("temp_tax_rate.csv", true); file = new PrintStream(temp_tax); String tax_rate = source[parent]["tax_rate"] file.println(tax_rate+","+tax_rate+","+tax_rate) // 新增:将税率存入全局属性,后续处理器直接读取 props.put("dynamic_tax_rate", tax_rate) file.close(); temp_tax.close();
- 在描述写入的JSR223中直接读取属性值使用:
// 直接读取属性获取最新税率,不需要依赖CSV Config def tax_rate = props.get("dynamic_tax_rate") // 后续使用tax_rate做运算即可
注意:你当前描述写入代码存在语法错误,参数名中不能使用减号-,Groovy会将其识别为运算符,需要全部替换为下划线_,比如final_tax-1改为final_tax_1。
如果你必须保留CSV文件读取逻辑
如果你确实需要从CSV文件读取数据,不要使用CSV Data Set Config组件,直接在第二个JSR223 PostProcessor中写代码实时读取最新的CSV文件内容:
// 读取最新的税率文件,取最后一行的税率数据 def taxFile = new File("temp_tax_rate.csv") if(taxFile.exists() && taxFile.length() > 0) { def lastLine = taxFile.readLines().last() def taxRates = lastLine.split(",") def tax_rate1 = taxRates[0] def tax_rate2 = taxRates[1] def tax_rate3 = taxRates[2] // 后续使用上述变量运算 }
同时需要做好执行顺序控制:
- 单线程场景:确保写税率的JSR223 PostProcessor的执行顺序严格在描述写入处理器之前
- 多线程场景:添加临界区控制器包裹两个后处理器,避免多线程同时读写文件产生冲突
内容的提问来源于stack exchange,提问作者maxim
相关产品推荐
相关产品推荐

