首页 > 解决方案 > 在 JMeter 的 HTTP 采样器中遍历每一行并访问每一列

问题描述

我已经探索并尝试了 Google 或 StackOverflow 上提到的解决方案,但无法解决我的问题。
我正在尝试遍历 CSV 的每一行并在“HTTP Sampler”中使用每一行的每一列

这是我到目前为止所尝试的。
我的测试计划结构

在此处输入图像描述

这是我的 CSV 文件

在此处输入图像描述

这是我的 CSV 数据集配置

在此处输入图像描述

我正在使用 Bean Shell Sampler 读取整个 CSV 并在 JMeter 属性变量中存储值。
这是 Bean Shell Sampler 中的代码

import java.text.*;
import java.io.*;

String filename = "load_test_date.csv";
ArrayList strList = new ArrayList();

try{
    log.info("starting bean shell");
    File file = new File(filename);
    if(!file.exists()){
        throw new Exception ("ERROR: file " + filename + " not found");
        }
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));   
    String line = null;
    log.info("while loop starting");
    headerLine = br.readLine();
    while((line = br.readLine())!=null){
        log.info(line);
        String[] variables = line.split(",");
        props.put("header_1",variables[0]);
        props.put("header_2",variables[1]);
        props.put("header_3",variables[2]);
        props.put("header_4",variables[3]);
        props.put("header_5",variables[4]);
    }

    }catch(Exception ex){
        log.error(ex.getMessage());
        }

现在我想遍历 props 变量并获取每一列。我尝试使用 While 控制器和 ForEach 控制器,但它没有给我想要的输出。

而控制器

在此处输入图像描述

While 循环执行两次(而不是 csv 文件中的三行执行三次)并且始终使用最后一行值
,我也使用了 ForEach 控制器,但无法产生所需的结果

标签: jmeterbeanshelljmeter-5.0

解决方案


  1. 首先,忘记 Beanshell,从 JMeter 3.1 开始,您应该使用 JSR223 测试元素和 Groovy 语言编写脚本。
  2. 其次,如果我正确理解了您的观点并且您想要迭代所有值,即从 1 到 15,您需要不同的方法,例如将整个文件读入内存,用逗号分隔每一行并为每个“创建一个 JMeter 变量” cell" 值,示例 Groovy 代码将类似于:

    SampleResult.setIgnore()
    def lines = new File('load_test_date.csv').readLines()
    def counter = 1
    1.upto(lines.size() - 1, { index ->
        def line = lines.get(index)
        line.split(',').each { column ->
            vars.put('value_' + counter, column)
            counter++
        }
    })
    

    如果您执行脚本并查看Debug Sampler 输出,您将看到以下 JMeter 变量

    在此处输入图像描述

  3. 为了迭代生成的变量,您可以使用配置如下的ForEach 控制器:

    在此处输入图像描述

  4. ${value}在 HTTP 请求采样器中使用以在每次迭代时访问下一个“单元格”值:

    在此处输入图像描述


推荐阅读