Jmeter 介面測試中使用Beanshell斷言: 將介面響應報文與資料庫結果對比
昨天朋友問我Jmeter怎麼把資料庫查詢結果與介面響應JSON報文做對比。(第一段是記錄自己的探索過程,讀者可以直接跳至第二段)
我當時想法是
第一步:搞定介面引數
1. 正則匹配介面響應的JSON內容。匹配-1,匹配所有符合內容 (分別匹配ID 和 NAME的值)
2. 取ID,作為ForEach控制器的控制引數。(ID_1, ID_2, ID_3 .. 有多少會迴圈幾次)
3. 其他變數用${__counter(TRUE,)}計數器來拼接。例如${__V(NAME_${__counter(TRUE,)})}(取得NAME_1, NAME_2... ForEach迴圈幾次,就取幾個)
第二步:搞定資料庫值
1. JDBC PostProcessor 後置處理器,將查詢結果儲存為 (id_1, id_2 ... name_1, name_2 ...的形式)
第三步:斷言
1.使用java請求。ResultData引數 新增介面返回的 id 和 name
2.為java請求新增相應斷言,在斷言中新增 資料庫的ID 和 NAME
朋友說這不是他想要的。他想在一個斷言裡判斷。但是因為json裡內容是不固定的,所以響應斷言肯定無法滿足。
昨天回到家想了一下,覺得Beanshell斷言應該可以。
實際上確實可以,還很簡單!
我的思路是:
第一步:介面引數直接使用HTTP請求的響應內容,JMeter內建了獲取當前請求響應的方法prev.getResponseDataAsString()
第二步:資料庫逃不掉的,老老實實賦欄位名
第三步:Beanshell斷言
1. for迴圈, i = 1,vars.get("id_" + i) 拼接變數名 獲得基礎填充內容 "{\"id\":" + id + ",\"latitude\":" + latitude + ",\"longitude\":" + longitude + ",\"name\":\"" + name + "\"}"
2. 拼接首位JSON格式,獲得完整JSON報文
3. equals() 判斷 2個字串
另外Jmeter中的BeanShell中,好像不能使用String.format()。我查了一下,暫時沒有這塊兒資料。如果有的話,拼接部分就方便很多了。
最後附上Beanshell斷言完整程式碼
int M = ${id_#};
int i;
String Str = "";
String id = "";
String latitude = "";
String longitude = "";
String name = "";
Str = "{\"data\":[";
for(i = 1; i <= M; i++){
id = vars.get("id_" + i);
latitude = vars.get("latitude_" + i);
longitude = vars.get("longitude_" + i);
name = vars.get("name_" + i);
Str = Str + "{\"id\":" + id + ",\"latitude\":" + latitude + ",\"longitude\":" + longitude + ",\"name\":\"" + name + "\"}";
if (i != M){
Str = Str + ",";
}
}
Str = Str + "],\"message\":\"\",\"result\":0}";
System.out.println("資料庫內容: \n" + Str);
//prev.getResponseDataAsString是Jmeter提供的方法,可以調取上次請求的響應字串
response = prev.getResponseDataAsString();
System.out.println("響應內容: \n" + response);
if(Str == ""){
Failure = true;
FailureMessage = "連線資料庫失敗或者資料庫內沒有歷史資料!";
//對比資料庫內容和響應內容,私用euqals方法判斷是否一致
}else if(response.equals(Str) == false){
//把斷言失敗置為真
Failure = true;
String Msg = "與資料庫內容不匹配!\n";
FailureMessage = Msg + "資料庫內容: \n" + Str + "\n" + "響應內容: \n" + response;
}
最後總結一下用到的Jmeter內建方法:
vars.get() #獲取JMeter中的變數
prev.getResponseDataAsString() #獲取當前請求的響應結果
Failure、FailureMessage 是Beanshell斷言特有的引數,用於指定斷言失敗。
完整的Jmeter內建方法請參考這位大佬的博文
http://www.cnblogs.com/puresoul/p/4915350.html
解決問題過程中參考了這位大佬的博文,利用gson包直接對比json報文。(但我沒實現,只是使用了他的部分java程式碼)
http://blog.csdn.net/drico1986/article/details/53021071