大数据统计系统测试方法--利用jmeter实现进行统计结果对比

系统介绍&实现架构

  • 此系统主要是对业务系统产生的数据,进行各维度的统计,系统大致实现是下面这样的,数据的统计是在elasticsearch上实现的。
  • 为了验证统计数据的正确性,在业务库上写SQL,将SQL的查询结果和开发的统计结果进行对比,将对比的部分通过jmeter脚本来实现。在这里插入图片描述

测试思路

  1. 编写测试的SQL脚本
  2. 分析查询接口返回数据,获取到需要的值和查询的SQL查询结果进行对比(添加断言,验证结果是否一致)
  3. 由于不同用户登录查询的范围不一样,对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 ) ASFROM
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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值