Jmeter:无法在 HTTP 请求正文中使用 bean 处理器变量值

Jmeter: Not able to use bean processor variable value in HTTP Request Body

我有一个 CSV 输入数据文件和一个 2 MB 的文件,我需要将其与每个 HTTP 请求一起发送到服务器。该文件有 2 个变量。我需要从我的输入文件中更改这些变量值。我正在使用 Bean shell 预处理器。下面是代码片段。我在“temp”变量中得到的结果无法在 HTTP 请求正文中复制它。我什至尝试过 ${temp} 但它甚至没有用 Script structure

:

import java.io.*;
//cardId,receiverid
try
{
    // reading file into buffer
    StringBuilder data = new StringBuilder();
    BufferedReader in = new BufferedReader(new FileReader("Sample.json"));

    char[] buf = new char[1024];
    int numRead = 0;
    while ((numRead = in.read(buf)) != -1) {
    data.append(buf, 0, numRead);
    }
    in.close();

    // replacing stub with actual value
     System.out.println(vars.get("cardId") + " " +vars.get("receiverid") );

    String cardId = vars.get("cardId");
    String receiverid = vars.get("receiverid");
    String temp = data.toString().replaceAll("\$\{cardId\}", vars.get("cardId"));
           temp = data.toString().replaceAll("\$\{receiverid\}", receiverid);


    out.close();
}
catch (Exception ex) {
    IsSuccess = false;
    log.error(ex.getMessage());
    System.err.println(ex.getMessage());
}
catch (Throwable thex) {
    System.err.println(thex.getMessage());
}

首先,我不知道这是不是你的问题,或者你发布的脚本不完整,但我没有看到你在脚本的任何地方保存 temp 变量。你需要有类似

的东西
vars.put("temp", temp);

稍后在脚本中将其用作 ${temp}。保存 String temp 不会自动创建变量。

其次:你的脚本有很多问题,所以你真的需要查看日志,确保脚本正常运行。我看到的是:

  1. 我不确定 Sample.json 看起来如何,但根据您的操作,您似乎打算将 $\{cardId\}$\{receiverid\} 替换为使用变量 cardIdreceiverid 的值从该文件中读取的数据。但是您的代码不正确,因此只有 $\{receiverid\} 会被替换。更正如下:

    String cardId = vars.get("cardId");
    String receiverid = vars.get("receiverid");
    String temp = data.toString()
            .replaceAll("\$\{cardId\}",cardId)
            .replaceAll("\$\{receiverid\}", receiverid);
    
  2. 而且我没有看到 out 的开头或声明,所以

    out.close();
    

    好像不需要。

还有一件事:如果你有 1-2 个用户 运行 这样的请求 1-2 次,没问题,但如果你需要创建一个负载,这段代码就会崩溃:想象 100 或更多线程都试图同时多次读取同一个 2MB 文件,并且每个线程都将其放入内存(在 replaceAll 期间可能有多个副本)? JMeter 上的负载将比服务器上的负载更多。有更好的方法来存储 2MB 的静态数据,只替换一些变量。但是我不会详细介绍,因为这不是这个问题的主题。

你写的太多了,你甚至不需要Beanshell什么的,一切都可以用JMeter Functions来完成,即:

因此,如果您将以下结构放入 HTTP Request 采样器 "Body Data" 选项卡中:

${__eval(${__FileToString(Sample.json,,)})}

您将获得 Sample.json 文件,其中所有 JMeter 变量都替换为它们的值。有关详细信息,请参阅 Here’s What to Do to Combine Multiple JMeter Variables 文章。