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

JMeter如何修改测试计划实现从文件夹随机选择文件上传?

问题描述

我搭建了JMeter测试计划,通过Loop Controller读取文件夹文件,但HTTP请求始终选中同一份文件。想修改测试计划实现从文件夹随机选择文件上传至Web应用。

我的测试计划包含以下组件:

  1. jp@gc - Directory Listing Data Source
  2. 带有文件初始化器的Simple Controller,其中BeanShell Sampler代码如下:
String fileFolder = vars.get("FILE_FOLDER");
java.io.File folder = new java.io.File(fileFolder);

String[] files = folder.list();
int fileNum = 1;
for (int i = 1; i <= files.length; i++){
//log.info("fileName: " + files[i-1]);

     if (files[i-1].equals(".DS_Store") == false && 
              files[i-1].equals(".svn") == false ) {

         vars.put("FILE_" + fileNum++, files[i-1]);
    }
}
vars.put("maxFileCount", files.length+"");
  1. Loop Controller包含:
    • Counter:最大值设为${maxFileCount},导出变量名为FILENUM
    • BeanShell PreProcessor代码如下:
String index = vars.get("FILENUM");
log.info("file" + index);

String testFile = vars.get("FILE_" + index);
vars.put("UPLOAD_FILE", testFile);
log.info("uploaded file: " + testFile)
  • HTTP Request:文件路径使用Directory Listing Data Source的目标变量名,参数名与MIME类型正确,单文件上传正常。

请问:

  • jp@gc - Directory Listing Data Source与步骤2中的BeanShell采样器文件初始化器功能是否重复?
  • 需使用其他控制器实现HTTP请求随机选取文件吗?

我使用JMeter 5.5,曾看到用${CURRENT_FILE}的方案但无法实现,我是JMeter新手。


解决方案

1. 组件功能重复问题

是的,这俩功能完全重复。jp@gc - Directory Listing Data Source本身就是用来遍历指定目录文件、生成文件名变量的官方插件;你写的BeanShell Sampler也是在做同样的事——读取目录、过滤无效文件、存储文件名到变量。

推荐保留jp@gc组件,它比手写BeanShell更稳定,还能直接配置过滤规则(比如排除.DS_Store、.svn),不用自己写判断逻辑,更省心。

2. 实现随机选文件的两种方案

方案一:改造现有BeanShell逻辑(无需新增组件)

如果想继续用手写BeanShell的方式,按以下步骤修改:

  1. 修正初始化器里的maxFileCount:原来的files.length是目录下所有文件总数(含被过滤的无效文件),要改成有效文件数:
    // 替换原来的vars.put("maxFileCount", files.length+"");
    vars.put("maxFileCount", (fileNum-1)+"");
    
  2. 删除Loop Controller里的Counter元件,修改BeanShell PreProcessor代码,直接生成随机索引:
    int validFileCount = Integer.parseInt(vars.get("maxFileCount"));
    // 生成1到有效文件数之间的随机整数
    int randomIndex = (int)(Math.random() * validFileCount) + 1;
    String testFile = vars.get("FILE_" + randomIndex);
    vars.put("UPLOAD_FILE", testFile);
    log.info("随机选中文件: " + testFile);
    
  3. Loop Controller的循环次数设为你需要的上传次数即可,每次循环都会随机选一个文件。

方案二:用jp@gc组件+Random Variable(更简单高效)

  1. 删除步骤2的Simple Controller和里面的BeanShell Sampler,只保留jp@gc - Directory Listing Data Source。
  2. 配置jp@gc组件:
    • 填写目标目录路径
    • 「Filename Variables Prefix」设为FILE_(和你之前的变量前缀一致)
    • 「Exclude Patterns」填.DS_Store,.svn,自动过滤无效文件
    • 不需要遍历子目录就别勾选「Recursive?」
  3. 添加Random Variable配置元件:
    • 变量名:RANDOM_FILE_INDEX
    • 最小值:1
    • 最大值:${__jm__Directory Listing Data Source__FILE_COUNT}(这是jp@gc组件自动生成的变量,代表有效文件总数)
    • 格式:0(无需补零)
  4. 修改Loop Controller里的BeanShell PreProcessor:
    String randomIndex = vars.get("RANDOM_FILE_INDEX");
    String testFile = vars.get("FILE_" + randomIndex);
    vars.put("UPLOAD_FILE", testFile);
    log.info("随机选中文件: " + testFile);
    
  5. 删除原来的Counter元件,Loop Controller设置好循环次数即可。

3. 关于${CURRENT_FILE}失效的问题

${CURRENT_FILE}是jp@gc组件默认的当前文件名变量,但默认是顺序遍历文件,不是随机的。要让它实现随机选择,只需修改jp@gc组件的设置:

  • 打开jp@gc - Directory Listing Data Source的配置界面
  • 在「Order」下拉框选择「Random」
  • 之后HTTP请求直接用${CURRENT_FILE}作为文件名变量,Loop Controller里的Counter和BeanShell PreProcessor都可以删除,只需设置循环次数,每次循环都会随机取一个文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:45:31