1. 程式人生 > >Jmeter接口測試通過SQL查詢進行數據校驗

Jmeter接口測試通過SQL查詢進行數據校驗

stp ima 分享 info turn return http catch object

在使用Jmeter做查詢類接口測試的時候,我們可以通過數據庫查詢結果與實際接口返回的結果進行數據校驗。

接口的返回值:
{
"PageResult":{
"SummaryData":{
"SumMonery":10000,
"SumFee":900,
"SumIncome":16000
},
"PageSize":10,
"CurrentPage":1,
"Data":[
{
"Id":10,
"Fee":7.65,
"Monery":8.65,

"UserName":"測試",
"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查詢進行數據校驗