在性能测试领域,JMeter已经成为测试专业人士的首选工具,用于模拟用户行为、测量响应时间、评估系统性能。而现在大部分接口都会涉及到验签、签名、加密等操作,为了满足特定需求,我们需要更多的灵活性,比如引入Python来进行特定操作或处理复杂逻辑。(特别是针对一些只会Python编程, 不擅长Java的)
在JMeter中调用Python方法有很多,今天给大家先推荐几类:
方法一:利用beanshell+Runtime.getRuntime().exec()方法
Runtime.getRuntime().exec()
方法是用于在 Java 应用程序中执行外部命令。它允许你调用操作系统的命令行工具或其他可执行程序。你可以将要执行的命令作为参数传递给 exec() 方法,并且它会返回一个 Process 对象,通过该对象你可以管理和控制外部进程的执行。需要注意的是,使用 exec() 方法执行外部命令时需要格外小心,以防止潜在的安全漏洞。
如下示例:
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
要在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 jsondef 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 resresult = 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, mainfrom 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 UniformRandomTimerclass 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结果文件。