JMeter - 在每个HTTP请求采样器前运行Python脚本

4 投票
3 回答
19996 浏览
提问于 2025-04-18 11:44

我刚接触Jmeter。我的HTTP请求采样器的调用方式是这样的:

Path= /image/**image_id**/list/
Header =  "Key" : "Key_Value"

这个关键值是通过调用一个Python脚本生成的,这个脚本使用image_id来生成一个独特的关键值。

在每个采样器之前,我想用Python脚本生成这个关键值,然后把它作为一个头信息传递给下一个HTTP请求采样器。

我知道我需要使用某种预处理器来实现这个功能。有没有人能帮我用Jmeter中的预处理器来做到这一点?

3 个回答

2

你可以使用一个叫做BSF PreProcessor的工具。

首先,下载Jython库,然后把它放到你jmeter的lib目录里。

在你的HTTP采样器上添加一个BSF PreProcessor,选择语言为Jython,然后写一些代码来获取你需要的id。举个例子,我用的是这个:

import random
randImageString = ""
for i in range(16):
    randImageString = randImageString + chr(random.randint(ord('A'),ord('Z')))

vars.put("randimage", randImageString)

注意这里的vars.put("randimage",randImageString"),这行代码会把一个变量插入到jmeter中,以后可以用到。

现在在你的测试中,当你需要这个变量时,可以用${randimage}来调用它:

带参数的HTTP采样器

这样每次请求都会不同,因为randimage的值会根据Python脚本的设置而变化。

3

这是Eugene Kazakov这里分享的一个可能的解决方案:

JSR223采样器可以让你写和执行一些代码,只需要把jython.jar放到/lib目录下,然后在“语言”下拉菜单中选择jython,接着就可以在这个采样器中写你的代码了。

可惜Jython有一个bug,不过页面上有一些建议。

更多信息在这里。

5

我觉得你需要的是Beanshell预处理器

下面是一个Beanshell代码的例子:

import java.io.BufferedReader;
import java.io.InputStreamReader;

Runtime r = Runtime.getRuntime();
Process p = r.exec("/usr/bin/python /path/to/your/script.py");
p.waitFor();
BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
StringBuilder response = new StringBuilder();
while ((line = b.readLine()) != null) {
    response.append(line);

}

b.close();
vars.put("ID",response.toString());

上面的代码会执行一个Python脚本,并把它的响应结果放到ID这个变量里。

你可以在你的HTTP请求中这样引用它: /image/${ID}/list/

想了解更多关于Beanshell脚本的信息,可以查看如何使用Beanshell:JMeter最受欢迎的内置组件这篇指南,里面有关于Apache JMeter的Beanshell脚本和一些Beanshell的使用技巧。

你还可以把你的请求放在事务控制器下,这样就可以把预处理器的执行时间从负载报告中排除了。

撰写回答