在性能测试领域,JMeter 已经成为测试专业人士的首选工具,用于模拟用户行为、测量响应时间、评估系统性能。而现在大部分接口都会涉及到验签、签名、加密等操作,为了满足特定需求,我们需要更多的灵活性,比如引入 Python 来进行特定操作或处理复杂逻辑。(特别是针对一些只会 Python 编程, 不擅长 Java 的)
在 JMeter 中调用 Python 方法有很多,今天给大家先推荐几种。
方法一:利用 beanshell+Runtime.getRuntime().exec() 方法
Runtime.getRuntime().exec() 方法是用于在 Java 应用程序中执行外部命令。它允许你调用操作系统的命令行工具或其他可执行程序。你可以将要执行的命令作为参数传递给 exec() 方法,并且它会返回一个 Process 对象,通过该对象你可以管理和控制外部进程的执行。需要注意的是,使用 exec() 方法执行外部命令时需要格外小心,以防止潜在的安全漏洞。
更多内容可以学习《测试工程师 Python 工具开发实战》书籍、《大话性能测试 JMeter 实战》书籍
如下示例:
String command = "cmd /c python D:\\training\\python_work\\common\\auth.py";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
pr.waitFor();
BufferedReader b = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line = "";
StringBuilder response = new StringBuilder();
while ((line = b.readLine()) != null) {
response.append(line);
}
String response_data = response.toString();
System.out.println("获取到的token值:"+response_data);
b.close();
vars.put("token",response.toString()); //把结果赋值给变量 ID ,方便后面调用
获取接口 token 解密过程是在 auth.py 中实现的,利用 Runtime.getRuntime().exec() 执行 python 脚本
PS: 也可以利用 OS Process Sampler 取样器,在 OS Process Sampler 中,可以直接执行系统命令,这也包括执行 Python 脚本以及其他乱七八糟的脚本或者文件。
方法二:利用 JSR223 Sampler+jython
要在 JMeter 中调用 Python 代码,也可以使用 JSR223 Sampler 元素来执行 Python 脚本操作步骤:
1、在https://www.jython.org/download 下载 jython-standaloneXXX.JAR
2、放到 jmeter 的 lib 文件夹下,重启 Jmeter。
3、添加 JSR223 Sampler(路径:Thread Group >Sampler>JSR223 Sampler)
4、根据压测需求,编写 python 脚本即可。
示例:
"""该脚本用于加密登录信息"""
import hashlib
import sys
import time
import json
def password_srt(pubkey, password):
time_str = str(time.time())
sign_str = str(pubkey) + time_str + str(password)
sign = hashlib.md5(sign_str.encode('utf-8')).hexdigest()
res = {'sign': sign, 'pubkey': pubkey, 'password': password}
res = json.dumps(res)
return res
result = password_srt(123456789,987654321)
log.info(result)
vars.put("secrity",result)
方法三:利用 pymeter 库
pymeter 库允许你在 Python 中实现类似 JMeter GUI 操作性能测试一样的效果。
项目地址:
https://github.com/eldaduzman/pymeter
依赖条件:
安装:
pip install pymeter
使用示例:
"""unittest module"""
from unittest import TestCase, main
from pymeter.api.config import TestPlan, ThreadGroupWithRampUpAndHold
from pymeter.api.postprocessors import JsonExtractor
from pymeter.api.reporters import HtmlReporter
from pymeter.api.samplers import DummySampler, HttpSampler
from pymeter.api.timers import UniformRandomTimer
class TestTestPlanClass(TestCase):
def test_1(self):
json_extractor = JsonExtractor("variable", "args.var")
timer = UniformRandomTimer(1000, 2000)
http_sampler = HttpSampler(
"Echo",
"https://postman-echo.com/get?var=${__Random(0,10)}",
timer,
json_extractor,
)
dummy_sampler = DummySampler("dummy ${variable}", "hi dummy")
tg = ThreadGroupWithRampUpAndHold(
10, 1, 60, http_sampler, dummy_sampler, name="Some Name"
)
html_reporter = HtmlReporter()
tp = TestPlan(tg, html_reporter)
stats = tp.run()
print(
f"duration= {stats.duration_milliseconds}",
f"mean= {stats.sample_time_mean_milliseconds}",
f"min= {stats.sample_time_min_milliseconds}",
f"median= {stats.sample_time_median_milliseconds}",
f"90p= {stats.sample_time_90_percentile_milliseconds}",
f"95p= {stats.sample_time_95_percentile_milliseconds}",
f"99p= {stats.sample_time_99_percentile_milliseconds}",
f"max= {stats.sample_time_max_milliseconds}",
sep="\t",
)
self.assertLess(stats.sample_time_99_percentile_milliseconds, 2000)
if __name__ == "__main__":
main()
执行后,自动生成 output 目录,并生成 index.hmtl 报告和.jtl 结果文件。
更多内容可以学习《测试工程师 Python 工具开发实战》书籍、《大话性能测试 JMeter 实战》书籍