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

如何在JMeter中获取Excel/CSV有效行数并设置为线程数

实现JMeter自动根据CSV/Excel有效行数设置线程数

嗨,这个需求很实用,我来一步步教你搞定:

核心思路是在测试正式启动前统计文件的有效行数,把结果存为JMeter全局属性,再让线程组引用这个属性作为线程数。因为JMeter的线程组参数是初始化阶段确定的,所以必须在主线程组启动前完成行数统计,用SetUp Thread Group来做这件事最合适。


步骤1:添加SetUp线程组做前置统计

  1. 右键点击你的测试计划 → Add → Threads (Users) → setUp Thread Group
  2. 把这个线程组的Number of Threads (users)设为1,毕竟只需要执行一次统计操作

步骤2:用JSR223 Sampler编写统计逻辑

在SetUp Thread Group里添加JSR223 Sampler:

  • 右键SetUp Thread Group → Add → Sampler → JSR223 Sampler
  • 选择Language为groovy(Groovy在JMeter中性能最优,优先推荐)

针对CSV文件的代码示例

如果数据源是CSV,需要跳过表头、排除空行,用这段代码:

// 替换为你的CSV文件路径,推荐用相对路径,比如${__P(user.dir)}/data/test.csv
def csvFile = new File("path/to/your/file.csv")
def validRowCount = 0
def skipHeader = true // 有表头就设为true,没有则设为false

csvFile.eachLine { line, lineNumber ->
    // 跳过表头行
    if (skipHeader && lineNumber == 1) {
        return
    }
    // 跳过空行(只包含空白字符的行)
    if (!line.trim().isEmpty()) {
        validRowCount++
    }
}

// 将统计结果存入JMeter全局属性,供后续线程组使用
props.put("VALID_THREAD_COUNT", validRowCount.toString())
log.info("CSV有效行数统计完成: " + validRowCount)

针对Excel文件的代码示例

如果是Excel文件(.xlsx/.xls),需要用Apache POI库读取,Groovy可以自动处理依赖下载:

// 自动引入POI依赖,首次运行会下载,之后无需重复下载
@Grab('org.apache.poi:poi:5.2.3')
@Grab('org.apache.poi:poi-ooxml:5.2.3')
import org.apache.poi.ss.usermodel.*

// 替换为你的Excel文件路径
def excelFile = new File("path/to/your/file.xlsx")
def workbook = WorkbookFactory.create(excelFile)
def sheet = workbook.getSheetAt(0) // 读取第一个工作表
def validRowCount = 0
def skipHeader = true // 是否跳过表头行

for (int rowNum = sheet.getFirstRowNum(); rowNum <= sheet.getLastRowNum(); rowNum++) {
    Row row = sheet.getRow(rowNum)
    if (row == null) continue // 跳过空行对象
    
    // 跳过表头行
    if (skipHeader && rowNum == sheet.getFirstRowNum()) {
        continue
    }
    
    // 判断行是否有有效数据(这里以第一列非空为例,可根据你的需求调整)
    Cell firstCell = row.getCell(0)
    if (firstCell != null && firstCell.toString().trim() != "") {
        validRowCount++
    }
}

// 存入全局属性
props.put("VALID_THREAD_COUNT", validRowCount.toString())
log.info("Excel有效行数统计完成: " + validRowCount)
workbook.close() // 关闭工作簿释放资源

步骤3:让主线程组引用统计结果

找到你的主线程组,把Number of Threads (users)字段的值改为:

${__P(VALID_THREAD_COUNT,1)}
  • VALID_THREAD_COUNT是我们刚才存入的属性名
  • 1是默认值,如果统计失败的话,线程组会用1个线程运行,避免测试直接报错

注意事项

  • 文件路径尽量用相对路径,比如结合JMeter的user.dir变量(代表JMeter的运行目录),这样在不同环境下更通用
  • 如果是分布式测试,要确保所有测试节点都能访问到目标CSV/Excel文件,或者把文件同步到每个节点的对应路径
  • 统计逻辑可以根据你的实际需求调整:比如是否需要跳过特定行、如何判断“有效行”(比如某几列非空才算有效)

内容的提问来源于stack exchange,提问作者paul baboo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:17:47