【全网独家解答】Jmeter并发多线程每次请求从不同txt文件获取值作为参数进行请求如何实现?

发布时间 2023-10-22 01:34:35作者: 风吹稻香

【背景】

最近在做一个系统的性能压测遇到一个问题,某接口的一个字段值是通过AES加密的,而且每次请求要求这个字段值不能相同。

由于这个加密后的值的字长特别长,已经远远超出csv文件1个单元格所能包含的字符,所以参数化这个值就不能用常规的csv data set config组件

 

 那么如何解决这个问题呢?

 

【技术难点】

由于百度上没有找到同样的问题,我就想着通过AI去寻找答案,可是AI对话几次得到的方法都不完全正确,通过多达20多次与AI磨合沟通,最终得到一个方法并加以调整,终于成功实现了我的需求,简直是柳暗花明!

 

【解决方案】

可以使用BeanShell预处理程序来实现每次请求都取不同的txt文件。以下是使用BeanShell预处理程序的步骤:

  1. 在你的测试计划中,添加一个"Thread Group"来定义并发用户的数量和循环次数。
  2. 在"Thread Group"下添加一个"HTTP Request Defaults"元件,用于设置默认的HTTP请求参数。
  3. 在"Thread Group"下添加一个"BeanShell PreProcessor"元件。
    • 编写BeanShell脚本来读取txt文件并设置请求参数。例如:
       
      import org.apache.commons.io.FileUtils;
      
      String fileName = "data_" + (ctx.getThreadNum() + 1) + ".txt";
      String fileContent = FileUtils.readFileToString(new File(fileName));
      vars.put("parameterName", fileContent);

       

      • 通过ctx.getThreadNum()获取当前线程的编号(从0开始)。
      • 使用String拼接来构建txt文件的文件名。
      • 使用Apache Commons IO库的FileUtils.readFileToString()方法来读取txt文件的内容。
      • 将文件内容保存到JMeter变量中,以供后续请求使用。
    • 在上述脚本中,将parameterName替换为实际的参数名,并根据你的实际情况进行修改。
  4. 在"Thread Group"下添加一个"HTTP Request"元件。
    • 你可以在请求中使用${parameterName}引用上一步中设置的参数变量。
  5. 设置"Thread Group"的循环次数,确保能够请求到所有的txt文件。

通过以上步骤,每次请求时,BeanShell预处理程序会根据当前线程的编号动态构建txt文件的文件名,并读取对应文件的内容。然后,将文件内容保存为JMeter变量,供后续请求使用。

【实际操作截图】

 

 

我这里是设置了5个线程并发,通过jmeter日志我们不难看出,每个线程都是取的不同文件里的AES加密值,我们的目的实现了!