jmeter壓力測試筆記- HTTP協議

1、目標java

  使用jmeter進行HTTP接口壓力測試;linux

  命令行方式運行,方便在linux環境運行;正則表達式

2、面臨的問題shell

  1. 支持多環境測試(開發、測試、生產環境)
  2. 支持用戶數據、線程數、循環次數等配置在運行時自定義
  3. 測試時HTTP包頭須要帶token, token只能在登陸時獲取;

3、解決辦法api

  • 問題1,2解決思路:配置信息參數化。

    jmeter支持在任意可輸入位置使用函數,jmeter內置函數支持使用傳入變量。使用這兩個特性能夠把配置在運行時傳入dom

    使用方法:函數

      傳入: -J參數名=參數值oop

      使用:${__P(參數名, 默認值)}測試

    使用示例(傳入線程數配置):ui

      傳入: 命令行執行方式 /jmeter安裝目錄/bin/jmeter -n -Jthreadnums=10

      使用:在線程數配置處填寫:${__P(threadnums, 1)}

  • 問題3解決思路:用戶登陸後信息自動生成到csv文件

    建立獨立的用戶登陸腳本,腳本讀取用戶基本信息,登陸後把結果格式化輸出到csv文件,供其餘測試腳本使用。這樣每次執行測試前, 執行一下登陸腳本便可,再也不須要人工準備測試用戶數據。

4、用戶登陸腳本示例

          

 

    系統須要使用手機號+設備號進行登陸

    預設:登陸腳本user.login.jmx, 用戶信息文件phone_dev.csv

    步驟1:建立csv文件,每行包含2列(手機號、設備號),逗號分隔。須要多少測試用戶則建立多少行數據

    步驟2:打開jmeter, 建立測試腳本, 保存名字爲user.login.jmx

    步驟3:爲登陸腳本增長CSV Data Set Config, 從phone_dev.csv讀取用戶信息

      關鍵配置項:

       Filename: ${__P(csv, )}              // 傳入csv文件路徑

       Variable Names: ${__P(var, )}    // csv變量列表

       Stop thread on  EOF:true            // csv讀取到結尾就結束執行。

    步驟4:增長[HTTP信息頭管理器]、[高斯隨機定時器]、[用戶自定義變量]、[查看結果樹]

    步驟5:增長HTTP請求, 更名爲[1獲取短信驗證碼]

        此接口是專爲測試增長的接口, 直接返回短信驗證碼

        增長請求參數mobile:${mobile}; deviceId:${deviceId}(引用csv變量)

        下級增長響應斷言, 驗證應答結果正確性

        下級增長正則表達式提取器, 提取驗證碼

    步驟6:增長HTTP請求,更名爲[2用戶登陸]

        下級增長響應斷言,驗證應答結果正確性

        下級增長三個正則表達式提取器, 提取token, uid, gid變量,用於輸出到csv

    步驟7:[2用戶登陸] 下級增長置處理器:Beanshell PostProcessor, 分析登陸結果並保存到csv文件

        這個是重點, 能輸出到csv文件就靠它了。

        Beanshell在Java的語法基礎上增長了本身的全局變量, 有java基礎就能夠很方便的進行Beanshell腳本開發, 這個腳本生成 的文件每行包含2個用戶,方便壓測時測試用戶間交互;

        

 1 // 讀取變量
 2 randnums = vars.getObject("randnums");
 3 url=props.get("apiurl");
 4 filepath = "";
 5 t_uid= vars.getObject("t_uid");
 6 t_devid=vars.getObject("t_devid");
 7 t_token=vars.getObject("t_token");
 8 
 9 // 判斷環境
10 if (url != null) {
11     if(url.equals("dev-api.domain.com")) {
12         filepath = "devapi-user.csv";
13     } else if(url.equals("test-api.domain.com")) {
14         filepath = "testapi-user.csv";
15     } else {
16         filepath = "api-user.csv";
17     }
18 }
19 
20 // 獲取文件絕對路徑 
21 file = new File(filepath).getAbsoluteFile();
22 
23 // 第一個用戶請求時請求清空文件
24 if(randnums == null) {
25     
26     log.info("******* user csv file:" + file.getPath());
27 
28     randnums = 0;
29     fos = new FileOutputStream(file);
30     fos.write("".getBytes());
31     fos.close();
32     
33 }
34 
35 // 第二個用戶開始寫入文件 (每行有兩個用戶的信息)
36 if(t_uid != null) {
37     fos = new FileOutputStream(file, true);
38     // uid,gid,mobile,deviceId,token
39     str = randnums 
40         + "," + vars.get("uid") 
41         + "," + vars.get("gid") 
42         + "," + vars.get("mobile") 
43         + "," + vars.get("deviceId") 
44         + "," + vars.get("token")
45         + "," + t_uid
46         + "," + t_devid
47         + "," + t_token 
48         + "\n";
49     fos.write(str.getBytes());
50     fos.close();
51 }
52 
53 // 保存變量用於下次循環使用
54 randnums = new Integer(randnums + 1);
55 vars.putObject("randnums", randnums);
56 
57 vars.putObject("t_uid", vars.get("uid"));
58 vars.putObject("t_devid", vars.get("deviceId"));
59 vars.putObject("t_token", vars.get("token"));

 

5、用戶登陸腳本調用示例

  /jmeter安裝目錄/bin/jmeter -n -Jcsv=/usr/local/jmeter/phone_dev.csv -Jvar=mobile,deviceId -t /usr/local/jmeter/user.login.jmx

 

6、其餘測試腳本說明

  其餘腳本與登陸腳本相似, 只需把HTTP請求改爲實際測試的接口

  調用: /jmeter安裝目錄/bin/jmeter -n -Jcsv=/usr/local/jmeter/dev_user.csv -Jvar=uid,gid,mobile,deviceId,token,t_uid,t_deviceId,t_token -t /usr/local/jmeter/other.test.jmx

 

7、後記

  在實際使用中,已經達到全部可配置參數都採用傳參方式。另外,腳本調用每次須要傳遞大量參數,容易出錯, 開發了簡單的shell腳本進行封裝, 能夠很方便的調用: ./runjmeter -api -jmx aaaa.jmx -threadnums 10 -loops 99999

相關文章
相關標籤/搜索