Jmeter:无法在HTTP Request Body中使用bean处理器变量值

时间:2017-02-25 23:01:26

标签: java jmeter beanshell

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

HTTP Request and Bean shell 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());
}

2 个答案:

答案 0 :(得分:0)

首先,我不知道这是你的问题,还是你发布了不完整的脚本,但我没有看到你在脚本的任何地方保存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();
    

    似乎不需要。

  3. 还有一件事:如果你有1-2个用户运行这样的请求1-2次,没问题,但如果你需要创建一个加载,这个代码将崩溃:想象100个或更多的线程都试图读取同时多次使用相同的2MB文件,并且每个文件都将它放在内存中(可能在replaceAll期间有多个副本)? JMeter上的负载比服务器多。有更好的方法来存储2MB的静态数据,只有一些vars被重新存储。但我不打算详细说明,因为这不是这个问题的主题。

答案 1 :(得分:0)

你在写一篇文章,你甚至不需要Beanshell或其他什么,一切都可以用JMeter Functions完成,即:

因此,如果您将以下结构放入HTTP Request采样器"身体数据"标签:

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

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