jmeter beanshell斷言介面自動化例項
一、JMeter介紹
Apache JMeter是一款優秀的開源效能測試工具,在國外無論是在效能測試還是介面測試領域都有著非常高的使用率,但由於本身沒有完善的中文文件以及典型開源工具特點(介面不美觀)所以在國內應用並不廣泛。先說說為什麼要選擇JMeter作為介面測試工具,選擇它我主要基於以下幾個原因:
一、成本低並且對編碼要求相對不高。相較針對公司產品特性自主開發一套介面測試自動化框架,用JMeter實現介面測試無需具備非常專業的編碼能力(對於像我這樣的碼渣而言是極好的),並且成本也要低的多,很適合現如今國內各大網際網路公司流行的敏捷開發流程。
二、JMeter的擴充套件性非常好
三、JMeter是開源的。開源不僅意味著免費,更重要的是你可以通過開放的原始碼瞭解工具的所有行為,而不會像商業工具那樣僅僅只能依靠有限的幫助手冊以及網上教程。
二、安裝與環境配置
2.將apache-jmeter-3.0.zip解壓至任意位置。
3.新增環境變數:
變數名 | 變數值 |
JMETER_HOME | 填入之前安裝包解壓的路徑。例如E:\apache-jmeter-3.0 |
CLASSPATH | 在尾部新增 ;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar; |
Path | 在尾部新增 ;%JMETER_HOME%\bin; |
4.驗證配置是否成功:開啟CMD命令列視窗,輸入jmeter -v,回車,出現下圖則代表配置成功。
三、例項練習
【測試點】
1)斷言首頁精華帖數量是否大於4。
2)斷言主題為"MTSC2018 早鳥票開售..."的帖子是否為精華帖。
【思路】
首先開啟TesterHome首頁地址利用json格式化工具分析一下返回的json資料,發現是否為精華帖是由excellent這個引數定義的,excellent等於1則是精華帖,等於0則不是,那麼接下來要做的就很簡單了。
1)獲取首頁返回的json
2)解析json並計算出excellent為1的帖子數量,以此得出精華帖總數。
3)解析json獲取主題為"MTSC2018 早鳥票開售..."帖子對應的excellent值,以此判斷是否為精華帖。
【下載json依賴包】
【準備工作就緒,開工】
一、首先執行Jmeter(可以直接執行\apache-jmeter-3.0\bin下的jmeter.bat或在CMD直接輸入jmeter然後回車)
二、在"測試計劃"下依次新增執行緒組、Sampler-HTTP請求
三、在HTTP請求頁面填寫請求資訊(本例中訪問的地址無需設定請求引數),名稱隨意填寫
四、接下來新增BeanShell PostProcessor,用來獲取JSONArray物件並賦值給JMeter內建變數。但在此之前我們先新增依賴路徑使得JMeter可以正常引用json依賴包,步驟如下:
1.在"...apache-jmeter-3.0\bin"目錄下新建dependencies資料夾,並將剛才下載下來的json依賴包(json-20140107.jar)複製進去
2.開啟"...apache-jmeter-3.0\bin"目錄下的jmeter.properties配置檔案,搜尋"plugin_dependency_paths=",刪除該行的註釋並設定為plugin_dependency_paths=../dependencies,最後儲存;至此配置成功,在JMeter的BeanShell PostProcessor裡就可以正常引用jar依賴包了。
3.不知道為什麼有時候通過上述方法仍無法正常引用外部jar包,那麼為了以防萬一,強烈建議在測試計劃中通過瀏覽將需要匯入的jar包引入
五、右鍵點選"HTTP請求"->新增->後置處理器->BeanShell PostProcessor,並在指令碼新增程式碼用以獲取"topics"下JSONArray物件(請無視這粗鄙的程式碼結構。。。)
-
import org.json.*;
-
//設定全域性變數
-
static public int excellent_count = 0;
-
//獲取最後一次請求返回資料 (JMeter內建方法)
-
String jsonResult = prev.getResponseDataAsString();
-
//分析:TestHome首頁json資料結構為{"topics":[{...},{...}...]},外層JSONObject內層JSONArrary
-
//獲取"topics"下JSONArray物件
-
JSONObject jsonObject = new JSONObject(jsonResult);
-
JSONArray jsonArray = jsonObject.getJSONArray("topics");
-
String string_jsonArray = jsonArray.toString();
-
vars.put("string_jsonArray",string_jsonArray);
六、新增斷言Case01(對應第一條測試點),右鍵點選"HTTP請求"->新增->斷言->BeanShell斷言,然後填入以下指令碼:從BeanShell PostProcessorh提供的內建變數中獲取JSONArray物件,然後通過條件"excellent=1"得出精華帖總數,從而判斷精華帖是否>4
-
import org.json.*;
-
//設定全域性變數用於記錄精華帖數量
-
static public int excellent_count = 0;
-
//從BeanShell PostProcessor獲取jsonArray
-
var b = vars.get("string_jsonArray");
-
JSONArray jsonArray = new JSONArray(b);
-
//計算精華帖數量
-
for (int i = 0;i < jsonArray.length();i++) {
-
excellent_result = jsonArray.getJSONObject(i).getInt("excellent");
-
if (excellent_result == 1){
-
//迴圈遍歷全部文章的excellent值,若為1則精華帖數量excellent_count+1
-
excellent_count = excellent_count + 1;
-
}
-
}
-
if (excellent_count >4){
-
//Failure為false代表斷言成功,且結果樹不顯示該斷言
-
Failure = false;
-
//日誌輸出結果
-
log.error("【Case01】執行成功,精華帖數量為" + excellent_count + "個。");
-
}else{
-
//Failure為true則代表斷言失敗
-
Failure = true;
-
//設定FailureMessage為斷言失敗資訊
-
FailureMessage = "【Case01】執行失敗,精華帖數量為" + excellent_count + "個。" ;
-
log.error("【Case01】執行失敗,精華帖數量為" + excellent_count + "個。" );
-
}
七、新增斷言Case02,並填入指令碼:獲取主題為"MTSC2018 早鳥票開售..."帖子對應的excellent引數值,以此來判斷是否為精華帖
-
import org.json.*;
-
//設定全域性變數excellent_result用於儲存excellent值
-
static public int excellent_result;
-
//從BeanShell PostProcessor獲取jsonArray
-
var b = vars.get("string_jsonArray");
-
JSONArray jsonArray = new JSONArray(b);
-
for (int i = 0;i < jsonArray.length();i++) {
-
//獲取titile值
-
String title = jsonArray.getJSONObject(i).getString("title");
-
//當title="2018年TesterHome 全員感恩紅包發放"時獲取對應excellent值
-
if ( "MTSC2018 早鳥票開售啦_中國移動網際網路測試開發大會".equals(title)){
-
excellent_result = jsonArray.getJSONObject(i).getInt("excellent");
-
break;
-
}else{
-
continue;
-
}
-
}
-
//校驗結果excellent為0則斷言成功,若為1則斷言失敗
-
if(excellent_result == 0){
-
Failure = false;
-
//日誌輸出結果
-
log.error("【Case02】執行成功,excellent值為" + excellent_result + ",此帖非精華帖。");
-
}else{
-
Failure = true;
-
FailureMessage = "【Case02】執行失敗,excellent值為" +excellent_result ;
-
log.error("【Case02】執行失敗,excellent值為" + excellent_result + ",此帖為精華帖。");
-
}
八、新增"察看結果樹",用來察看斷言執行結果。另外由於指令碼中部分執行結果由log輸出,因此需要將"選項"下的"Log Viewer"選項勾上,這樣就可以察看日誌資訊了。(建議將jmeter.properties配置檔案中的log_level.jmeter以及log_level.jmeter.junit分別設定為log_level.jmeter=ERROR、log_level.jmeter.junit=DEBUG,過濾不必要的日誌資訊)
九、最後儲存檔案並執行(點選操作欄中綠色三角箭頭),檢視執行結果
【結論】從右下方的日誌視窗可以看到,由於精華帖數量為3因此斷言Case01失敗,而上方的察看結果樹中這條斷言也顯示為紅色代表失敗,Case02執行成功,因此不會顯示在察看結果樹中。
四、總結
至此,一個簡易的介面自動化測試框架便搭建完成,基本可以應付一些不太複雜的測試場景。
JMeter就好比一把瑞士軍刀,麻雀雖小但五臟俱全,雖不及一些商業測試工具那樣能夠提供龐大的"套件",卻也憑藉著自己的靈活性幾乎無所不能。