-安装插件
1、下载插件jython-standalone-2.7.0.jar到jmeter的lib\ext目录下
链接:
https://pan.baidu.com/s/13ZXtUwoQEV62M98GaIR26w
提取码:ioyk
2、重启jmeter,查看是否生效,如果这个语言有python的选项说明可以了,注意这里支持的是python2,没有支持python3的插件呢(如果你没有安装py2,也不会有py2的选项)
3、插件管理器下载插件(尽管没有搜索到对应的插件)
jmeter官网(除了慢没有毛病):Apache JMeter - Apache JMeter™
插件管理器下载地址:https://jmeter-plugins.org/install/Install/
然后我们将下载下来的jar包放入JMeter目录下的lib/ext目录,重启jmeter
然后我们会发现JMeter的选项下回多出一个新东西,这个就是我们的插件管理器了
虽然这里没有这个插件!!!!!哈哈哈哈哈
- 处理请求前参数
被测试接口中参数需要处理加工,利用JSR223 Sampler做入参处理,你要将控件放在http Request 控件之前
1、jmeter内置变量vars
你在用户参数中定义的参数都是放入jmeter的vars中的
获取参数:vars.get(参数名string类型)
放入参数:vars.put(参数名string类型,string类型的value)
2、其他代码参考python语法即可
我的示例:我把一些参数没有值的情况给予默认值,可做安全参数转化,特殊入参的拼接,直接上代码吧
python
import random
import re
def tian_code(ctt):
"""把入参做安全传输转化"""
pattern1 = re.compile(r"\/")
pattern2 = re.compile(r"[\'\"]")
res = re.sub(pattern2,r"\'",ctt)
res = re.sub(pattern1,r"\/",res)
return res
#一些固定值
vars.put("mode","strategy")
vars.put("pid","homework")
vars.put("token","200075")
vars.put("qid","${__Random(10000000,99999999,)}")
vars.put("rid","${__Random(10000000,99999999,)}")
#一些非固定值处理没有入参值时给如默认值
dict_param = {}
dict_param["uid"] = vars.get("uid")
dict_param["content"] = vars.get("content")
dict_param["avatar"] = vars.get("avatar")
dict_param["uname"] = vars.get("uname")
dict_param["title"] = vars.get("title")
dict_param["pic"] = vars.get("pic")
for k,v in dict_param.items():
if not v:
if k=="uid":
dict_param[k]= str(random.randint(11111111,99999999))
elif k =="pic":
dict_param[k]= "https://b-ssl.duitang.com/uploads/item/201807/17/20180717232644_resnw.thumb.700_0.jpg"
else:
dict_param[k]= u"${__RandomString(11,unicode,)}"
dict_param[k] = tian_code(dict_param[k])
vars.put(k,dict_param[k] )
#unique_key的拼接
unique_key = str(vars.get("pid"))+"_"+str(vars.get("token"))+"_"+ str(vars.get("qid")) +"_"+str(vars.get("rid"))+"_"+str(vars.get("uid"))
vars.put("unique_key",unique_key )
- 处理断言
1、在http请求控件右键添加JSR223Assertion
2、常用的内置参数
(1)获取http请求的结果:prev.getResponseDataAsString()
(2)修改请求断言结果:AssertionResult.setFailure(False)或者True
(3)修改断言失败信息:AssertionResult.setFailureMessage( u"失败\n"+vars.get("msg"))
(4)返回参数是json但是为字符串格式,转化的时候我用eval方式拿出参数,json包使用报错
给予我自己的代码做参考:
python
log.info(u"+++++++++++{}_{}_处理结果+++++++++++++++".format(vars.get("Tname"), vars.get("ceshi")))
name = vars.get("Tname")
# setThreadName(u"{}".format(name))
response = prev.getResponseDataAsString()
log.info("response:" + response)
vars.put("result", response)
def other_action(param, test):
result_other = {}
if isinstance(param, dict):
for k, v in param.items():
if v != "default" and k != test:
result_other[k] = v
return result_other
myResult = vars.get("result")
test = vars.get("ceshi")
res = eval(myResult)
error = str(res["errno"])
is_success = 1
errMsg = u""
action = ""
result_other = ""
if error == "0":
result = eval(res["result"])
action = result[test]
if action not in ("PutFile", "DivertDel", "smartmis"):
is_success = 0
result_other = other_action(result, test)
if action == "smartmis" and len(result_other) != 0:
is_success = 0
else:
is_success = 0
errMsg = eval(str(res["result"]))
re = ""
if action:
re += u"期望action({}_{}):{}".format(name, test, action)
else:
re += u"期望action({}_{}):没有结果".format(name, test)
if result_other:
re += u"其他命中策略有:{}".format(str(result_other))
if errMsg:
re += u"错误日志是:{}".format(errMsg)
vars.put("is_success", str(is_success))
vars.put("msg", re)
log.info(u"+++++++++++{}_{}断言+++++++++++++++".format(name, test))
log.info(vars.get("is_success"))
if (vars.get("is_success") == "1"):
AssertionResult.setFailure(False)
AssertionResult.setFailureMessage(u"成功\n" + vars.get("msg"))
else:
AssertionResult.setFailure(True)
AssertionResult.setFailureMessage(u"失败\n" + vars.get("msg"))
log.info(AssertionResult.getFailureMessage())
#以下为数据库断言使用参数
if action == "smartmis":
vars.put("dbNum", str(1))
else:
vars.put("dbNum", str(0))
- 我们一起看看我的成果吧
调试的时候可以加一个Debug Sampler去看你所有的jmeter内置参数值,或者打开日志去看
失败的情况