一号坑
近期使用jmeter对http接口做压力测试,由于接口请求需要签名,加之每次请求都是取新的token,所以每次的签名值都不一样,需要调用脚本获取
本次我添加了JSR223 组件,通过调用python脚本来加签
问题:
如果线程组不循环执行,每次都能正常加签(获取到sign值)并请求成功;
如果 让线程组循环执行,问题来了。循环执行时sign值每次并没有重新获取,一直都调用缓存中的对象,导致除第一个请求外,其它循环请求均失败
困扰了一周的时间~~
分析原因:
在添加JSR 223组件时勾选了cache complied script if available,导致Jmeter在执行时使用了Cache编译脚本,cache中已存在变量的值,所有就不会再次调用脚本加签
解决办法:
去除勾选cache complied script if available,一切问题解决~~
二号坑
JSR223 Sampler调用pyhton做签名时,如果字典中的参数包含中文 ,就会出现字符集的问题
data = {
"name": "共享用户",
"phone": "13788973535",
"houseId": "1377889180918484993",
"accessToken": "${__property(accessToken)}"
}
Response message:javax.script.ScriptException: UnicodeEncodeError: 'ascii' codec can't encode charac
如是尝试在脚本中加入如下 代码,指定字符
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
虽然不报错了,但是加签的结果还是不对的,说明字典中的字符编号还存在问题
百娘了2个小时后,发现有人用如下方式对处理字典中字段编码
data['name'] = data['name'].decode('utf-8') #对字段中的中文字段单独转码
最终问题成功解决,加签通过
import hashlib
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
appKey = "90da5374a520467abd866bb556e380c9"
appSecret = "ba3a25eccc83ecb7fdfcf516129748d1"
#以下两种写法都可以
#BeanShell取变量值
#accessToken = vars.get("accessToken_1")
#python取变量值
#accessToken = ${__property(accessToken)}
#def get_sign():
data = {
"name": "共享用户",
"phone": "13788973535",
"houseId": "1377889180918484993",
"accessToken": "${__property(accessToken)}"
}
data['name'] = data['name'].decode('utf-8') #对字段中的中文字段单独转码
if 'appKey' not in data.keys():
data['appKey'] = appKey
if 'sign' in list(data.keys()):
del data['sign']
sign_str = ''
for k in sorted(data.keys()):
key = data[k]
sign_str += '{0}={1}&'.format(k, key)
sign_str += appSecret
print('待加密字符串为:', sign_str)
result = hashlib.md5(sign_str.encode("utf-8")).hexdigest()
#return result
print("sign值为:", result)
vars.put("sign4",result)