应用场景介绍:
调用系统的 API 接口,获取目标数据,将目标数据自动入库,并利用 DataEase 制作数据分析看板。
DataEase 本身是支持 API 数据集的,不过存在一定的局限性。比如当前我们要获取数据的系统接口仅支持定量数据的获取,不支持一次性全量数据的获取,且系统接口是固定的,接口二次开发的话需要耗费较大的成本。在这种场景下,DataEase 无法做到像 MeterSphere 中的场景循环控制器的配置。
因此我们可以借助 MeterSphere 这款开源测试工具的接口自动化场景功能,分批循环获取数据并将数据入库,入库后再通过 DataEase 对数据进行分析。
本文以获取易快报系统的合同数据为例进行介绍,针对不同的使用场景所涉及的步骤,自动化场景会有所不同,此文仅供参考。
步骤:
1、梳理接口获取目标数据的流程以及参数
(1)获取授权 accessToken
接口文档地址:https://docs.ekuaibao.com/docs/open-api/getting-started/auth
(2)获取业务对象 ID
接口文档地址:https://docs.ekuaibao.com/docs/open-api/datalink/get-entity-list
(3)获取业务对象实例列表(每次请求获取数据存在条数限制)
接口文档地址:https://docs.ekuaibao.com/docs/open-api/datalink/get-entity-info
以上接口可通过 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 数据库)
-- 建表语句如下
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)环境信息配置
(2)接口定义,利用第 1 步中梳理的接口进行配置,分别创建获取 token 接口和获取合同接口。
(3)制作场景
创建场景中的第一个步骤,获取 token 认证信息。
配置运行环境信息,选择第(1)步中配置好的环境信息,并按照实际的使用场景设置环境变量。
添加场景的第二步,循环控制器,此处循环控制器用于循环请求获取合同数据,直至请求完所有的合同数据为止,设置的进入循环的条件为合同总数大于当前已入库的数据条数(此处合同总数在每次接口请求中都有返回,第一次进入循环前设置了默认值,接口请求中设置后置操作提取此数值覆盖初始值)。
//先引入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);
}
前置操作脚本如下:
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"));
后置操作 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}';
后置操作参数置空脚本如下:
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 参数置空++++++++++++++");
点击开始执行,等待执行结束即可。
(4)检查数据入库情况,查询数据库表中的数据,可以看到数据已经入库了。
4、DataEase 数据接入
(1)配置数据源
此处我们使用的是 MySQL 数据源,详细配置可参考官方文档。
https://dataease.io/docs/user_manual/datasource_configuration/MySQL_datasource_configuration/
(2)配置数据集
添加好数据源之后就可以正常添加数据库数据集或者 SQL 数据集等进行使用了,数据集的相关使用可参考官方文档
https://dataease.io/docs/user_manual/dataset_configuration/dataset_database/
(3)使用数据集制作仪表板,进行数据分析
仪表板的相关操作请移步官方文档进行学习