JMeter如何修改测试计划实现从文件夹随机选择文件上传?
问题描述
我搭建了JMeter测试计划,通过Loop Controller读取文件夹文件,但HTTP请求始终选中同一份文件。想修改测试计划实现从文件夹随机选择文件上传至Web应用。
我的测试计划包含以下组件:
- jp@gc - Directory Listing Data Source
- 带有文件初始化器的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+"");
- Loop Controller包含:
- Counter:最大值设为
${maxFileCount},导出变量名为FILENUM - BeanShell PreProcessor代码如下:
- Counter:最大值设为
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的方式,按以下步骤修改:
- 修正初始化器里的
maxFileCount:原来的files.length是目录下所有文件总数(含被过滤的无效文件),要改成有效文件数:// 替换原来的vars.put("maxFileCount", files.length+""); vars.put("maxFileCount", (fileNum-1)+""); - 删除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); - Loop Controller的循环次数设为你需要的上传次数即可,每次循环都会随机选一个文件。
方案二:用jp@gc组件+Random Variable(更简单高效)
- 删除步骤2的Simple Controller和里面的BeanShell Sampler,只保留jp@gc - Directory Listing Data Source。
- 配置jp@gc组件:
- 填写目标目录路径
- 「Filename Variables Prefix」设为
FILE_(和你之前的变量前缀一致) - 「Exclude Patterns」填
.DS_Store,.svn,自动过滤无效文件 - 不需要遍历子目录就别勾选「Recursive?」
- 添加Random Variable配置元件:
- 变量名:
RANDOM_FILE_INDEX - 最小值:
1 - 最大值:
${__jm__Directory Listing Data Source__FILE_COUNT}(这是jp@gc组件自动生成的变量,代表有效文件总数) - 格式:
0(无需补零)
- 变量名:
- 修改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); - 删除原来的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
相关产品推荐
相关产品推荐

