干货:教你如何在JMeter中调用Python代码N种方法!

发布时间:2023年12月23日

在性能测试领域,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脚本以及其他乱七八糟的脚本或者文件。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

方法二:利用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结果文件。

END今天的分享就到此结束了,点赞关注不迷路~!

文章来源:https://blog.csdn.net/qq_43371695/article/details/135168511
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。