JMeter使用JSR223预处理器读取CSV每行发JSON请求仅读最后行问题
问题根因
当前配置仅发送最后一个JSON文件的核心原因:
- JSR223预处理器为单次HTTP请求执行前触发一次的组件,你写的
each循环会在一次触发过程中遍历完CSV所有行,每遍历一行就清空原有请求体、写入当前文件内容,循环结束后请求体自然只保留最后一行对应的plan4.json内容。 - 同时配置CSV数据集配置和预处理器手动读CSV的逻辑存在冲突:CSV数据集配置本身是按迭代逐行取值的组件,和预处理器全量读取文件的逻辑完全重复,属于冗余配置。
解决方案
根据实际需求二选一配置即可:
方案1:逐行读取CSV,每个JSON对应发送1次独立POST请求(共4次请求)
不需要编写自定义脚本,用JMeter原生组件即可实现,步骤如下:
- 删除HTTP请求采样器下的JSR223预处理器,清空原有Body Data里的配置。
- 在HTTP请求采样器的Body Data栏填入:
${__FileToString(${json_file_path},,)} - 配置CSV数据集Config参数:
- 文件名:
D:/jmeter_tests/json_test_plan.csv - 变量名称:
json_file_path(和上面__FileToString函数里的变量名保持一致) - 遇到文件结束符再次循环?:
False - 遇到文件结束符停止线程?:
True - 其余参数保持默认即可
- 文件名:
- 把线程组的线程数设为1、循环次数设为1,启动测试后CSV数据集会自动逐行读取文件路径,每读一行发起一次请求,4条记录全部读完后自动停止。
方案2:单次请求一次性携带所有JSON内容(仅发1次请求)
如果你的需求是只发1次POST,请求体包含所有4个JSON文件的内容,按如下配置:
- 删除或禁用CSV数据集Config组件,清空HTTP请求采样器Body Data栏的所有内容。
- 保留JSR223预处理器,把原有代码替换为:
def requestBody = new StringBuilder() new File("D:/jmeter_tests/json_test_plan.csv").readLines().each { filePath -> // 跳过CSV里的空行 if (filePath.trim()) { requestBody.append(new File(filePath).text).append(System.getProperty("line.separator")) } } // 重置请求体 sampler.getArguments().removeAllArguments() sampler.addNonEncodedArgument("", requestBody.toString(), "") sampler.setPostBodyRaw(true)
- 确认HTTP信息头管理器已配置
Content-Type: application/json,直接启动测试即可。
注意:如果接口要求请求体为标准JSON格式,直接拼接多个JSON对象会导致格式非法。如果需要传JSON数组,需要在拼接内容前后添加
[、],并在每个JSON对象之间补逗号分隔,按需调整预处理器里的拼接逻辑即可。
内容的提问来源于stack exchange,提问作者Satts
相关产品推荐
相关产品推荐

