一、背景
随着互联网的快速发展和传统企业的数字化转型探索,大数据的应用已经成为企业在数字化转型和市场竞争中的关键因素。准确运用大数据进行决策分析,使得企业在这一场变革中更具竞争力,在变化多端的市场下更具适应性。目前大参林的数据服务的应用主要有BI可视化报表、经营数据应用系统,数据开发平台等,而数据测试便是大数据应用质量和性能的保障的关键,数据测试确保数据链路的准确性、完整性和一致性,这对于基于数据做出的决策至关重要。
二、数据链路架构与测试探索
- 数据链路:大数据的数据链路包括数据的采集、处理和提供数据应用服务三个核心环节,每个环节都是大数据价值实现的关键部分。
- 数据测试核心思路:
【一致性】:指数据是否遵循统一规范,数据集合是否保持统一格式;
【完整性】:指数据信息是否存在缺失状况,数据缺陷情况可能是整个数据记录缺失,也可能是某个字段信息记录缺失,决定数据的决策价值;
【及时性】:指数据从产生到应用时的时间间隔,也就是数据的延时时长,也决定着数据分析决策价值;
【准确性】:指数据记录信息是否存在异常或错误;
【有效性】:指数据值、数据格式等是否符合业务定义;
【唯一性】:指某项数据没有重复,必须唯一。
- 测试测试探索:针对公司业务现状,结合数据测试的核心思路,探索测试介入点如下:
【数据平台侧测试】:ETL测试,涵盖ODS层、DWD层、DWS层和ADS层的数据链路测试,关键保障数据平台侧提供的数据质量;
【数据应用侧测试】:应用测试,涵盖数据指标口径测试、功能测试、API接口和性能测试,关键保障数据应用侧用户使用的数据准确性。

应用数据存储层,按主题进行汇总,为各种统计报表提供个性化数据、宽表集市、趋势指标
维度层。以维度作为建模驱动,基于每个维度的业务含义。
服务数据层,基于DWD上的基础数据,整合汇总成分析某一个主题域的服务数据,建立汇总宽表
明细数据层,对ODS层数据进行清洗,基于维度建模,明细宽表,复用关联计算,减少数据扫描
原始数据层,存放在数据仓库系统中,作为业务库等基础数据同步、存储
三、数据链路测试关键
目前数据测试小组分别从数据平台侧和数据应用侧介入测试验证,其中探索以下4个测试关键点:数据完整性测试、数据准确性测试、数据及时性测试和数据稳定性(性能)测试,其验证思路主要有以下方面:
3.1、数据完整性
- 【验证思路】
1、验证数据从ODS-DWD/DWS-ADS处理链路的清洗转换过程是否完整,数据是否丢失,即结果表数据总量验证
2、验证数仓结果表字段是否正确,即结果表明细字段验证
- 【举例】
例如《经营门店属性维度表》的测验:
1、数据总量与源表/主数据业务表对比
2、结果表数据总量vs明细表数据总量比对
3.2、数据准确性
- 【验证思路】
1、通过结合需求口径进行任务代码走查,确认所需指标加工口径、函数等转换正常
2、数仓每一步的出口数据与其所依赖的源表进行横向比对
3、通过DQC(Data Quality Check)自身检查方法进行确认数据准确与否
4、SQL代码走读检查
- 【举例】
例如《门店业绩看板经营数据》的测验:
1、指标业务口径的测试:如销售额来源pos小票数据,剔除退货数据
2、结果表与明细表:比对门店销售明细表数据汇总数据是否准确
3、口径优化前后:比对门店口径优化前后,销售数据异常波动情况
4、DQC异常检查:检查销售的异常数据是否已经剔除,如销售额为空,销售单号为空等
5、SQL代码走读:检查函数使用合理性等
3.3、数据及时性
【验证思路】
1、检查数仓出数下发的数据量和数据处理延时时长,推算数据下发下游系统是否及时
2、检查数仓定时任务的跑数据时效和下一层依赖是否合理
【举例】
例如业务期望每天早9点下发自动补货单,那么需要从数据链路确认每个节点的具体耗时和处理节点(t1+t2+t3+t4累计总延时需小于看数的dateline),并按实际问题进行调优:
1、数仓ODS采集数据耗时t1
2、数仓ETL过程耗时t2
3、数仓ADS结果表同步SSP中台耗时t3
4、SSP包装处理后下发/下游接收处理耗时t4
3.4、数据稳定性(性能)
【验证思路】
1、至上而下从数据应用层到数仓层进行专项梳理数据链路性能问题
2、抓住关键数据链路节点分析数据查询、处理、同步、下发等性能瓶颈
【举例】
例如门店使用的请货功能,涉及到以下潜在性能要求:
1、接口查询性能
2、页面渲染性能
3、定时任务的数据处理性能
4、数据推送性能
5、数仓任务转换聚合性能
四、数据测试实战小技巧
4.1、数据完整性验证
- 数据总量检查:全表检查数据总数与源头表数据总数完整
select count(distinct t.loc),-- 结果表总数 count(distinct p.venno), -- 明细表1 总数 count(distinct k.loc) -- 明细表2 总数from dim_dev.dim_cycle_info_df tleft join ods.ods_set_df p onp.venno = t.locleft join ods.ods_req_del_cyc k onk.loc = t.locwheret.stat_date = 20241118and p.stat_date = 20241118and k.stat_date = 20241118 |
- 数据唯一检查:保证主键或某些字段的唯一性,防止数据重复导致和其他表join之后数据翻倍,导致最终统计数据偏大。
-- 写法1select loc, count(1)from dim_dev.dim_cycle_info_dfwhere stat_date = 20241118 and is_deleted = 0 and is_new = 0 and is_distribut = 1group by 1having count(1) > 1-- 写法2select count(distinct loc), count(1)from dim_dev.dim_cycle_info_dfwhere stat_date = 20241118 and is_deleted = 0 |
- 数据枚举值检查:保证上游依赖数据的枚举值完整,枚举不多不少不为空。
select distinct "source" "数据来源", is_new "是否新店"from dim_dev.dim_cycle_info_dfwhere stat_date = 20241118 and is_deleted = 0 |
- 无效剔除数据:保证根据口径剔除的异常数据,符合剔除预期
select *from dim_dev.dim_cycle_info_dfwhere stat_date = 20241118 and is_deleted = 1 -- 剔除数据 ,亦可追溯口径确认是否正确完整删除 |
- 异常剔除数据:保证重要字段非空,防止空数据造成和表join之后数据丢失,导致最终统计数据偏少。
select *from dim_dev.dim_cycle_info_dfwhere stat_date = 20241118 and is_deleted = 0 and( loc is null or is_distribut is null or is_new is null ) -- 空值数据是否已经被剔除,可代入需要验证字段 |
4.2、数据准确性验证
- 根据业务口径范围比对数据:确认加工数据口径和数据结果正确
select t.store , t.item , p.store , p.itemfrom dim.dim_store_basis_info_df tleft join ads.ads_list_df p on p.store = t.store and p.item = t.itemwhere t.stat_date = 20240425 -- 批跑时间 and p.stat_date = 20240425 -- 批跑时间 and t.ads_list_df = 1 -- 字段结果标识 and t.store in ( -- 门店范围 select store from dim.dim_store where chain_code in (10, 19) and region_name like '%广州%' and stat_date = 20240425 ) and t.store != p.store and t.item != p.item -- 反向验证结果表与明细表不等,如果结果空,说明无异常数据;反之,说明存在结果表和明细表对不齐数据 |
- 结果表与明细表比对:确认数据依赖链路关联逻辑正确
with t1 as(select store , store_name , count(distinct wh) as "c1"from dim.dim_store_wh_info_dfwhere stat_date = 20241121group by store , store_name ),t2 as(select store , store_name , count(distinct wh) as "c2"from ads.ads_store_item_replenishment_result_info_dfwhere stat_date = 20241120 -- 抽样:store =1005023557 wh =524group by store , store_name )select t1.*, t2.*from t1 t1left join t2 t2 on t1.store = t2.storewhere t1.c1 != t2.c2 -- 通过汇总表和明细表的临时表分别统计不同类型数据量,再反向验证是否不匹配,如不匹配,则数据存在差异,反之,数据不存在差异。 |
- 逻辑优化前后比对:确认自身任务优化前后的数据波动,防止数据因笛卡尔积等情况导致数据发散
-- 生产表vs测试表自身比对-- part1:同个表在生产和测试的数据差异select t.goods_no , p.goods_no, t.good_num , p.good_num, t.data_source , p.data_sourcefrom ods.ods_pos_st_item_di tleft join ods_dev.ods_pos_st_item_di p on t.long_store_no = p.long_store_no and t.goods_no = p.goods_no and t.good_num = p.good_numwhere t.data_source != p.data_source and t.stat_date = 20241119 and p.stat_date = 20241119-- part2:同个表不同日期的数据差异select t.goods_no , p.goods_no, t.good_num , p.good_num, t.data_source , p.data_sourcefrom ods.ods_pos_st_item_di tleft join ods.ods_pos_st_item_di p on t.long_store_no = p.long_store_no and t.goods_no = p.goods_no and t.good_num = p.good_numwhere t.data_source != p.data_source and t.stat_date = 20241118 and p.stat_date = 20241119 |
- 数据异常DQC检验:检验库表及字段等是否存在异常
select store ,item ,count(1) from ads.ads_store_item_replenishment_result_info_df where stat_date = 20240528 group by 1,2 having count(1)>1-- 检查主键重复select * from ads.ads_store_item_replenishment_result_info_df where replenishment_qty_calculation is null and stat_date =20240528-- 检查字段值是否为空select replenishment_qty from ads.ads_store_item_replenishment_result_info_df where replenishment_qty <= 0 and stat_date =20240528-- 检查字段是否为负数据select distinct store_type from ads.ads_store_item_replenishment_result_info_df where stat_date =20240528-- 检查字段枚举值show create table ads.ads_store_item_replenishment_result_info_df--表结构检查/从DDL查看--.... 略 |
-
走查SQL代码:重点看函数使用是否正确,关联逻辑是否正确,嵌套子查询是否存在性能问题等
【口径转换】:是否根据口径实现
【关键函数】:开窗函数OVER(partition by 列名 order by列名) 、分类函数case when等
【判空处理】:isnull()、ifnull(expr1, expr2)等
【日期转换】:to_date()等
【枚举值校验】:枚举值与上游定义一致
【异常数据剔除】:是否剔除空、null、重复等无效数据......
4.3、数据及时性验证
数据的及时性,也就是数据处理结果触达需要满足实际业务使用的时间。例如管理驾驶舱经营数据需要每天7:30展示,门店自动补货数据需要每天9:00前下发门店等,意味着数据处理各个环节需要有稳定的处理耗时,数据链路累加的数据处理时效需要满足业务使用时间点。
数据转换加工
1、数据采集、处理调度配置
2、任务数据量核算
3、ETL任务执行成功耗时计算
数据二次处理
1、数据清理和接收
2、数据接收数据量核算
3、数据接收处理总耗时
数据接收
1、数据接收和规则处理
2、数据接收量核算
3、数据接收处理总耗时
数据运用
1、数据查看和运用
2、业务功能应用
- 调度服务:确认数仓任务执行是否成功,依赖是否超时,通过平台监测任务是否按设定的时间完成,否则则通过短信、电话、企微告警通知相应人员。
- 数据链路监测:通过告警数据处理和下发情况,确保推送数据及时性和完整
4.4、数据稳定性验证(性能)
数据链路的性能需要至上而下,环环相扣,在实际的数据稳定性测试中,需要针对不同的数据节点逐步进行梳理和专项排查。
- 梳理潜在性能瓶颈数据节点
- 专项排查节点性能问题并逐步优化,以满足推广或业务使用。
四、总结
数据测试是确保大数据应用达到高质量标准的核心环节。它不仅帮助企业在大数据运营的投入转化为预期的业务成果,而且在数字化转型和激烈的市场竞争中,为企业保持竞争优势提供了支持。这也意味着,随着公司业务需求的不断演变发展,数据测试人员必须灵活调整其测试策略、提升对数仓模型和复杂算法策略的测试能力,以及增强自动化数据校对投入力度,以适应新的挑战。通过这些措施,才能更好支撑公司高质量数据服务,从而使公司在大数据领域保持领先地位。



浙公网安备 33010602011771号