JMeter多次运行测试时,能否从CSV文件上次停止处继续读取?
关于JMeter重复运行CSV是否续读的问题
嘿,刚接触JMeter碰到这个需求太正常了,先给你直接划重点:默认情况下,JMeter每次重新运行测试时,都会从头开始读取CSV文件——不会自动记住上次读到第300行,下次就从301行接着读。
那要实现续读的话,得手动保存上次的读取位置,下次运行时把这个位置作为CSV的起始偏移量,具体可以这么做:
方法一:用JSR223元件+本地文件记录位置(单线程首选)
这是最常用的原生实现方式,不需要额外插件:
步骤1:准备记录位置的文件
先在JMeter的bin目录(或者你指定的任意路径)创建一个空文本文件,比如last_csv_position.txt。第一次运行前,文件里可以写0(因为JMeter的行偏移是从0计数的,0就代表从第1行开始读)。
步骤2:添加JSR223 PreProcessor读取上次位置
在你的测试计划最开头(比如线程组的第一个元件)添加一个JSR223 PreProcessor,写入以下代码:
// 定义存储位置的文件路径,可根据实际修改 def positionFile = new File("last_csv_position.txt") def startOffset = 0 // 如果文件存在,读取里面的数值 if (positionFile.exists()) { startOffset = positionFile.text.trim().toInteger() } // 将偏移量存入JMeter变量,供CSV配置使用 vars.put("START_OFFSET", startOffset.toString())
步骤3:配置CSV Data Set Config
找到你的CSV Data Set Config,切换到Advanced选项卡:
- 勾选
Start line offset - 在输入框里填写
${START_OFFSET},这样每次运行就会从记录的位置开始读
步骤4:添加JSR223 PostProcessor保存结束位置
在测试计划的最后(比如线程组的最后一个元件)添加JSR223 PostProcessor,写入以下代码:
// 单线程场景下,直接获取本次运行的迭代次数作为读取的总行数 def totalRowsRead = vars.getIteration() // 读取上次的起始偏移量 def startOffset = vars.get("START_OFFSET").toInteger() // 计算新的结束位置 def newPosition = startOffset + totalRowsRead // 写入文件,覆盖旧值 def positionFile = new File("last_csv_position.txt") positionFile.write(newPosition.toString())
注意:如果是多线程场景,上面的单线程计数逻辑会不准确,需要用线程安全的方式(比如文件锁或者JMeter全局属性)来统计总读取行数,避免并发写入导致数据错误。
方法二:使用JMeter属性持久化(多线程场景)
如果是多线程运行,用本地文件容易出现并发问题,这时候可以用JMeter的全局属性来存储位置,并且持久化到属性文件:
- 在测试开始时,读取
jmeter.properties里自定义的csv.start.offset属性,默认值设为0 - 运行时,通过线程安全的方式累加总读取行数
- 测试结束后,把新的位置写入属性文件,下次运行直接读取
核心代码示例:
// PreProcessor里读取属性 def startOffset = props.get("csv.start.offset", 0) as Integer vars.put("START_OFFSET", startOffset.toString()) // PostProcessor里保存属性 def totalRows = ctx.getThreadGroup().getSamplerController().getIterationCount() // 多线程下的总迭代数 props.put("csv.start.offset", startOffset + totalRows) // 持久化到属性文件 props.save()
注意事项
- 如果你需要重置读取位置,只要把
last_csv_position.txt里的数值改回0,或者删除文件即可;用属性方式的话,修改jmeter.properties里的csv.start.offset为0就行 - 如果CSV文件有修改(比如新增、删除行),记得同步调整记录的位置,否则可能读到错误的数据
- 多线程场景下,一定要确保计数逻辑的线程安全性,避免多个线程同时写入导致位置记录混乱
内容的提问来源于stack exchange,提问作者Normal one
相关产品推荐
相关产品推荐

