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
不会自动创建变量。
其次:你的脚本有很多问题,所以你真的需要查看日志,确保脚本正常运行。我看到的是:
我不确定 Sample.json
看起来如何,但根据您的操作,您似乎打算将 $\{cardId\}
和 $\{receiverid\}
替换为使用变量 cardId
和 receiverid
的值从该文件中读取的数据。但是您的代码不正确,因此只有 $\{receiverid\}
会被替换。更正如下:
String cardId = vars.get("cardId");
String receiverid = vars.get("receiverid");
String temp = data.toString()
.replaceAll("\$\{cardId\}",cardId)
.replaceAll("\$\{receiverid\}", receiverid);
而且我没有看到 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 文章。
我有一个 CSV 输入数据文件和一个 2 MB 的文件,我需要将其与每个 HTTP 请求一起发送到服务器。该文件有 2 个变量。我需要从我的输入文件中更改这些变量值。我正在使用 Bean shell 预处理器。下面是代码片段。我在“temp”变量中得到的结果无法在 HTTP 请求正文中复制它。我什至尝试过 ${temp} 但它甚至没有用
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
不会自动创建变量。
其次:你的脚本有很多问题,所以你真的需要查看日志,确保脚本正常运行。我看到的是:
我不确定
Sample.json
看起来如何,但根据您的操作,您似乎打算将$\{cardId\}
和$\{receiverid\}
替换为使用变量cardId
和receiverid
的值从该文件中读取的数据。但是您的代码不正确,因此只有$\{receiverid\}
会被替换。更正如下:String cardId = vars.get("cardId"); String receiverid = vars.get("receiverid"); String temp = data.toString() .replaceAll("\$\{cardId\}",cardId) .replaceAll("\$\{receiverid\}", receiverid);
而且我没有看到
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 文章。