【最佳实践】DataEase 结合 MeterSphere 实现 API 数据提取与分析


飞致云 发布于 2023-03-13 / 1873 阅读 / 0 评论 /
应用场景介绍: 调用系统的 API 接口,获取目标数据,将目标数据自动入库,并利用 DataEase 制作数据分析看板。 DataEase 本身是支持 API 数据集的,不过存在一定的局限性。比如当前我们要获取数据的系统接口仅支持定量数据的获取,不支持一次性全量数据的获取,且系统接口是固定的,接口二

应用场景介绍:

调用系统的 API 接口,获取目标数据,将目标数据自动入库,并利用 DataEase 制作数据分析看板。

DataEase 本身是支持 API 数据集的,不过存在一定的局限性。比如当前我们要获取数据的系统接口仅支持定量数据的获取,不支持一次性全量数据的获取,且系统接口是固定的,接口二次开发的话需要耗费较大的成本。在这种场景下,DataEase 无法做到像 MeterSphere 中的场景循环控制器的配置。

因此我们可以借助 MeterSphere 这款开源测试工具的接口自动化场景功能,分批循环获取数据并将数据入库,入库后再通过 DataEase 对数据进行分析。

本文以获取易快报系统的合同数据为例进行介绍,针对不同的使用场景所涉及的步骤,自动化场景会有所不同,此文仅供参考。

步骤:

1、梳理接口获取目标数据的流程以及参数

(1)获取授权 accessToken

接口文档地址:https://docs.ekuaibao.com/docs/open-api/getting-started/auth

 image-2023-3-2_15-27-37.png

(2)获取业务对象 ID

接口文档地址:https://docs.ekuaibao.com/docs/open-api/datalink/get-entity-list

 image-2023-3-2_15-28-3.png

(3)获取业务对象实例列表(每次请求获取数据存在条数限制)

接口文档地址:https://docs.ekuaibao.com/docs/open-api/datalink/get-entity-info

 image-2023-3-2_15-28-29.png

以上接口可通过 PostMan 或其他接口调试工具测试通过后,记录其接口请求地址及参数信息,后面配置自动化测试场景时会用到。

2、环境准备

(1)部署 MeterSphere

可参考官方文档进行部署:

在线安装:https://metersphere.io/docs/v2.x/installation/online_installation/

离线安装:https://metersphere.io/docs/v2.x/installation/offline_installation/

(2)部署 DataEase

可参考官方文档进行部署:

在线安装:https://dataease.io/docs/installation/online_installation/

离线安装:https://dataease.io/docs/installation/offline_installation/

(3)数据库及入库表的准备

根据目标数据的数据字段设计存储数据的表结构,并创建数据库表(此处我使用的是 MySQL 数据库)


image-2023-3-2_15-29-9.pngimage-2023-3-2_15-29-32.png

 -- 建表语句如下
DROP TABLE IF EXISTS `t_fit2cloud_contract`;
CREATE TABLE `t_fit2cloud_contract` (
  `id` varchar(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `code` varchar(255) DEFAULT NULL COMMENT '合同编号',
  `form_code` varchar(255) DEFAULT NULL COMMENT '合同编号',
  `form_name` varchar(255) DEFAULT NULL,
  `form_签约客户名称` varchar(255) DEFAULT NULL COMMENT '签约客户名称',
  `form_最终客户名称` varchar(255) DEFAULT NULL COMMENT '最终客户名称',
  `form_合同所属区域` varchar(20) DEFAULT NULL COMMENT '合同所属区域',
  `form_合同金额` float(10,4) DEFAULT NULL,
  `form_期初已开票金额` float(10,4) DEFAULT NULL,
  `form_累计已开票金额` float(10,4) DEFAULT NULL,
  `form_已回款金额` float(10,4) DEFAULT NULL,
  `form_预计毛利率` float(10,4) DEFAULT NULL,
  `form_实际毛利率` float(10,4) DEFAULT NULL,
  `form_合作伙伴名称` varchar(255) DEFAULT NULL,
  `form_签约方式` varchar(20) DEFAULT NULL,
  `form_回款合同等级` varchar(4) DEFAULT NULL,
  `form_费用所属部门` varchar(60) DEFAULT NULL,
  `form_负责人` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3、将接口获取数据的流程转化为 MeterSphere 的接口自动化场景

(1)环境信息配置

 image-2023-3-2_15-30-11.png

(2)接口定义,利用第 1 步中梳理的接口进行配置,分别创建获取 token 接口和获取合同接口。

image-2023-3-2_15-30-31.png image-2023-3-2_15-30-44-qhjt.png

 

(3)制作场景

 image-2023-3-2_15-30-58.pngimage-2023-3-2_15-31-8.png

 

创建场景中的第一个步骤,获取 token 认证信息。

image-2023-3-2_15-31-21.png 

配置运行环境信息,选择第(1)步中配置好的环境信息,并按照实际的使用场景设置环境变量。

 image-2023-3-2_15-32-10.png

 

添加场景的第二步,循环控制器,此处循环控制器用于循环请求获取合同数据,直至请求完所有的合同数据为止,设置的进入循环的条件为合同总数大于当前已入库的数据条数(此处合同总数在每次接口请求中都有返回,第一次进入循环前设置了默认值,接口请求中设置后置操作提取此数值覆盖初始值)。

image-2023-3-2_15-32-20.png
 image-2023-3-2_15-32-34.png

 image-2023-3-2_15-32-50.pngimage-2023-3-2_15-32-58.pngimage-2023-3-2_15-33-5.pngimage-2023-3-2_15-33-14.png

 

 

 image-2023-3-2_15-33-22.pngimage-2023-3-2_15-33-38.pngimage-2023-3-2_15-33-54.pngimage-2023-3-2_15-34-4.png
image-2023-3-2_15-34-13.pngimage-2023-3-2_15-34-22.png
 

 

 

 //先引入Jar包  
import org.json.*;
log.info("json::"+vars.get("item"));
String json = vars.get("item");
 
//将string 类型返回值构造成Jsonobject 对象
JSONObject data_obj= new JSONObject(json);
 //获取Json中 id 的值
String id= data_obj.get("id").toString();
vars.put("id", id);
log.info("id::"+id);
 
if(data_obj.has("name")){
    String name= data_obj.get("name").toString();
    vars.put("name", name);
    log.info("name::"+name);
}else{
    vars.put("name", "");
}
 
if(data_obj.has("code")){
    String code= data_obj.get("code").toString();
    vars.put("code", code);
    log.info("code::"+code);
}else{
    vars.put("code", "");
}
 
if(data_obj.has("ownerId")){
    String ownerId= data_obj.get("ownerId").toString();
    vars.put("ownerId", ownerId);
    log.info("ownerId::"+ownerId);   
}else{
    vars.put("ownerId", "");
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_code")){
    String form_code= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_code").toString();
    vars.put("form_code", form_code);
    log.info("form_code::"+form_code);  
}else{
    vars.put("form_code", "");
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_name")){
    String form_name= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_name").toString();
    vars.put("form_name", form_name);
    log.info("form_name::"+form_name);   
}else{
    vars.put("form_name", "");
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_签约客户名称")){
    String form_contract_customer= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_签约客户名称").toString();
    vars.put("form_contract_customer", form_contract_customer);
    log.info("form_contract_customer::"+form_contract_customer);
}
 
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_最终客户名称")){
    String form_end_customer= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_最终客户名称").toString();
    vars.put("form_end_customer", form_end_customer);
    log.info("form_end_customer::"+form_end_customer);
}
 
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_合同所属区域")){
    String form_region= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_合同所属区域").toString();
    vars.put("form_region", form_region);
    log.info("form_region::"+form_region);
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_合同金额")){
    if(data_obj.get("form").get("E_fd0e3a1b6033d2d59800_合同金额").toString()=="null"){
        vars.put("form_contract_money", "0");
        log.info("form_contract_money::"+form_contract_money);
    }else{
        String form_contract_money= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_合同金额").get("standard").toString();
        vars.put("form_contract_money", form_contract_money);
        log.info("form_contract_money::"+form_contract_money);
    }
}else{
    vars.put("form_contract_money", "0");
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_期初已开票金额")){
    if(data_obj.get("form").get("E_fd0e3a1b6033d2d59800_期初已开票金额").toString()=="null"){
        vars.put("form_draw_bill_money", "0");
        log.info("form_draw_bill_money::"+form_draw_bill_money);
    }else{
        String form_draw_bill_money= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_期初已开票金额").get("standard").toString();
        vars.put("form_draw_bill_money", form_draw_bill_money);
        log.info("form_draw_bill_money::"+form_draw_bill_money);
    }
}else{
    vars.put("form_draw_bill_money", "0");
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_累计已开票金额")){
    if(data_obj.get("form").get("E_fd0e3a1b6033d2d59800_累计已开票金额").toString()=="null"){
        vars.put("form_total_draw_bill_money", "0");
        log.info("form_total_draw_bill_money::"+form_total_draw_bill_money);
    }else{
        String form_total_draw_bill_money= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_累计已开票金额").get("standard").toString();
        vars.put("form_total_draw_bill_money", form_total_draw_bill_money);
        log.info("form_total_draw_bill_money::"+form_total_draw_bill_money);
    }
}else{
    vars.put("form_total_draw_bill_money", "0");
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_已回款金额")){
    if(data_obj.get("form").get("E_fd0e3a1b6033d2d59800_已回款金额").toString()=="null"){
        vars.put("form_return_money", "0");
        log.info("form_return_money::"+form_return_money);
    }else{
        String form_return_money= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_已回款金额").get("standard").toString();
        vars.put("form_return_money", form_return_money);
        log.info("form_return_money::"+form_return_money);
    }
}else{
    vars.put("form_return_money", "0");
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_预计毛利率")){
    if(data_obj.get("form").get("E_fd0e3a1b6033d2d59800_预计毛利率").toString()=="null"){
        vars.put("form_expect_interes_rate", "0");
    }else{
        String form_expect_interes_rate= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_预计毛利率").toString();
        vars.put("form_expect_interes_rate", form_expect_interes_rate);
        log.info("form_expect_interes_rate::"+form_expect_interes_rate);
    }
}else{
    vars.put("form_expect_interes_rate", "0");
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_实际毛利率")){
    if(data_obj.get("form").get("E_fd0e3a1b6033d2d59800_实际毛利率").toString()=="null"){
        vars.put("form_actual_interes_rate", "0");
    }else{
        String form_actual_interes_rate= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_实际毛利率").toString();
        vars.put("form_actual_interes_rate", form_actual_interes_rate);
        log.info("form_actual_interes_rate::"+form_actual_interes_rate);
    }
}else{
    vars.put("form_actual_interes_rate", "0");
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_合作伙伴名称")){
    String form_partner_name= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_合作伙伴名称").toString();
    vars.put("form_partner_name", form_partner_name);
    log.info("form_partner_name::"+form_partner_name);
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_签约方式")){
    String form_signing_way= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_签约方式").toString();
    vars.put("form_signing_way", form_signing_way);
    log.info("form_signing_way::"+form_signing_way);  
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_回款合同等级")){
    String form_contract_level= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_回款合同等级").toString();
    vars.put("form_contract_level", form_contract_level);
    log.info("form_contract_level::"+form_contract_level);  
}
 
if(data_obj.get("form").has("E_fd0e3a1b6033d2d59800_费用所属部门")){
    String form_belong_depart= data_obj.get("form").get("E_fd0e3a1b6033d2d59800_费用所属部门").toString();
    vars.put("form_belong_depart", form_belong_depart);
    log.info("form_belong_depart::"+form_belong_depart);  
}

 image-2023-3-2_15-34-51.png

前置操作脚本如下:

log.info("begin count::${count}");
int count= Integer.parseInt("${count}")+1;
log.info("count+1=::"+count);
vars.put("count", count+"");
log.info("end count::"+vars.get("count"));

 image-2023-3-2_15-35-21.png

后置操作 SQL 脚本如下:

-- 更新数据
UPDATE t_fit2cloud_contract SET name='${name}',code='${code}',form_code='${form_code}',form_name='${form_name}',form_签约客户名称='${form_contract_customer}',form_最终客户名称='${form_end_customer}',
form_合同所属区域='${form_region}',form_合同金额='${form_contract_money}',form_期初已开票金额='${form_draw_bill_money}',form_累计已开票金额='${form_total_draw_bill_money}',form_已回款金额='${form_return_money}',
form_预计毛利率='${form_expect_interes_rate}',form_实际毛利率='${form_actual_interes_rate}',form_合作伙伴名称='${form_partner_name}',form_签约方式='${form_signing_way}',
form_回款合同等级='${form_contract_level}',form_费用所属部门='${form_belong_depart}' WHERE id='${id}';
 
-- 插入数据
INSERT INTO t_fit2cloud_contract(id,name,code,form_code,form_name,form_签约客户名称,form_最终客户名称,form_合同所属区域,form_合同金额,form_期初已开票金额,form_累计已开票金额,form_已回款金额,form_预计毛利率,form_实际毛利率,form_合作伙伴名称,form_签约方式,form_回款合同等级,form_费用所属部门,form_负责人)
VALUE ('${id}','${name}','${code}','${form_code}','${form_name}','${form_contract_customer}','${form_end_customer}','${form_region}','${form_contract_money}','${form_draw_bill_money}','${form_total_draw_bill_money}','${form_return_money}','${form_expect_interes_rate}','${form_actual_interes_rate}',
'${form_partner_name}','${form_signing_way}','${form_contract_level}','${form_belong_depart}','');

也可以直接合并为一个SQL脚本:

INSERT INTO t_fit2cloud_contract(id,name,code,form_code,form_name,form_签约客户名称,form_最终客户名称,form_合同所属区域,form_合同金额,form_期初已开票金额,form_累计已开票金额,form_已回款金额,form_预计毛利率,form_实际毛利率,form_合作伙伴名称,form_签约方式,form_回款合同等级,form_费用所属部门,form_负责人)
VALUE ('${id}','${name}','${code}','${form_code}','${form_name}','${form_contract_customer}','${form_end_customer}','${form_region}','${form_contract_money}','${form_draw_bill_money}','${form_total_draw_bill_money}','${form_return_money}','${form_expect_interes_rate}','${form_actual_interes_rate}',
'${form_partner_name}','${form_signing_way}','${form_contract_level}','${form_belong_depart}','${ownerId}')
ON DUPLICATE KEY
UPDATE name='${name}',code='${code}',form_code='${form_code}',form_name='${form_name}',form_签约客户名称='${form_contract_customer}',form_最终客户名称='${form_end_customer}',
form_合同所属区域='${form_region}',form_合同金额='${form_contract_money}',form_期初已开票金额='${form_draw_bill_money}',form_累计已开票金额='${form_total_draw_bill_money}',form_已回款金额='${form_return_money}',
form_预计毛利率='${form_expect_interes_rate}',form_实际毛利率='${form_actual_interes_rate}',form_合作伙伴名称='${form_partner_name}',form_签约方式='${form_signing_way}',
form_回款合同等级='${form_contract_level}',form_费用所属部门='${form_belong_depart}',form_负责人='${ownerId}';

image-2023-3-2_15-35-59.png 

后置操作参数置空脚本如下:

log.info("start 参数置空++++++++++++++");
vars.put("id", "");
log.info("id::"+id);
vars.put("name", "");
vars.put("code", "");
vars.put("form_code", "");
vars.put("form_name", "");
vars.put("form_contract_customer", "");
vars.put("form_end_customer", "");
vars.put("form_region", "");
vars.put("form_contract_money", "0");
vars.put("form_draw_bill_money", "0");
vars.put("form_total_draw_bill_money", "0");
vars.put("form_return_money", "0");
vars.put("form_expect_interes_rate", "0");
vars.put("form_actual_interes_rate", "0");
vars.put("form_partner_name", "");
vars.put("form_signing_way", "");
vars.put("form_contract_level", "");
vars.put("form_belong_depart", "");
log.info("end 参数置空++++++++++++++");

image-2023-3-2_15-36-31.png 

点击开始执行,等待执行结束即可。

 image-2023-3-2_15-36-49.pngimage-2023-3-2_15-36-56.png
 

(4)检查数据入库情况,查询数据库表中的数据,可以看到数据已经入库了。

 image-2023-3-2_15-37-10.png

4、DataEase 数据接入

(1)配置数据源

此处我们使用的是 MySQL 数据源,详细配置可参考官方文档。

https://dataease.io/docs/user_manual/datasource_configuration/MySQL_datasource_configuration/

image-2023-3-2_15-37-46.png 

(2)配置数据集

添加好数据源之后就可以正常添加数据库数据集或者 SQL 数据集等进行使用了,数据集的相关使用可参考官方文档

https://dataease.io/docs/user_manual/dataset_configuration/dataset_database/

 image-2023-3-2_15-38-3.png

(3)使用数据集制作仪表板,进行数据分析

仪表板的相关操作请移步官方文档进行学习

https://dataease.io/docs/user_manual/dashboard_create/



是否对你有帮助?