“ 在性能测试领域,Apache JMeter已经成为测试专业人士的首选工具,用于模拟用户行为、测量响应时间、评估系统性能。但在某些情境下,为了满足特定需求,我们需要更多的灵活性,比如引入Python来进行特定操作或处理复杂逻辑。。”
一、OS Process Sampler
在OS Process Sampler中,可以直接执行系统命令,这也包括执行Python脚本以及其他乱七八糟的脚本或者文件,但是我们这里只介绍关于调用python脚本的知识。
梳理步骤:
先编写
python
脚本,可以接收参数也可以不接收参数,但是一定要使用 print 打印结果出来如果是windows系统,编写一个
.bat
文件,让jmeter
直接执行文件,如果linux
文件,则编写shell
文件启动
jmeter
,添加一个os process sample
,然后配置里面的信息添加一个正则提取器,提取调用外部文件返回的结果就完成我们的所有操作了。
演练开始
下面开始步骤一的操作
如下:加密文件中的python代码:
import base64
import sys
from Crypto.Cipher import AES
import binascii
def add_to_16(text):
while len(text) % 16 != 0:
text += '\0'
return text
def encrypt(data, password):
if isinstance(password, str):
password = password.encode('utf8')
bs = AES.block_size
pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
cipher = AES.new(password, AES.MODE_ECB)
data = cipher.encrypt(pad(data).encode('utf8'))
encrypt_data = binascii.b2a_hex(data) # 输出hex
# encrypt_data = base64.b64encode(data) # 取消注释,输出Base64格式
return encrypt_data.decode('utf8')
if __name__ == '__main__':
data = sys.argv[1] # 待加密数据
# data = '1915' # 待加密数据
password = '5544223414143242332423423423423' # 16,24,32位长的密码(密钥)
password = add_to_16(password)
encrypt_data = encrypt(data, password)
# print('加密前数据:{}\n======================='.format(data))
print(f"sign={encrypt_data}")
# decrypt_data = decrypt(encrypt_data, password)
# print('解密后的数据:{}'.format(decrypt_data))
上述代码的大概逻辑就是接收传进来的待加密字符串,然后进行AES
加密,最后打印加密后的数据结果
接着我们开始步骤二的操作
用windows举例,.bat
文件内容如下:
c:
cd C:\Users\chenyongzhi11\Desktop\
python .\do_AES.py %1
上面文件内容就是在命令行执行python
文件,由于前面的python
文件接收参数,我们这里使用 %1
这个占位来接收jmeter
传进去的参数,我们把文件命名为 :execute_python_script.bat
接着我们开始步骤三的操作
添加一个OS Process Sampler
我们看下这个界面该如何配置:
这会调用外部Python
脚本,并传入参数input_param
。
最后一步操作
添加一个正则表达式提取器,编写正则,看看能不能提取到结果:
最后我们用debug sample
檢測最终结果:
这样整个流程完成了,也就可以很方便的调用外部文件做接口自动化了。
二、其他方案
这里再简单介绍两种能够处理python
代码的方案:
- 使用函数助手[jmeter-functions-execute-python-script-1.0.jar]
链接:https://pan.baidu.com/s/1JrPW723es9rFbp18mNAvug?pwd=thjp
提取码:thjp
这个就直接放入到:\lib\ext
下面就行,然后重启jmeter
使用如图:
使用
BeanShell Sampler
组件
这个需要一定的java代码能力,大伙可以自行看着玩,因烦不建议,前面的os process sample
舒服,也就是说,既然都要写beanshell了,直接java代码干就完事了,哈哈!。
示例代码,不保证能用:
import java.io.BufferedReader;
import java.io.InputStreamReader;
//1. 命令里的路径改成自己脚本的路径
String command = "/opt/homebrew/bin/python3 /Users/xxx/Code/python-mysql/gen_id.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(response_data);
log.info(response_data);
b.close();
// 2. 定义Jmeter中引用的变量名
vars.put("xxx",response_data); //把结果赋值给变量 ,方便后面调用
By the way,很多小伙伴反馈说既然用jmeter了,干嘛还往里整python代码,不是多此一举嘛?这里勇哥谈谈自己的几点愚见:
现有代码复用:有时候可能我们有一些现成的
python
代码用特定的操作或者业务逻辑,嵌入这些python代码就可以避免重复造轮子了代码能力:很多测试人员的技术栈是偏python的,在使用jmeter做自动化测试时,利用python的灵活及强大的库工具就很容易入手了。
集成其他工具:可能有一些自己的python工具很好用,但是想集成到一起就可以考虑这样的偏方了
总之jmeter既然可以这样玩,那么给到用户也就多一种使用体验,多一种解决问题的可能性。
总结
以上就是勇哥今天为各位小伙伴准备的内容,如果你想了解更多关于Python自动化测试的知识和技巧,欢迎关注我:公众号\博客\CSDN\B站:测试玩家勇哥
;我会不定期地分享更多的精彩内容。感谢你的阅读和支持!
题外话,勇哥打算把新建的技术交流群,打造成一个活跃的高质量技术群。工作中遇到的技术问题,都可以在里面咨询大家,还有工作内推的机会。有兴趣的小伙伴,欢迎加我(记得备注是进群还是报名学习)👇👇👇**
**👆**👆**👆长按上方二维码2秒,关注我**
勇哥,10年落魄测试老司机,技术栈偏python,目前在一家超大型房产公司担任自动化测试主管,日常工作比较繁杂,主要负责自动化测试,性能测试、软件质量管理及人员管理。工作之余专注于为粉丝进行简历修改、面试辅导、模拟面试、资料分享、一对一自动化测试教学辅导等副业发展。目前已服务十多位小伙伴,取得高薪offer。
关注公众号,测试干货及时送达