大数据统计系统测试方法--利用jmeter实现进行统计结果对比
系统介绍&实现架构此系统主要是对业务系统产生的数据,进行各维度的统计,系统大致实现是下面这样的,数据的统计是在elasticsearch上实现的。为了验证统计数据的正确性,我们是在业务库上写SQL,将SQL的查询结果和开发的统计结果进行对比,将对比的部分通过jmeter脚本来实现。思路1、分析查询接口返回数据,获取到需要的值和查询的SQL查询结果进行对比(添加断言,验证结果是否一致)2、由
·
系统介绍&实现架构
- 此系统主要是对业务系统产生的数据,进行各维度的统计,系统大致实现是下面这样的,数据的统计是在elasticsearch上实现的。
- 为了验证统计数据的正确性,在业务库上写SQL,将SQL的查询结果和开发的统计结果进行对比,将对比的部分通过jmeter脚本来实现。
测试思路
- 编写测试的SQL脚本
- 分析查询接口返回数据,获取到需要的值和查询的SQL查询结果进行对比(添加断言,验证结果是否一致)
- 由于不同用户登录查询的范围不一样,对SQL中的单位查询条件进行参数化,以实现同一套脚本不同用户登录均可用
SQL编写
在开发阶段就开始投入编写测试SQL,如下,对其中的变量进行了参数化:
select count(*) as 总数,
sum( CASE WHEN t.c_xb = '1' THEN 1 ELSE 0 END ) AS 男,
sum( CASE WHEN t.c_xb = '2' THEN 1 ELSE 0 END ) AS 女
FROM
database.t_table t
WHERE
--corp
t.c_corp = '${corp}' and t.c_zybz like '10%'
在jmeter中返回的数据是这样的,数组里面嵌套json对象 (hasmap类型):[{总数=2, 男=1,女=1}]
注意:hashmap是无序的
分析返回数据
查询结果的返回数据是这样的:items下的内容是需要的,并且每个对象都有id,name,value、percent这些值,如下:
{
"count": null,
"items": [
{
"childrens": [],
"id": "zj",
"name": "数量-总计",
"percent": "100.00%",
"value": 4122
},
{
"childrens": [],
"id": "nf",
"name": "数量-男",
"percent": "81.78%",
"value": 3371
},
{
"childrens": [],
"id": "nvf",
"name": "数量-女",
"percent": "14.24%",
"value": 587
},
……
}
分析可以使用以下两种断言方式:
- beanshell断言,先获取到items ,然后再获取到里面的value值和SQL的查询结果进行对比
- json断言,将SQL查询到的值拼接成items的值这样,比较内容以参数代替,比较取到的items值比较
beanshell断言–数据处理
先把items中的内容取出来,转换为以id为key,整个对象为value的格式,如下
{"zj": {
"childrens": [],
"id": "zj",
"name": "数量-总计",
"percent": "100.00%",
"value": 4122
},"nf": {
"childrens": [],
"id": "nf",
"name": "数量-男",
"percent": "81.78%",
"value": 3371
},"nvf": {
"childrens": [],
"id": "nvf",
"name": "数量-女",
"percent": "14.24%",
"value": 587
}
}
代码如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
String r=prev.getResponseDataAsString();
JSONObject re;
JSONArray jsonArray;
JSONObject pageobjs = new JSONObject();
try{
re=JSONObject.parseObject(r); //返回的值
jsonArray = re.getJSONArray("items");//取items下面的所有值
}catch(Exception e){
Failure=true;
FailureMessage="接口获取数据失败!";
vars.putObject("qk",pageobjs); //后续变量使用
break;
}
for(JSONObject item : jsonArray){//将取到的值处理成以id为键的json对象
pageobjs.put(item.getString("id"),item);
}
vars.putObject("qk",pageobjs); //后续变量使用
beanshell断言 --结果对比
接口返回的值,和SQL查询结果进行遍历对比
String[] pagekeys={"zj","nf","nvf"}; //需要比对的页面id
String[] sqlkeys={"总数","男","女"}; //需要比对的sql查询结果id,和id的值一一对应
pageobjs=vars.getObject("qk"); //接口处理获取到的数据
Map data = (Map)(vars.getObject("nv").get(0)); //获取查询结果第一行的值,nv是jdbc request中设置的Result variable name的变量值
//String[] keys = data.keySet().toArray(new String[0]);//获取查询结果中列名,并且转为数组
for(i=0;i<pagekeys.length;i++){
sql=data.get(sqlkeys[i]);
page=pageobjs.get(pagekeys[i]).get("value");
if(page!=sql && sql!=null && page!="0"){
Failure=true;
FailureMessage=pageobjs.get(pagekeys[i]).get("name")+"的值不一样.\n页面查询结果:"+page+"\nSQL查询结果:"+sql;
break;
}
}
json断言
- 我一开始是用的json断言,但由于一个请求返回了几十个值,使用json断言不好判断具体是哪个值不对,最后改用beanshell断言的,所以在需要对比的json对象值不是很多的情况下,建议使用json断言
- 操作如下:将SQL查询结果,按接口返回数据进行拼接
其中one_1,two_1……变量表示jdbc requset 中设置的variable names设置的变量,第一行内容
[ {"name":"1-2年","value":${one_1}},{"name":"2-3年","value":${two_1}},{"name":"3-5年","value":${three_1}}]
更多推荐
所有评论(0)