jmeter-錄製, 編輯腳本,性能測試全過程review

 

錄製腳本

 

 

 

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.分析數據

jmeter③添加beanshell腳本斷言返回的json內容

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返回有誤";
}

 

驗證是不是json語句-用於json斷言

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 {})");
}
}
}

  

 

性能測試全過程review

前情提要: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說難怪了 早就跑滿了。。。。

 

媽個雞 不懂

相關文章
相關標籤/搜索