接上文《JMeter与Python的多重交响:从入门到高级应用(上)》
在性能测试领域,Apache JMeter已经成为测试专业人士的首选工具,用于模拟用户行为、测量响应时间、评估系统性能。但在某些情境下,为了满足特定需求,我们需要更多的灵活性,比如引入Python来进行特定操作或处理复杂逻辑。
在OS Process Sampler中,可以直接执行系统命令,这也包括执行Python脚本以及其他乱七八糟的脚本或者文件,但是我们这里只介绍关于调用python脚本的知识。
如下:加密文件中的python代码:
import base64import sysfrom Crypto.Cipher import AESimport binasciidef add_to_16(text): while len(text) % 16 != 0: text += '/0' return textdef 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代码,不是多此一举嘛?这里勇哥谈谈自己的几点愚见:
总之jmeter既然可以这样玩,那么给到用户也就多一种使用体验,多一种解决问题的可能性。
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-11289-0.htmlJMeter与Python的多重交响:从入门到高级应用(下)
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 编程新境界:从入门到精通Python中eval()函数的魔力
下一篇: C++11中auto关键字的使用详解