在以前的博文中,有介紹過,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,如下:
注意
需要注意的是,多個線程間,將參數配置成了全局變量,但運行還是會報錯,線程組間的接口請求亂序。此時,檢查下測試計划里的配置,有個獨立運行線程組的配置,如下所示。