性能工具之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] | 數組切片運算符 |
?() | 支援過濾操作 |
() | 支援表達式計算 |
結果:
登錄查詢獲取結果給第二個請求

關聯效果

總結
上面是簡單的操作步驟,相信大家看看就明白,話說《言語道斷》
送大家一篇《諸葛亮》修身文章:
夫君子之行,靜以修身,儉以養德。非淡泊無以明志,非寧靜無以致遠。夫學須靜也,才須學也,非學無以廣才,非志無以成學。淫慢則不能勵精,險躁則不能治性。年與時馳,意與日去,遂成枯落,多不接世,悲守窮廬,將復何及!
