如何在JMeter中获取Excel/CSV有效行数并设置为线程数
实现JMeter自动根据CSV/Excel有效行数设置线程数
嗨,这个需求很实用,我来一步步教你搞定:
核心思路是在测试正式启动前统计文件的有效行数,把结果存为JMeter全局属性,再让线程组引用这个属性作为线程数。因为JMeter的线程组参数是初始化阶段确定的,所以必须在主线程组启动前完成行数统计,用SetUp Thread Group来做这件事最合适。
步骤1:添加SetUp线程组做前置统计
- 右键点击你的测试计划 →
Add→Threads (Users)→setUp Thread Group - 把这个线程组的
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
相关产品推荐
相关产品推荐

