1、目標java
使用jmeter進行HTTP接口壓力測試;linux
命令行方式運行,方便在linux環境運行;正則表達式
2、面臨的問題shell
3、解決辦法api
jmeter支持在任意可輸入位置使用函數,jmeter內置函數支持使用傳入變量。使用這兩個特性能夠把配置在運行時傳入:dom
使用方法:函數
傳入: -J參數名=參數值oop
使用:${__P(參數名, 默認值)}測試
使用示例(傳入線程數配置):ui
傳入: 命令行執行方式 /jmeter安裝目錄/bin/jmeter -n -Jthreadnums=10
使用:在線程數配置處填寫:${__P(threadnums, 1)}
建立獨立的用戶登陸腳本,腳本讀取用戶基本信息,登陸後把結果格式化輸出到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