性能工具之Jmeter关联小白学习
- 2019 年 12 月 24 日
- 筆記

背景
性能测试关联是每个性能测试人员必须掌握的技能,记得2013年做性能测试,关联对于我来说是一个比较紧张与害怕的事情,记得当时在给财务公司做网银性能测试就用到了关联,当时让会的同事教我,也许因为怕教他人饿死自己,每次请教的时候都是模拟两可,总是说就这样写就行。后面做完项目后,自己花了时间与精力终于搞定什么是关联,为什么要做关联,中国有一句古话《求人不如求己》,只有自己掌握核心技能或者自己在某方面有沉淀,所有人脉自然就来,古人云《富贵深山有远亲,贫穷闹市无近邻》。
知识点
- django环境搭建(Django爱的初念入门)
- python字典使用
- Jmeter中JSON Extractor提取器
python字典知识点复习
字典定义
字典是另一种可变容器,且可存储任意类型对象。简单的说就是容器,只有符合字典的规则就能存放数据,对于java熟悉人员来说相当于java的map,字典是键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中如 d = {key1 : value1, key2 : value2 }。
常用操作
字典创建
根据python字典规则【k->】,以下是简单的字典,
>>> homelear={"weekends":"是一个集中学习晋升的好日志", "play":"出去玩,在家学习", "learning":"学习什么", "plan":"['java','python','linux','mysql']"}
查看当前可以进行什么操作

>>> dir(homelear) ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] >>>
增
#新增一个元组 dicadd = ('调优', '慢查询', '执行计划', '索引','架构'); #把刚才创建的元组新增到字典中去 >>> homelear["mysql"]=dicadd #查看新增的结果 >>> homelear {'weekends': '是一个集中学习晋升的好日志', 'play': '出去玩,在家学习', 'learning': '学习什么', 'plan': "['java','python','linux','mysql']", 'mysql': ('调优', '慢查询', '执行计划', '索引', '架构')} #第二种新增方法: >>> homelear.update(jvm="调优不是一蹴而就的") #查看结果 >>> homelear {'weekends': '是一个集中学习晋升的好日志', 'play': '出去玩,在家学习', 'learning': '学习什么', 'plan': "['java','python','linux','mysql']", 'mysql': ('调优', '慢查询', '执行计划', '索引', '架构'), 'jvm': '调优不是一蹴而就的'} #同时增加两个写法: >>> homelear.update(jvm="调优不是一蹴而就的",ngix="它不过就是一个转发而已") #查看 >>> homelear 就是一个转发而已") {'weekends': '是一个集中学习晋升的好日志', 'play': '出去玩,在家学习', 'learning': '学习什么', 'plan': "['java','python','linux','mysql']", 'mysql': ('调优', '慢查询', '执行计划', '索引', '架构'), 'jvm': '调优不是一蹴而就的', 'ngix': '它不 过就是一个转发而已'} >>>
删
pop(key)
#新建字典 >>> a = {"a":"b","c":"dd"} #删除字段key >>> a.pop('a') 'b' #查询 >>> a {'c': 'dd'}
del dict[key]
#新建字典 >>> a = {"a":"b","c":"dd"} # 根据del规则删除key >>> del a['a'] # 查询 >>> a {'c': 'dd'}
改
#新建字典 >>> a = {"a":"b","c":"dd"} # 修改 >>> a['a']="学习是一个快乐的事情,分享体现价值的事情" # 查询 >>> a {'a': '学习是一个快乐的事情,分享体现价值的事情', 'c': 'dd'}
查
#查看该字典下有什么方法可以用 >>> dir(a) ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

#根据上面方法可以用 #遍历字典 >>> >>> for k,v in a.items(): ... print("key=%s,value=%s"%(k,v)) ... key=a,value=学习是一个快乐的事情,分享体现价值的事情 key=c,value=dd >>> >>> for key in a: ... print("key=%s"%a[key]) ... key=学习是一个快乐的事情,分享体现价值的事情 key=dd #遍历value值 >>> for value in a.values(): ... print(value) ... 学习是一个快乐的事情,分享体现价值的事情 dd >>>
图说明

简单的说:每次请求服务器,服务器会给客户端发送一个动态值,但服务器会每次校验客户端是否携带该值并做对比,如果每次请求携带值与发送的值是正确就放行,如果不正确就返回失败获取其他步骤。
环境搭建
django参考代码
from django.shortcuts import render from django.http import HttpResponse, JsonResponse import time # Create your views here. def index_seven(request): return HttpResponse("欢迎 性能测试人员 进入开发性能架构师!") # Create your views here. def index(request): return render(request, "index.html") param = [] # 登录 def login(request): if request.method == "POST": username = request.POST.get('username', '') password = request.POST.get('password', '') if username == 'admin' and password == 'admin': timesoo = time.time() param.append(timesoo) result = {'code': 200, 'msg': 'success', "reslutselect": param[0]} return JsonResponse(result) else: result = {'code': 111, 'msg': 'username or password error'} return JsonResponse(result) # return render(request, 'index.html', {'error': 'username or password error!'}) def select(request): if request.method == "POST": msg = request.POST.get('msg', '') res = request.POST.get('reslutselect', '') if msg == 'success' or res is not None: result = {'code': 200, 'msg': '恭喜你成功'} return JsonResponse(result) else: result = {'code': 111, 'msg': '恭喜未登录'} return JsonResponse(result) # return render(request, 'index.html', {'error': '恭喜你没有登录'})
路由参考代码
from django.contrib import admin from django.urls import path from django.conf.urls import url from sevenapp import views urlpatterns = [ path('admin/', admin.site.urls), url(r'^index/$', views.index), # 添加index/路径配置 url(r'^login/$', views.login), # 添加简单登录 url(r'^query/$', views.select), # 添加简单登录 ]
运行效果


Jmeter脚本编写
登录

查询

关联JSON Extractor提取器
1、第一从响应结果获取响应的关联数据:

2、增加JSON Extractor并填写表达式

解释
- Names of Created variables:保存的变量名,后面使用${Variable names}引用
- JSON Path expressions:上一步中调试通过的json path表达式
- Match Numbers:匹配数字(0代表随机,1代表第一个,-1代表所有)
- Default Values:找不到时默认值,一般设置为NOT FOUND
- Compute concatenation var(suffix_ALL):是否统计所有,即将匹配到的所有值保存,名为“变量名_ALL”,使用场景需要获取的值有多个,后面需要对这一组数据进行操作。
简单语法
JsonPath |
描述 |
---|---|
$ |
根节点 |
@ |
当前节点 |
.or[] |
子节点 |
.. |
选择所有符合条件的节点 |
* |
所有节点 |
[] |
迭代器标示,如数组下标 |
[,] |
支持迭代器中做多选 |
[start:end:step] |
数组切片运算符 |
?() |
支持过滤操作 |
() |
支持表达式计算 |
结果:
登录查询获取结果给第二个请求

关联效果

总结
上面是简单的操作步骤,相信大家看看就明白,话说《言语道断》
送大家一篇《诸葛亮》修身文章:
夫君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。夫学须静也,才须学也,非学无以广才,非志无以成学。淫慢则不能励精,险躁则不能治性。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及!