1. 程式人生 > >Jmeter(三十五) - 從入門到精通進階篇 - 關聯(詳解教程)

Jmeter(三十五) - 從入門到精通進階篇 - 關聯(詳解教程)

1.簡介

  上一篇中介紹瞭如果想要同時傳送多條請求,那麼怎樣才能讓每條資料某些請求引數改變呢。這就用到了jMeter引數化。在實際測試場景中,我們往往還有這樣的需求,登入後伺服器響應的token作為下次請求的引數,這就是所謂的引數關聯。

  當請求之間有依賴關係,比如一個請求的入參是另一個請求返回的資料,這時候就需要用到關聯處理,Jmeter可以通過“後置處理器”中的“正則表示式提取器”來處理關聯。

  關聯是Jmeter工具中非常重要的一個技術。因為在測試過程過有些資料是經常發生變化的,要獲取並使用這些資料,就要使用關聯。

        比如: 使用者登入後,session資訊都不同,有些操作要使用session,就需要將這個動態的資訊儲存下來。 還有經常遇到的場景,第二個請求提交的引數要從第一個請求的返回資料中獲取。

2.什麼是關聯?

  什麼是關聯,通俗來講,就是請求之間通過傳遞引數建立聯絡。一般,我們需要將一個請求的響應引數,作為另一個請求的入參。比如登入後的操作,第一步實現登入請求,然後將請求返回的token提取出來儲存到一個變數中,後續請求作為入參使用。

3.jmeter的幾種引數關聯方式

3.1正則表示式提取器

1、在預設的測試計劃中新增一個執行緒組,然後新增取樣器。右鍵新增後置處理器→正則表示式提取器,正則表示式提取器介面如下:

關鍵引數說明:       

  後置處理器:在請求結束或者返回響應結果時發揮作用

       正則表示式提取器:允許使用者從伺服器的響應中通過使用perl的正則表示式提取值。該元素會作用在指定範圍取樣器,用正則表示式提取所需值,生成模板字串,並將結果儲存到給定的變數名中。

APPly to:作用範圍(返回內容的斷言範圍)
    Main sample and sub-samples:作用於父節點的取樣器及對應子節點的取樣器
    Main sample only:僅作用於父節點的取樣器
    Sub-samples only:僅作用於子節點的取樣器
    JMeter Variable:作用於jmeter變數(輸入框內可輸入jmeter的變數名稱)
要檢查的響應欄位:需要檢查的響應報文的範圍
    主體:響應報文的主體
    Body(unescaped):主體,響應的主體內容且替換了所有的html轉義符,注意html轉義符處理時不考慮上下文,因此可能有不正確的轉換,不太建議使用

    Body as a Document:從不同型別的檔案中提取文字,注意這個選項比較影響效能
    Response Headers:響應資訊頭
    Request Headers:請求資訊頭
    URL:統一資源定位符,即Internet上用來描述資訊資源的字串
    響應程式碼:響應狀態碼,比如200、404等
    響應資訊:響應資訊
引用名稱(Reference Name):Jmeter變數的名稱,儲存提取的結果;即下個請求需要引用的值、欄位、變數名(例子中我提取的是SOCIAL_NO)
正則表示式(Regular Expression):使用正則表示式解析響應結果,“()”表示提取字串中的部分值,請不要使用“||”,除非你本身需要匹配這個字元。

        常用的正則表示式操作符:

操作符

說明

例項

.

表示任何單個字元

 

[ ]

字符集,對單個字元給出範圍

[abc]表示a、b、c,[a-z]表示a-z的單個字元

[^ ]

非字符集,對單個字元給出排除範圍

[^abc]表示非a或b或c的單個字元

*

前一個字元零次或無限次擴充套件

abc* 表示ab、abc、abcc、abccc等

+

前一個字元1次貨無限次擴充套件

abc+ 表示 abc、abcc、abccc等

前一個字元0次或1次擴充套件

abc? 表示 ab、abc

|

左右表示式的任意一個

abc|def 表示 abc、def

{m}

擴充套件前一個字元m次

ab{2}c 表示 abbc

{m,n}

擴充套件前一個字元m到n次

ab{1,2}c 表示 abc、abbc

^

匹配字串開頭

^abc 表示 abc且在一個字串的開頭

$

匹配字串結尾

abc$ 表示 abc且在一個字串結尾

( )

分組標記內部只能使用|操作符

(abc)表示abc,(abc|def)表示abc、def

\d

數字,等價於0-9

 

\w

單詞字元,等價於[a-z0-9A-Z_]

 

模板:代表從正則表示式結果引用的樣式,其實結果是一組,而不是一個。$0$代表這一組結果的全部,$1$代表這一組結果的第1個,以此類推;$1$$2$代表該正則表示式一組結果中的第1個和第2個,倆結果挨在一起中間沒有間隔;$3$,$4$代表該正則表示式一組結果中的第3個和第4個,倆結果間有一個逗號相連。
匹配數字:0代表正則表示式結果組中隨機,1代表全部。
預設值:當引用不對時顯示傳遞的資訊,通暢寫一個ERROR。

        最後,根據上面的說明,完成配置,然後可以先新增一個監視器(檢視結果樹),檢查是否取到了對應的值;提取到的引數,呼叫時用${sessionid_1},${sessionid_2}...,如果想要得到匹配出的引數的個數,${sessionid_matchNr}。

 3.2例項案例

最近北京天氣特別的冷,那巨集哥就用天氣介面來實踐一下。有如下兩個介面,通過正則表示式提取器,將第一個介面的城市程式碼,作為第二個請求的引數傳入。

獲取城市程式碼介面;

  http://toy1.weather.com.cn/search?cityname=beijing

根據城市程式碼獲取天氣介面:

  http://www.weather.com.cn/data/cityinfo/101010100.html

操作步驟

1.建立http請求,獲取北京的城市程式碼,新增察看結果樹。如下圖所示:

2.執行後,在響應資料中複製目標引數及前後的字元,儘量保證複製的字串具有唯一性。 如下圖所示:

3.新增正則表示式提取器,填寫提取器相關引數。(正則表示式: "ref":"(.*?)~     ),如下圖所示:

4.新增獲取城市天氣請求,新增察看結果樹,使用${citycode}替換101010100。使用${xx}引用上述正則提取的引數。如下圖所示: 5.儲存,執行後,察看結果樹,響應結果如下圖所示:

3.2json path postprocessor(JSON Extractor)

  用處:當前介面響應返回的json中提取內容,作為變數可以在不同的請求中傳遞。如下,從登陸介面返回的json中提取user id,變數名設定為id,在其他請求中可以直接呼叫這個變數,或者作為post引數。次外掛對於restful介面非常好用。

關鍵引數說明:   

Variable names : 名稱
JSONPath Expression:JSON表示式
Match Numbers:匹配哪個,可為空即預設第一個
Default Value:未取到值的時候預設值
比如返回值如下:

{
    "code": 200,
    "message": "成功!",
    "result": {
        "apikey": "b9b3a96f7554e3bead2eccf16506c13e"
    }
}

則json表示式為:$.result.apikey

如果返回值是陣列,則需要加上陣列的位置,如

{
    "code": 200,
    "message": "成功!",
    "result": [{
        "apikey": "b9b3a96f7554e3bead2eccf16506c13e"
    }]
}

則json表示式為:$.result[0].apikey,提取第一個值。

3.3XPath Extractor

 jmeter提供的對關聯的支援包括以下2個方面:
①能夠將返回頁面上的指定內容儲存在引數中;(即正則表示式提取器和JSON Extractor)
②能夠將GET或POST方法中的資料使用該引數來替換;(XPath Extractor)
        XPath Extractor的使用方法與正則表示式提取器(Regular Expression Extractor)類似,只不過該Expression中指定的不是正則表示式,而是給定的XPath路徑。
        後置處理器(Post Processor)本質上是一種對sampler發出請求後接受到的響應資料進行處理(後處理)的方法。必須將後置處理器元件放在合適的位置才能達到預期的效果。
        新建一個執行緒組,然後右鍵-新增-後置處理器-XPath Extractor:

關鍵引數說明:   

APPly to:作用範圍(返回內容的斷言範圍)
         Main sample and sub-samples:作用於父節點的取樣器及對應子節點的取樣器
         Main sample only:僅作用於父節點的取樣器
         Sub-samples only:僅作用於子節點的取樣器
         JMeter Variable:作用於jmeter變數(輸入框內可輸入jmeter的變數名稱)
XML Parsing Options:要解析的XML引數
         Use Tidy:當需要處理的頁面是HTML格式時,必須選中該選項;如果是XML或XHTML格式(例如RSS返回),則取消選中;
         Quiet表示只顯示需要的HTML頁面,Report errors表示顯示響應報錯,Show warnings表示顯示警告;
         Use Namespaces:如果啟用該選項,後續的XML解析器將使用名稱空間來分辨;
         Validate XML:根據頁面元素模式進行檢查解析;
         Ignore Whitespace:忽略空白內容;
         Fetch external DTDs:如果選中該項,外部將使用DTD規則來獲取頁面內容;
Return entire XPath fragment of  text content:返回文字內容的整個XPath片段;
Reference Name:存放提取出的值的引數。
XPath Query:用於提取值的XPath表示式。
Default Value:引數的預設值。

3.4邊界提取器

在Boundary Extractor提取器中是4.0版本新推的一個小功能,巨集哥個人認為這個比正則最好用,跟LoadRunner關聯的左邊界右邊界相似。

例如:當我要註冊時有一個值是每次都是變化的:

<input type="hidden" name="formhash" value="0ab4d9ec" />

看這個就知道它的左邊界跟右邊界是怎麼填了name="formhash" value="11cc937d"。

 4.小結

  正則表示式提取器和XPath Extractor都可以用來提取給定頁面中的特定文字,並將其儲存在引數中,這兩種方式各有優缺點。正則表示式提取器可以用於對頁面任何文字的提取,提取的內容是根據正則表示式在頁面內容中進行文字匹配;而XPath Extractor則可以提取返回頁面任意元素的任意屬性。相比較而言,如果需要提取的文字是頁面上某元素的屬性值,建議使用XPath Extractor;而如果需要提取的文字在頁面上的位置不固定,或者不是元素的屬性,建議使用正則表示式提取器。

正則表示式提取器和XPath Extractor的區別:
①正則表示式提取器可以用於對頁面任何文字的提取,提取的內容是根據正則表示式在頁面內容中進行文字匹配;
②XPath Extractor則可以提取返回頁面任意元素的任意屬性;
③如果需要提取的文字是頁面上某元素的屬性值,建議使用XPath Extractor;
④如果需要提取的文字在頁面上的位置不固定,或者不是元素的屬性,建議使用正則表示式提取器。

  其實這個巨集哥覺得看個人習慣以及使用的熟練程度,只要你能夠將傳入下一個請求的關聯引數從上一個請求的返回結果中提取出來都是可以使用的。巨集哥這裡只不過是列舉了幾種常用的方法。

  好了時間不早了,今天就講解和分享到這裡了,最近猶豫糾結要不要回家過春節,唉,大北京,一言難盡。