在性能测试领域,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+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 hashlibimport sysimport timeimport 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, ThreadGroupWithRampUpAndHoldfrom pymeter.api.postprocessors import JsonExtractorfrom pymeter.api.reporters import HtmlReporterfrom pymeter.api.samplers import DummySampler, HttpSamplerfrom 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结果文件。
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取