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":"(.*?)~ ),如下圖所示:


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;
④如果需要提取的文本在頁面上的位置不固定,或者不是元素的屬性,建議使用正則表達式提取器。
其實這個宏哥覺得看個人習慣以及使用的熟練程度,只要你能夠將傳入下一個請求的關聯參數從上一個請求的返回結果中提取出來都是可以使用的。宏哥這里只不過是列舉了幾種常用的方法。
好了時間不早了,今天就講解和分享到這里了,最近猶豫糾結要不要回家過春節,唉,大北京,一言難盡。