Jmeter——如何使得token在各執行緒組間引用的遊刃有餘
在以前的博文中,有介紹過,jmeter基本的關聯,關聯就是將引數在各介面中動態傳參,使得介面指令碼變得靈活使用,非一次性指令碼。今天再來介紹一種jmeter全域性變數的設定與使用,可以讓指令碼運用更豐富,場景覆蓋更廣。
應用場景
在做效能測試或多業務場景測試時,將多個業務寫在多個執行緒組中,但都是一個正常的流程。全程只需登入一次,這時就需要設定全域性變數來實現。我們也知道,只將token提取並設定為一個普通變數的話,是不能實現跨執行緒組呼叫的。跨執行緒組呼叫,只能引用全域性變數。
使用場景
前置處理器BeanShell PreProcessor
使用前置處理器BeanShell PreProcessor,編寫如下程式碼:
通過vars.put()方法,將a1的值寫入到token中
在資訊頭中,引用該引數如下,使用的是__P()函式,__P()是一個簡化的屬性函式,用於與命令列上定義的屬性一起使用。
執行指令碼,檢視資料,在執行日誌中檢視token
在請求頭中檢視token資料
後置處理器BeanShell PostProcessor
使用後置處理器BeanShell PostProcessor,編寫程式碼如下:
線上程組2中的資訊頭裡引用如下
執行指令碼,檢視資料
__setProperty(,,)函式
在後置處理器中,使用__setProperty(,,)函式,函式介紹如下:
該函式用於設定 JMeter 屬性的值。
函式的預設返回值是空字串,因此該函式可以被用在任何地方,只要對函式本身呼叫是正確的。
通過將函式可選的第3個引數設定為"true",函式就會返回屬性的原始值。
屬性對於JMeter是全域性的,因此可以被用來線上程和執行緒組之間通訊。
在後置處理器中,編寫程式碼如下:
線上程組2中的資訊頭中引用如下:
__property函式是用於獲取屬性值
示例:
${__property(department.id)} 返回 department.id 的值。
${__property(department.id,UUID)} 返回 department.id 的值,並儲存在變數 UUID 中。
${__property(abcd,ABCD,atod)} 返回屬性 abcd 的值,如果該屬性未定義則返回 atod,並儲存在變數 ABCD 中。
${__property(abcd,,atod)} 返回屬性 abcd 的值,如果該屬性未定義則返回 atod,不儲存結果值。
執行指令碼,檢視結果
引數化跨執行緒傳參
使用後置處理器BeanShell PostProcessor,將登入獲取到的token,寫入到檔案中,並引用csv元件進行引數化。這種方式稍微麻煩點,但還是能夠滿足跨執行緒呼叫引數的,後置處理器中的參考程式碼如下:
1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileReader; 4 import java.io.IOException; 5 import java.io.FileWriter; 6 import java.io.BufferedWriter; 7 8 String filePath = System.getProperty("user.dir") + "/login.txt"; 9 log.info(System.getProperty("user.dir") + "/login.txt" ); 10 vars.put("filePath",filePath); 11 File file = new File(filePath); 12 13 try { 14 if (file.exists()){ 15 file.delete(); 16 } 17 file.createNewFile(); 18 FileWriter fs = new FileWriter(filePath,true); 19 BufferedWriter bw = new BufferedWriter(fs); 20 21 String token=vars.get("accessToken"); 22 log.info("寫入的token:" + token); 23 bw.write(token); 24 bw.write(System.getProperty("line.separator")); 25 fs.flush(); 26 bw.close(); 27 fs.close(); 28 29 30 }catch(IOException e) { 31 e.printStackTrace(); 32 }
csv的引數配置,這裡就不贅述了,可以檢視以前的博文,有詳細介紹。
線上程組2中引用csv元件,讀取儲存到檔案中的token,csv配置如下:
在資訊頭中引用token,配置如下:
我們來執行指令碼,檢視下執行結果,是否成功?
看如下截圖,日誌列印寫入到檔案中的token與執行緒組2請求傳遞的token是一樣的,指令碼執行成功,實現了token跨執行緒的呼叫。
再來看下儲存到檔案中的token,如下:
注意
需要注意的是,多個執行緒間,將引數配置成了全域性變數,但執行還是會報錯,執行緒組間的介面請求亂序。此時,檢查下測試計劃裡的配置,有個獨立執行執行緒組的配置,如下所示。
本文僅代表作者觀點,系作者@溫一壺清酒發表。
歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
文章出處:http://www.cnblogs.com/hong-fithing/