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,如下:

注意

需要注意的是,多個線程間,將參數配置成了全局變量,但運行還是會報錯,線程組間的接口請求亂序。此時,檢查下測試計划里的配置,有個獨立運行線程組的配置,如下所示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM