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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:27:29