jmeter下載安裝略過不談,上步驟:java
1.在測試計劃新建-threads-線程組linux
2.在工做臺新建-非測試原件-http代理服務器,設置端口和包含網址 不包含網址shell
3.在手機/瀏覽器,設置代理服務器網絡和端口(本身百度)apache
4.點擊http代理服務器的啓動,就能夠開始錄製腳本了。json
HTTP代理服務器的設置以下:ubuntu
1.添加斷言windows
1.apply to 指定斷言做用範圍瀏覽器
2.響應文本服務器
響應代碼 code(200、300)網絡
響應信息 (msg )
3.參數化數據,導入txt文件
4.設置循環次數和持續時間
5.添加察看結果數
6.開始運行腳本
7.查看結果
8.分析數據
step1.
對http請求添加beanshell斷言
step2.
導入json解析包,並存入jmeter安裝路徑的lib文件夾
step3.
根據接口文檔編寫對應的beanshell腳本
e.g:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; String resp=new String(ResponseData); JSONObject jsonObject=JSON.parseObject(resp); int ret=jsonObject.getIntValue("ret"); int errorCode=jsonObject.getIntValue("error_code"); String msg = jsonObject.getString("msg"); //long serverTime=jsonObject.getString("server_time"); Object data = ""; if(jsonObject.containsKey("data")){ Object dataObject=jsonObject.get("data"); if(dataObject instanceof JSONObject){ data= jsonObject.getJSONObject("data"); }else if(dataObject instanceof JSONArray){ data=jsonObject.getJSONArray("data"); } }else{ Failure=true; FailureMessage="返回結果中沒有data數據"; } if((ret==0)&&(errorCode==0)&&(msg=="")&&(data.toString()!="")){ Failure=false; }else if(ret==1){ Failure=true; FailureMessage="ret返回爲1,沒有活動配置"; }else if(errorCode==500){ Failure=true; FailureMessage="errorCode=500,沒有活動配置"; }else{ Failure=true; FailureMessage="msg、data返回有誤"; }
public class TestFast { public static void main(String[]args){ String resp=""; int length=resp.length(); int flag=-1; if(length>2){ int i=0; // 從第1位的字符開始找,是否是{,若是不是,查看下一個,找到第n個,還不是,就報錯 while(i<3){ if(resp.charAt(i)==123){ flag=0; break; } else{ i++; } } if(flag==0){ System.out.println("this is a json"); }else{ System.out.println("this is not a json"); } //不是,就判斷失敗,給出結論 }else { System.out.println("the response is not a json,the length is 0 or 1,or 2(not {})"); } } }
前情提要:1.會一點點jmeter的腳本錄製和編輯,徹底沒實際操做過壓測,review一下第一次實踐。
2.壓測使用的是HTTP請求,且未加密;
3.壓測的10個接口沒有數據關聯和數據要求,就是數據隨便輸入隨便設置;
4.review會省略一些基本知識的解釋,好比jmeter的斷言/參數化/內置參數、linux基本操做、爲何監控這些數據、基礎的計算機網絡知識等等
1、.接到任務,拿到道具:
①接口文檔
②壓測地址
③壓測客戶機雲地址(由於自用的PC機器性能不佳,因此使用的騰訊雲部署上面的機器)
④提測郵件/需求
2、.分析提測需求:
性能指標以下,其實很奇怪啊,若是接口響應時間5s,用戶早就流失了吧?
監控的指標須要有:(日活躍用於設置併發數量,理論30w日活的休閒遊戲,單個接口併發200-300線程的數據須要達到對應標準TPS>500,響應時間<1s,CPU消耗80%,內存消耗<80%,不一樣項目的需求會有出入),TPS,響應時間,服務器CPU佔用,服務器Memory佔用
準備測試工具:jmeter(由於只會這個),xshell(用於在騰訊雲的跑腳本的ubuntu機器上執行腳本,登錄的時候還要用Authenticator來獲取密碼)
3、針對接口文檔,編寫測試腳本
1.接口文檔以下(這裏只po一個接口):
2.針對接口文檔,編寫jmeter腳本
步驟以下:添加線程組--在線程組上添加samples-http請求-編輯http請求的數據-針對http請求添加Beanshell斷言+響應斷言(這裏提供兩種方式斷言,任選一種便可)-針對線程組增長監聽器-察看結果數+聚合報告(這裏提供兩種報告,前者用來查看報錯信息,後者用來查看壓測結果)-設置併發數據
添加線程組:
添加HTTP請求,根據接口文檔編輯請求內容:
添加Beanshell斷言和響應斷言(因爲接口比較簡單,因此任選其一便可,建議選擇響應斷言,比較簡單方便):
編輯beanshell斷言內容:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; String resp=new String(ResponseData); if(resp.equals("")||resp==null){ Failure=true; FailureMessage="resp是空的"; } else if(resp.startsWith("<")){ Failure=true; FailureMessage="resp以<開頭"+resp; }else{ JSONObject jsonObject=JSON.parseObject(resp); int ret=jsonObject.getIntValue("ret"); int errorCode=jsonObject.getIntValue("error_code"); String msg = jsonObject.getString("msg"); //long serverTime=jsonObject.getString("server_time"); Object data = ""; if(jsonObject.containsKey("data")){ Object dataObject=jsonObject.get("data"); if(dataObject instanceof JSONObject){ data= jsonObject.getJSONObject("data"); }else if(dataObject instanceof JSONArray){ data=jsonObject.getJSONArray("data"); } }else{ Failure=true; FailureMessage="返回結果中沒有data數據"; } //String userId=data.getString("userId"); // 對data的內容來get值 //String openId=data.getString("openId"); //String avatar=data.getString("avatar"); //String nickname=data.getString("nickname"); //若是要看data傳回的內容不是空的,怎麼判斷 if((ret==0)&&(errorCode==0)&&(msg.equals(""))/*&&(serverTime!=0)*/&&(data.toString()!="")){ Failure=false; }else if(ret==1){ Failure=true; FailureMessage="ret返回爲1"; }else{ Failure=true; FailureMessage="msg、data返回有誤"; } }
注:這裏使用的fastJson來解析json返回,因此須要事先導入fastjson的jar包,導入jar包的步驟很簡單,就是把jar包放入jmeter安裝路徑的lib目錄下
添加響應斷言,編輯響應斷言:
注:這裏的響應斷言和上面的beanshell實現的是同一個東西,響應斷言會更簡單,不用本身BBBBB寫一大堆。
這裏寫beanshell主要是由於,當前項目沒有用到,可是事實上其餘項目會用的比較多,因此想練練_(:з」∠)_。
有的項目使用加密的數據包,咱們在請求的時候,須要對數據加密;在斷言的時候,要對數據解密;有的項目驗證接口之間有數據關聯,就致使咱們先後的數據須要作關聯,用beanshell語句來鏈接(beanshell preProcessor/beanshell postProcessor/beanshell斷言等等)
添加察看結果數、聚合報告
注:這裏的察看結果數和聚合報告,須要存兩個不一樣的文件,由於存儲方式不一樣,存相同路徑的話,會都覆蓋成聚合報告
設置併發數量,併發200線程,持續5min壓測
4、執行壓測
若是本身的PC性能OK的,直接本身windows跑了。
若是本身PC不行的,要在linux客戶機上跑的,就xshell鏈接上客戶機,而後進入jmeter的bin目錄,上傳測試腳本,輸入語句執行。
客戶機操做:1.安裝jdk 2.上傳jmeter(腳本有用jar包的,要在lib裏面存入jar包)3.進入jmeter的目錄,執行腳本
cd /data/test/apache-jmeter-3.1/bin
rz -e 上傳 test.jmx文件
java -jar ApacheJMeter.jar -n -t 壓測腳本.jmx -l 結果文件.jtl
sz 結果文件.jtl 導出結果文件到本地
5、 分析結果
1.分析聚合報告:
前面編輯腳本:併發200線程,持續5分鐘----獲得結果:請求總數142w,平均響應時間47ms,錯誤率0.00%,TPS 4105
響應時間47ms,響應很快,TPS 4105事務處理能力優越,錯誤率低於0.01%。說明腳本執行狀況很好,此時須要查看服務器的CPU和memory使用狀況,肯定是否繼續加壓。
這裏服務器性能監控,沒有須要本身去搗鼓,直接找運維要zabbix帳號上去瞄瞄就能夠了,主要查看CPU load,CPU使用狀況,memory使用狀況。若是發現CPU或者聚合報告的內容異常,能夠查看network traffic裏面的數據流量( 每秒流量=每秒請求數*請求大小)。
這裏看到,CPU利用率max值是80%,CPU負載的max值是7(意思是當前每核處理的請求數量,服務器是4核的,數值8+就算滿載)。
加壓看看TPS有沒有增長(這個時候CPU接近滿載,加壓的話過載的可能性很高)。這裏加壓到300併發看了下,TPS是差很少了,錯誤率爲0,就不貼圖了。
CPU接近滿載,併發數增長的狀況下,TPS穩定,結果基本能夠肯定了。
這裏的memory佔用就不貼圖了,基本維持在400mb。
6、出具報告
提測內容是看30w日活的時候的各個數據,這裏策略是加壓200時查看各項數據,加壓200,CPU佔用80%+,memory佔用<80%,TPS>500,響應時間<5s,測試經過。
上次測試的內容,今天須要添加一個接口壓測。
測試結果以下:
壓測的執行時間5分鐘,總共發送5w請求,單個請求響應時間是308ms,這裏請求設置的connect時間5s,響應時間10s。
併發50線程時,TPS峯值只有150,比其餘接口要弱10倍左右,且錯誤率大於0.01%;
這裏原本只關注了tps不合格的問題,已經錯誤率。master說,這個響應時間太長,並且流量每秒3.4MB,帶寬消耗很大。
最後運維肯定說是帶寬跑滿了,問了帶寬,30Mbps;
master說難怪了 早就跑滿了。。。。
媽個雞 不懂