JMeter - 在每个HTTP请求采样器前运行Python脚本
我刚接触Jmeter。我的HTTP请求采样器的调用方式是这样的:
Path= /image/**image_id**/list/
Header = "Key" : "Key_Value"
这个关键值是通过调用一个Python脚本生成的,这个脚本使用image_id
来生成一个独特的关键值。
在每个采样器之前,我想用Python脚本生成这个关键值,然后把它作为一个头信息传递给下一个HTTP请求采样器。
我知道我需要使用某种预处理器来实现这个功能。有没有人能帮我用Jmeter中的预处理器来做到这一点?
3 个回答
你可以使用一个叫做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}
来调用它:
这样每次请求都会不同,因为randimage的值会根据Python脚本的设置而变化。
这是Eugene Kazakov在这里分享的一个可能的解决方案:
JSR223采样器可以让你写和执行一些代码,只需要把jython.jar放到/lib目录下,然后在“语言”下拉菜单中选择jython,接着就可以在这个采样器中写你的代码了。
我觉得你需要的是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的使用技巧。
你还可以把你的请求放在事务控制器下,这样就可以把预处理器的执行时间从负载报告中排除了。