在使用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> generateSortedTreeMap(String jsonStr){
//最终接受排序后的数据
List> dataList = new ArrayList>();
//对数据转换成有序的Map
List
最后打成一个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);
}
如果校验不通过将自动返回一个错误的值,否则返回正常的值
ps:如果需要对返回的结果做替换可以使用
String get_data=response_data.replaceAll("old","new");
例如:
String data2 = rdata.replaceAll("\"SummaryData\":\"", "\"SummaryData\":[");
String response_data = data2.replaceAll("}\",\"IsSucess\"","}],\"IsSucess\"");