Jmeter接口測試通過SQL查詢進行數據校驗
阿新 • • 發佈:2018-02-06
stp ima 分享 info turn return http catch object 在使用Jmeter做查詢類接口測試的時候,我們可以通過數據庫查詢結果與實際接口返回的結果進行數據校驗。
"UserName":"測試",
"Time":"2017-12-12 09:00:00",
"PartnerIdentity":"江西省代理",
"PartnerType":1,
"State":1,
"Income":7.65
}
],
"TotalItems":10
}
}
如上就是我們接口正常的返回數據。
接口的返回值:
{
"PageResult":{
"SummaryData":{
"SumMonery":10000,
"SumFee":900,
"SumIncome":16000
},
"PageSize":10,
"CurrentPage":1,
"Data":[
{
"Id":10,
"Fee":7.65,
"Monery":8.65,
"Time":"2017-12-12 09:00:00",
"PartnerIdentity":"江西省代理",
"PartnerType":1,
"State":1,
"Income":7.65
}
],
"TotalItems":10
}
}
如上就是我們接口正常的返回數據。
我們使用Oracle作為數據庫,因此需要加載Oracle安裝目錄下(C:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib)的ojdbc6.jar文件復制到Jmeter軟件的lib\ext目錄下。
在測試計劃中導入odbc6.jar到classpath裏頭
然後新增一個JDBC連接配置
接著編寫一個JAVA項目:
import com.alibaba.fastjson.*; import java.util.*; public class JsonDiff{ /** * 對JSON進行排序 * @param jsonStr * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static List<TreeMap<String,Object>> generateSortedTreeMap(String jsonStr){ //最終接受排序後的數據 List<TreeMap<String,Object>> dataList = new ArrayList<TreeMap<String,Object>>(); //對數據轉換成有序的Map List<Map> list = new ArrayList<Map>(); try { list = JSON.parseArray(jsonStr, Map.class); }catch(Exception e) { System.out.println("+++++++++轉換JSON數組失敗,嘗試轉換成JSON對象:"+e.getMessage()); try { Map obj = JSON.parseObject(jsonStr, Map.class); list.add(obj); }catch(Exception e1) { System.out.println("+++++++++JSON對象轉換失敗:"+e.getMessage()); } } for(Map map:list) { //獲取JSON的鍵 Set<String> keys = (Set<String>)map.keySet(); List<String> sortKeys = new ArrayList<String>(keys); //對鍵進行排序 Collections.sort(sortKeys); //使用有序列表來存儲 TreeMap<String,Object> tree = new TreeMap<String,Object>(); for(String key:sortKeys) { tree.put(key, map.get(key)); } dataList.add(tree); } return dataList; } /** * 對比兩個JSON * @param json1 * @param json2 * @return */ public static boolean compareJSON(String json1,String json2) { List<TreeMap<String,Object>> data1List = generateSortedTreeMap(json1); List<TreeMap<String,Object>> data2List = generateSortedTreeMap(json2); for(TreeMap<String,Object> map:data1List) { if(!data2List.contains(map)) { return false; } } return true; } /* public static void main(String[] args) { //JSON字符串 //String json1 = "[{\"size\": 6,\"data\": \"hello linux\",\"data1\":{\"aa\":1,\"id\": {\"userid\": 3333,\"name\": \"hello world\"}}}},{\"data\": \"world\",\"size\": 7}]"; //String json2 = "[{\"data\": \"world\",\"size\": 7}, {\"data1\":{\"aa\":1,\"id\": {\"userid\": 3333,\"name\": \"hello world\"}},\"data\": \"hello linux\",\"size\": 6}]"; //String json1 = "[{\"name\": \"work\",\"passwd\": \"123456\",\"classname\": [ {\"name\": \"match\",\"score\":78},{\"name\": [ {\"name\": \"match\",\"score\":78} ]} ],\"teacher\":[ {\"name\": \"bob\",\"classname\": \"99\" }]}]"; //String json2 = "[{\"name\": \"work\",\"passwd\": \"123456\",\"classname\": [ {\"score\":78,\"name\": \"match\"},{\"name\": [ {\"name\": \"match\",\"score\":78} ]} ],\"teacher\":[ {\"name\": \"bob\",\"classname\": \"99\" }]}]"; //String json1="{\"size\": 6,\"data\": \"hello linux\"}"; //String json2="{\"data\": \"hello linux\",\"size\": 6}"; //String json1 = "{\"name\": \"testuser\",\"passwd\": \"123456\",\"classname\": [ {\"name\": \"match\",\"score\":78},{\"name\": [ {\"name\": \"match\",\"score\":78} ]} ],\"teacher\":[ {\"name\": \"bob\",\"classname\": \"99\" }]}"; //String json2 = "{\"passwd\": \"123456\",\"name\": \"testuser\",\"classname\": [ {\"name\": \"match\",\"score\":78},{\"name\": [ {\"name\": \"match\",\"score\":78} ]} ],\"teacher\":[ {\"name\": \"bob\",\"classname\": \"99\" }]}"; boolean result = compareJSON(json1, json2); System.out.println(result); } */ }
最後打成一個jar包,也新增到剛才的CLASSPATH下
在HTTP連接下新建一個JDBC PostProcessor
再然後新建一個BeanShell PostProcessor
import com.alibaba.fastjson.*;
import java.util.*;
import JsonDiff.*;
String response_data =prev.getResponseDataAsString(); //獲取web響應內容
JSONObject obj=JSON.parseObject(response_data);
String app_str = obj.get("Data").toString().toLowerCase();
log.info("response:"+app_str);
List results=vars.getObject("sqlresult"); //獲取sql查詢
String sql_str=JSONObject.toJSONString(results).toLowerCase(); //list轉換為json數據
log.info("SQL查詢:"+sql_str);
boolean result=JsonDiff.compareJSON(apps_str,sql_str)
if(result){
log.info("數據一致");
}else{ //用預期的JSON串和查詢到的結果JSON串進行對比
//如果不一樣的情況下,說明數據庫的斷言失敗,可能是程序的問題
String result =prev.getResponseDataAsString(); //拿到實際結果的值,用於存放到返回數據中
prev.setResponseCode("506"); //我們自定義了一個CODE碼,告訴結果顯示的CODE是這個
prev.setSuccessful(false); //設置結果為錯誤
prev.setResponseMessage("接口斷言通過,數據庫校驗未通過"); //設置一個提示信息,大概是說明原因導致的
//寫入結果返回的結果,還有數據庫校驗未通過,我們的預期數據庫的值是,實際的值是,加上這個是為了方便定位問題
prev.setResponseData(result+",\n數據庫校驗未通過,\n預期值:"+str+",\n實際值:"+apps_str);
}
如果校驗不通過將自動返回一個錯誤的值,否則返回正常的值
Jmeter接口測試通過SQL查詢進行數據校驗