淘先锋技术网

首页 1 2 3 4 5 6 7

一号坑

近期使用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)