1. 程式人生 > 實用技巧 >介面測試基礎05

介面測試基礎05

Jmeter元件:斷言(重點)

A、 是什麼?

介面測試原理:
請求:是否正確,預設請求成功是200(GET),如果請求錯誤也能返回404、500等。
檢查:返回資料的正確性與完整性
程式代替人工判斷響應結果是否符合預期

B、 為什麼?

安全、高效、功能強大。

C、怎麼用?

斷言的分類
 1) 響應斷言
 2) Size Assertion(Size 斷言)
 3) Duration Assertion (持續時間斷言)

響應斷言

Jmeter中一種斷言元件,可斷言響應(資訊頭內容、主體內容、響應程式碼) 
解決方案分析
1. 測試計劃-執行緒組
2. 執行緒組-HTTP請求
3. HTTP請求->斷言->響應斷言
4. 測試計劃->監聽器->察看結果樹
5. 測試計劃->監聽器->斷言結果
技術難點分析
1.斷言程式碼
2.斷言資料(T02)
響應斷言配置圖-斷言程式碼
1. 響應程式碼: 只有選擇響應程式碼,Jmeter才去拿預期結果和響應程式碼去對比
2. 要測試的模式:這裡填寫我們的預期結果;如:200   
響應斷言配置圖-斷言資料
1. 響應文字:只有選擇響應文字,Jmeter才去拿預期結果和響應資料去對比
2. 要測試的模式:這裡填寫我們的預期結果;如:T02 
斷言結果
作用:斷言執行成功預設不顯示,如果斷言失敗,記錄每次失敗原因
響應斷言-總結:
1. 斷言概念
2. 斷言響應程式碼
3. 斷言響應資料
4. 斷言結果作用
需求2
使用斷言需求1所返回的主體資料大小是否小於100kb  
問題
1. 響應斷言如何判斷返回的資料大小小於100kb?

Size Assertion(Size 斷言)

作用:主要判斷返回資料的大小是否屬於預期資料大小範圍
(Response Header、Response Body、響應資訊)
解決方案分析
1. 執行緒組->斷言->Size Assertion(Size 斷言)
技術難點分析
1. 斷言響應主體資料大小
Size Assertion(Size 斷言)配置圖
1. Response Body:選擇此項判斷返回主體資料Body的大小
2. 位元組大小:設定要判斷數值 單位bytes/kb
3. <:小於符號,說明判斷要返回Body主體資料大小小於100kb
4.Response Headers=響應程式碼+響應資訊
Size Assertion(Size 斷言)-總結:
1. 作用
2. 可斷言哪些大小
需求3
1.斷言需求1所返回的響應時間是否小於10毫秒
問題
1.基於響應斷言、Size Assertion怎麼去斷言請求的響應時間是否小於10毫秒?

斷言持續時間

作用:斷言伺服器響應請求的時間是否小於指定值; 
解決方案分析
1. 執行緒組->斷言->斷言持續時間
技術難點分析
1.時間設定
斷言持續時間配置圖
1. 持續時間(毫秒):這裡的持續時間為毫秒,比如:10 毫秒。
2. 斷言響應時間是否超過設定的值(10),如果超過則斷言失敗,反之成功
斷言持續時間-總結
1. 作用
2. 單位
3. 斷言成功標準

斷言-總結:

作用:
1. 響應斷言:斷言響應程式碼/響應資料
2. Size Assertion:斷言響應資料大小是否在指定範圍
3. 斷言持續時間:斷言響應資料時間是否在指定時間範圍
指令碼-效果圖:問題
1. 樹形標籤欄裡的層級結構是有什麼意義?

Jmeter元件:集合點

A、是什麼?

Jmeter 內建元件之一,可以啟動多個使用者,讓多個使用者在同一刻去訪問伺服器

B、為什麼?

可以模擬高併發實現,測試伺服器效能

C、怎麼用?

需求
1. 學院查詢-所有 http://127.0.0.1:8000/api/departments/
2. 學院查詢-指定 http://127.0.0.1:8000/api/departments/T02/
需求對(學院查詢-所有)這個介面進行20個使用者【同時】請求訪問操作。
問題
1. 設定執行緒組迴圈次數為:20,解決不了需求問題
2. 設定執行緒組執行緒數量為:20,同樣解決不了問題
集合點
作用:集合點用以同步虛擬使用者,以便恰好在同一時刻執行任務。
解決方案分析
1. 測試計劃->執行緒組
2. 執行緒組->Sampler->HTTP請求(學院查詢-所有)
3. 執行緒組->Sampler->HTTP請求(學院查詢-指定)
4. HTTP請求(學院查詢-所有)->定時器->Synchronizing Timer
5. 測試計劃->監聽器->察看結果樹
場景:模擬 N 個使用者在同一時刻查詢學院資訊操作 
C-1、搭建框架(測試計劃、結果樹、執行緒組、http請求)
	  執行緒組通過執行緒數模擬多個使用者
C-2、新增集合點元件
	 定時器  -----> 同步定時器 
	 元件屬性1: 一組使用者數
	 元件屬性2: 超時時間  
C-3、執行檢視結果
	執行流程:
	1)、啟動執行緒 ----> 右上角
	2)、所有執行緒啟動完畢,再統一執行
C-4、注意
	超時時間可以設定為 0 : 無限等待
	建議 : 執行緒總數整除集合點的一組執行緒數,否則會掛起
集合點引數配置圖
1. Number of Simulated Users to Group 
   by:集合多少使用者後再執行請求(也就是執行的執行緒數)

擴充套件選項:
2. Timeout in milliseconds:超時時間(毫秒)
    1) 設定為0,無限等待,直到達到集合點設定的執行緒數。
    2) 設定指定時長,如果到達指定時長,集合點數量未到達,集合多少使用者釋放多少使用者數量。
檢視結果新增聚合報告:

Jmeter元件:函式

A、是什麼?

是程式中的封裝單元(最小的),封裝一些功能實現

B、為什麼?(瞭解)

1. 使用函式我們可以1次【批量】的對學院資源進行新增
2. 使用函式我們可以利用函式讀取外部資料進行引數化
3. 使用函式我們可以設定指定動態資料的資料為全域性變數

C、怎麼用?

流程:
1)、開啟Jmeter 內建的函式功能模組
2)、選擇要呼叫的函式,傳引數,生成呼叫格式
3)、哪裡需要粘哪裡

D、函式分類:

Jmeter常用函式
1. __CSVRead
2. __counter 
3. __Random
4. __time
5. __setProperty
6. __property

以上為我們使用Jmeter測試專案時常用的函式,接下來我們將逐個學習;
在學習這些函式之前我們先介紹下:
1) Jmeter函式格式
2) 函式助手對話方塊
Jmeter函式的格式
1. ${__functionName(var1,var2,var3)} 
     1) ${} 函式引用固定格式和引數化相同
     2) __functionName匹配被呼叫的函式名稱;
     3) 用圓括號包含函式的形參,例如${__time(YMD)},不同函式要求的引數也不同;
     4) 有些JMeter函式不要求引數,則可以不使用圓括號,例如${__threadNum};
函式助手對話方塊
作用:對Jmeter中自帶函式的引數設定和生成使用
啟動方式:
    1) 選單(選項)-->函式助手對話方塊
    2) Ctrl+Shift+F1
    3) 工具欄倒數第二個 圖示"記事本"  
作用:對Jmeter中自帶函式的引數設定和生成使用
啟動方式:
    1) 選單(選項)-->函式助手對話方塊
    2) Ctrl+Shift+F1
    3) 工具欄倒數第二個 圖示"記事本"  

__CSVRead 函式

作用:csvRead函式是從外部讀取引數,csvRead函式可以從一個檔案中讀取多個引數
案例1
通過CSVRead函式讀取csv.txt內容,作為請求時介面所需引數的值使用

http://127.0.0.1:8000/api/departments/?$dep_id_list=${__CSVRead(E:\jmeterScript\引數\csv.txt,0)}
,${__CSVRead(E:\jmeterScript\引數\csv.txt,1)}

csv.txt內容
    T01,T02
    T03,T04
    T05,T06
操作分析
1. 測試計劃->執行緒組
2. 執行緒組->HTTP請求
3. 函式助手對話方塊->__CSVRead
4. 測試計劃->監聽器->察看結果樹
技術難點
1. __CSVRead 引數設定
2. 執行緒組 (執行緒數)
__CSVRead 引數配置圖
1. 選擇一個功能:選擇__CSVRead
2. CSV file to get values from | *alias:要讀取的檔案路徑-(絕對路徑)
3. CSV檔案列號| next| *alias:從第幾列開始讀取,注意第一列是0
4. 點選生成函式引用格式
5. 全選複製
__CSVRead-總結:
1. 絕對路徑
2. 列的開始索引
3. 多行引數使用執行緒數,通過執行緒數來迭代資料 	
注意:CSV Data Set Config 執行多次是使用的迴圈次數,而 CSVRead 執行多次使用的是執行緒數

__counter函式

作用:這個函式是一個計數器,用於統計函式的使用次數  
案例2
使用counter計次函式,請求(查詢學院-所有)10次,為每次請求做計次標識  
http://127.0.0.1:8000/api/departments/?num=${__counter(FALSE,)}
操作分析
1. 測試計劃->執行緒組
2. 執行緒組->HTTP請求
3. 函式助手對話方塊->__counter
4. 測試計劃->監聽器->察看結果樹
技術難點
1. __counter函式引數設定
2. 設定計數引數名
__counter函式配置圖
1. TRUE,每個使用者有自己的計數器;FALSE,使用全域性計數器:
    1) TRUE:  每個使用者有自己的計數器,可以用於統計每個執行緒各執行了多少次
    2) FALSE: 使用全域性計數器,可以統計出這次測試共運行了多少次用
__counter函式-總結
1. __counter函式作用
2. __counter函式與指定值配合使用 num=${__counter(FALSE,)}

__Random函式

作用:隨機生成一個指定範圍內的數值   
案例3
使用__Random函式對請求(查詢學院-指定)進行隨機查詢
http://127.0.0.1:8000/api/departments/T0${__Random(1,6,)}/
操作分析
1. 測試計劃->執行緒組
2. 執行緒組->HTTP請求
3. 函式助手對話方塊->__Random
4. 測試計劃->監聽器->察看結果樹
__Random函式配置圖
1. 一個範圍內的最小值:隨機數生成時開始數,也是最小數
2. 一個範圍內允許的最大值:隨機生成結束數,也是最大數
__Random-總結
1. __Random作用
2. __Random設定

__time函式

作用:獲取當前電腦日期時間 比如:MMddhhmmss 月/日/時分秒
案例4
使用__time函式解決迭代(學院-新增)dep_id重複問題

JSON報文:
        {
            "data": [
                        {
                            "dep_id":"time${__time(MMddhhmmss,)}",
                            "dep_name":"Test學院",
                            "master_name":"Test-Master",
                            "slogan":"Here is Slogan"
                        }
                      ]
        }
操作分析
1. 測試計劃->HTTP資訊頭管理器
2. 測試計劃->執行緒組
3. 執行緒組->HTTP請求
4. 函式助手對話方塊->__time函式
5. 測試計劃->監聽器->察看結果樹   
技術難點分析
1. HTTP資訊頭管理器設定
2. HTTP新增請求方法
3. __time函式引數
__time函式引數配置圖
1. Format string for SimpleDateFormat (optional):
    1) 為空:返回毫秒
    2) 設定格式:MMddhhmmss 月/日/時/分/秒   
__time函式-總結
1. __time作用
2. __time引數設定

__setProperty函式

作用:用於把指定資料設定成Jmeter屬性,可以理解為是把指定資料設定成全域性變數  
案例5
1. 通過__setProperty函式把新增的學院ID,設定成全域性變數
操作分析
1. 測試計劃-HTTP資訊頭管理器
2. 測試計劃->JDBC Connection Configuration
3. 測試計劃->執行緒組(學院-新增)
4. 執行緒組->HTTP請求(HTTP請求-學院新增)
5. 執行緒組->JDBC Request
6. 函式助手對話方塊->__setProperty函式
7. 執行緒組->BeanShell Sampler
8. 執行緒組->Debug Sampler
9. 測試計劃->察看結果樹
10. 工作臺->Property Display
技術難點分析
1. __setProperty函式引數設定
2. BeanShell Sampler作用 
3. JDBC Request SQL語句
4. 如何知道設定的屬性(全域性變數)成功了
__setProperty函式引數配置圖
1. 屬性名稱:要設定的屬性名稱也就是全域性變數名
2. Value of property:屬性的值(全域性變數的值)  
BeanShell Sampler 元件配置圖
作用:可執行JavaScript的一種容器
需求:
 需求:http 請求1 訪問百度,將請求1響應的 title 值傳遞給請求2,但是兩個請求不屬於同一個執行緒組
      http 請求2 訪問 google  /?wd=百度一下你就知道
 實現思想 :

	  將執行緒組內部的資料匯出去,儲存在共享空間中,其他執行緒組要使用資料,就從共享空間獲取
實現流程:
	 1)、將資料從當前執行緒組匯出 __setProperty
		 變數名
		 變數值  ${變數名}		
		 使用 BeanShell Sampler 呼叫函式
	 2)、另外一個執行緒組將匯出到共享空間的資料引入 __property
		根據變數名獲取 
        注意:
        檢視共享資料,工作臺 ----> 新增 -----> 非測試元件 ----> property display

__property函式

作用:獲取Jmeter中屬性值
解決方案分析
1. 選中案例5中測試計劃-獨立執行每個執行緒組選項
2. 基於案例5中測試計劃->執行緒組(執行緒組-讀取depid屬性)
3. 執行緒組(執行緒組-讀取depid屬性)->HTTP請求(HTTP請求-讀取depid屬性)
4. 函式助手對話方塊-__property函式  
__property函式配置圖
1. Name of variable in which to store the result (optional):獲取屬性的名稱

Jmeter:分散式

A、是什麼

多臺測試機協作(叢集方式)完成測試任務

B、為什麼

1. 我們單臺電腦由於配置(CPU、記憶體)問題,最模擬500使用者時,就出現卡死現象   
(當執行緒組)

C、怎麼用

分散式原理
1. 一臺電腦作為控制機(Controller),其它電腦做為執行機(Agent);
2. 執行時,控制機會把指令碼傳送到每臺執行機上,執行機拿到指令碼後就開始執行
3. 執行機執行時不需要啟動Jmeter介面,可以理解它是通過命令列模式執行的
4. 執行完成後,執行機會把結果回傳給控制機,控制機會收集所有執行機的資訊並彙總
環境搭建
1) 、搭建偽分散式環境,一臺裝置模擬 3 臺

2)、在同一臺裝置開啟 3 個 Jmeter 即可
 	複製 3 個 Jmeter,因為要同時啟動然後網路間進行資料互動,修改埠號
3)、偽分散式下配置埠號
	執行機 A,設定一個埠號: 6666
	執行機 B,設定一個埠號: 7777
	控制機要定址執行機 ,配置: remote-hosts=執行機A IP:6666,執行機B IP:7777

C-3、分散式測試:
	1) 、需求:平均分配 1000 個使用者分別給 執行機A 和 執行機B 執行
		控制機編寫相關指令碼
	2)、分配給執行機
解決方案分析
1. 1臺電腦(控制機)分發執行任務
2. 2臺電腦(執行機)執行任務
3. 在執行機上啟動監聽服務程式
4. 在控制機上啟動執行
5. 測試計劃->聚合報告
技術難點分析
1. 執行機-jmeter.properties設定
2. 控制機jmeter.properties設定
3. 執行機啟動分散式監聽服務程式
3. 2臺執行機,使用者數如何設定
執行機Jmeter.properties配置圖
1. 開啟bin目錄下jmeter.properties配置檔案
2. server_port=1099
    1) 1099:為執行機自定義埠號
3. 提示:
    1) 去除備註符號 # 
    2) 自定義埠號時,注意選擇未被佔用埠號
控制機Jmeter.properties配置圖
1. remote_hosts=127.0.0.1:1099,127.0.0.1:1100
    1) remote_hosts:為執行機IP地址和埠號
2. 注意:
    1) 多個執行機之間使用逗號(,)隔開
執行機啟動分散式監聽程式效果圖
1. 執行bin目錄下jmeter-server.bat
2. 執行後勿關閉黑色視窗
控制機-執行緒數設定圖:
1. 需求1000使用者,兩臺執行機同時接受控制機指令碼去執行然後反饋給控制機,所以執行緒數設定500
控制機-執行分散式執行機圖
1. 選單-執行->選擇全部啟動
2. 快捷鍵->Ctrl+Shift+R
聚合報告
這裡先不做講解,我們只看# Samples屬性,檢視統計取樣數量
提示
1. 修改完埠要重啟Jmeter.bat
2. 控制機和執行機分開(為了方便教學,這裡採用控制機和代理機在1臺機器上)
   1). 由於控制機需要傳送資訊給執行機並且會接受執行機回傳的測試資料所以控制機自身會有消耗
3. 引數檔案:如果使用csv進行引數化,那麼需要把引數檔案在每臺執行機上拷一份且路徑需要設定成一樣的;
4. 每臺機器上安裝的Jmeter版本和外掛最好都一致,否則會出一些意外的問題;
5. 執行機上Jmeter也許需要配置JDK環境變數;

分散式-總結

1. 分散式概念
2. 分散式原理
3. 執行機配置檔案設定
4. 控制機配置檔案設定
5. 控制機執行緒數設定