使用jmeter进行批量登录
当登录含时间戳加密信息超时校验时,单独使用jmeter很难实现自动化运行,本文前置信息处理通过python进行,再使用jmeter进行运行登录脚本。
使用python进行密钥加密
加密模块
import rsa
import base64
def _str2key(s):
# 对字符串解码
b_str = base64.b64decode(s)
if len(b_str) < 162:
return False
hex_str = ''
# 按位转换成16进制
for x in b_str:
h = hex(x)[2:]
h = h.rjust(2, '0')
hex_str += h
# 找到模数和指数的开头结束位置
m_start = 29 * 2
e_start = 159 * 2
m_len = 128 * 2
e_len = 3 * 2
modulus = hex_str[m_start:m_start + m_len]
exponent = hex_str[e_start:e_start + e_len]
return modulus, exponent
def rsa_encrypt(s, pubkey_str):
'''
rsa加密
:param s:
:param pubkey_str:公钥
:return:
'''
key = _str2key(pubkey_str)
modulus = int(key[0], 16)
exponent = int(key[1], 16)
pubkey = rsa.PublicKey(modulus, exponent)
return base64.b64encode(rsa.encrypt(s.encode(), pubkey)).decode()
加密密码
def get_password(password):
timestamp = int(time.time() * 1000)
# print("timestamp: " + str(timestamp))
message = str(timestamp) + "-" + password
password = rsa_encrypt(message,
"你的公钥")
return timestamp, password
本被测系统是通过密码加时间戳后进行加密,这块具体代码需要结合自己被测系统的加密算法
把需要请求的参数放到csv文件里面
with open("C:\\Users\\John\\PycharmProjects\\rsa\\LoginInfo.csv","w",newline="") as f:
writer = csv.writer(f)
#写入列名
writer.writerow(['username','password','timestamp'])
#造200条数据,f
for i in range(200):
timestamp, password = get_password("密码")
writer.writerow(['账号',password,timestamp])
使用jmeter运行python脚本
在setup线程组中添加beanshell取样器运行python脚本
import java.io.BufferedReader;
import java.io.InputStreamReader;
//pytho文件的路径
String command = "cmd /c python C://Users//John//PycharmProjects//rsa//GetLoginInfo.py";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
pr.waitFor();
使用jmeter中的csv data set config对csv文件进行读取
变量名是csv文件中的列名
每次运行就会先运行python脚本,避免登录时间戳超时校验的影响