JMeter與Python的多重交響:從入門到高級應(yīng)用(下)
接上文《JMeter與Python的多重交響:從入門到高級應(yīng)用(上)》
在性能測試領(lǐng)域,Apache JMeter已經(jīng)成為測試專業(yè)人士的首選工具,用于模擬用戶行為、測量響應(yīng)時間、評估系統(tǒng)性能。但在某些情境下,為了滿足特定需求,我們需要更多的靈活性,比如引入Python來進行特定操作或處理復(fù)雜邏輯。
一、OS Process Sampler
在OS Process Sampler中,可以直接執(zhí)行系統(tǒng)命令,這也包括執(zhí)行Python腳本以及其他亂七八糟的腳本或者文件,但是我們這里只介紹關(guān)于調(diào)用python腳本的知識。
1.梳理步驟
- 先編寫python腳本,可以接收參數(shù)也可以不接收參數(shù),但是一定要使用 print 打印結(jié)果出來
- 如果是windows系統(tǒng),編寫一個.bat 文件,讓jmeter直接執(zhí)行文件,如果linux文件,則編寫shell文件
- 啟動jmeter,添加一個os process sample ,然后配置里面的信息
- 添加一個正則提取器,提取調(diào)用外部文件返回的結(jié)果就完成我們的所有操作了。
2.演練開始
下面開始步驟一的操作
如下:加密文件中的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] # 待加密數(shù)據(jù)
# data = '1915' # 待加密數(shù)據(jù)
password = '5544223414143242332423423423423' # 16,24,32位長的密碼(密鑰)
password = add_to_16(password)
encrypt_data = encrypt(data, password)
# print('加密前數(shù)據(jù):{}\n======================='.format(data))
print(f"sign={encrypt_data}")
# decrypt_data = decrypt(encrypt_data, password)
# print('解密后的數(shù)據(jù):{}'.format(decrypt_data))
上述代碼的大概邏輯就是接收傳進來的待加密字符串,然后進行AES加密,最后打印加密后的數(shù)據(jù)結(jié)果。
接著我們開始步驟二的操作用
windows舉例,.bat 文件內(nèi)容如下:
c:
cd C:\Users\chenyongzhi11\Desktop\
python .\do_AES.py %1
上面文件內(nèi)容就是在命令行執(zhí)行python文件,由于前面的python文件接收參數(shù),我們這里使用 %1 這個占位來接收jmeter傳進去的參數(shù),我們把文件命名為 :execute_python_script.bat
接著我們開始步驟三的操作
添加一個OS Process Sampler:
我們看下這個界面該如何配置:
這會調(diào)用外部Python腳本,并傳入?yún)?shù)input_param。
最后一步操作
添加一個正則表達式提取器,編寫正則,看看能不能提取到結(jié)果:
最后我們用debug sample檢測最終結(jié)果:
這樣整個流程完成了,也就可以很方便的調(diào)用外部文件做接口自動化了。
二、其他方案
這里再簡單介紹兩種能夠處理python代碼的方案:
使用函數(shù)助手[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); //把結(jié)果賦值給變量 ,方便后面調(diào)用
By the way,很多小伙伴反饋說既然用jmeter了,干嘛還往里整python代碼,不是多此一舉嘛?這里勇哥談?wù)勛约旱膸c愚見:
- 現(xiàn)有代碼復(fù)用:有時候可能我們有一些現(xiàn)成的python代碼用特定的操作或者業(yè)務(wù)邏輯,嵌入這些python代碼就可以避免重復(fù)造輪子了
- 代碼能力:很多測試人員的技術(shù)棧是偏python的,在使用jmeter做自動化測試時,利用python的靈活及強大的庫工具就很容易入手了。
- 集成其他工具:可能有一些自己的python工具很好用,但是想集成到一起就可以考慮這樣的偏方了
總之jmeter既然可以這樣玩,那么給到用戶也就多一種使用體驗,多一種解決問題的可能性。