1. 程式人生 > >Jmeter——如何使得token在各執行緒組間引用的遊刃有餘

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/