You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的全局属性来存储位置,并且持久化到属性文件:

  1. 在测试开始时,读取jmeter.properties里自定义的csv.start.offset属性,默认值设为0
  2. 运行时,通过线程安全的方式累加总读取行数
  3. 测试结束后,把新的位置写入属性文件,下次运行直接读取

核心代码示例:

// 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:49:47