­

性能工具之Jmeter关联小白学习

  • 2019 年 12 月 24 日
  • 筆記

背景

性能测试关联是每个性能测试人员必须掌握的技能,记得2013年做性能测试,关联对于我来说是一个比较紧张与害怕的事情,记得当时在给财务公司做网银性能测试就用到了关联,当时让会的同事教我,也许因为怕教他人饿死自己,每次请教的时候都是模拟两可,总是说就这样写就行。后面做完项目后,自己花了时间与精力终于搞定什么是关联,为什么要做关联,中国有一句古话《求人不如求己》,只有自己掌握核心技能或者自己在某方面有沉淀,所有人脉自然就来,古人云《富贵深山有远亲,贫穷闹市无近邻》。

知识点

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]

数组切片运算符

?()

支持过滤操作

()

支持表达式计算

结果:

登录查询获取结果给第二个请求

关联效果

总结

上面是简单的操作步骤,相信大家看看就明白,话说《言语道断》

送大家一篇《诸葛亮》修身文章:

夫君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。夫学须静也,才须学也,非学无以广才,非志无以成学。淫慢则不能励精,险躁则不能治性。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及!