一、背景

        随着互联网的快速发展和传统企业的数字化转型探索,大数据的应用已经成为企业在数字化转型和市场竞争中的关键因素。准确运用大数据进行决策分析,使得企业在这一场变革中更具竞争力,在变化多端的市场下更具适应性。目前大参林的数据服务的应用主要有BI可视化报表、经营数据应用系统,数据开发平台等,而数据测试便是大数据应用质量和性能的保障的关键,数据测试确保数据链路的准确性、完整性和一致性,这对于基于数据做出的决策至关重要。

二、数据链路架构与测试探索

  • 数据链路:大数据的数据链路包括数据的采集、处理和提供数据应用服务三个核心环节,每个环节都是大数据价值实现的关键部分。
  • 数据测试核心思路:

【一致性】:指数据是否遵循统一规范,数据集合是否保持统一格式;

【完整性】:指数据信息是否存在缺失状况,数据缺陷情况可能是整个数据记录缺失,也可能是某个字段信息记录缺失,决定数据的决策价值;

【及时性】:指数据从产生到应用时的时间间隔,也就是数据的延时时长,也决定着数据分析决策价值;

【准确性】:指数据记录信息是否存在异常或错误;

【有效性】:指数据值、数据格式等是否符合业务定义;

【唯一性】:指某项数据没有重复,必须唯一。

  • 测试测试探索:针对公司业务现状,结合数据测试的核心思路,探索测试介入点如下:

【数据平台侧测试】:ETL测试,涵盖ODS层、DWD层、DWS层和ADS层的数据链路测试,关键保障数据平台侧提供的数据质量;

【数据应用侧测试】:应用测试,涵盖数据指标口径测试、功能测试、API接口和性能测试,关键保障数据应用侧用户使用的数据准确性。

 

image

 

ADS层
应用数据存储层,按主题进行汇总,为各种统计报表提供个性化数据、宽表集市、趋势指标
DIM层
维度层。以维度作为建模驱动,基于每个维度的业务含义。
数据平台
数据应用
DWS层
服务数据层,基于DWD上的基础数据,整合汇总成分析某一个主题域的服务数据,建立汇总宽表

 

DWD层

明细数据层,对ODS层数据进行清洗,基于维度建模,明细宽表,复用关联计算,减少数据扫描

 

ODS层

原始数据层,存放在数据仓库系统中,作为业务库等基础数据同步、存储

 

源业务数据库数据、用户日志、爬虫数据、系统日志
业务系统
DataAPI
数据开发平台
BI报表平台
数据应用系统
 

 

三、数据链路测试关键

目前数据测试小组分别从数据平台侧和数据应用侧介入测试验证,其中探索以下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 t
left join ods.ods_set_df p on
p.venno = t.loc
left join ods.ods_req_del_cyc k on
k.loc = t.loc
where
t.stat_date = 20241118
and p.stat_date = 20241118
and k.stat_date = 20241118
  • 数据唯一检查:保证主键或某些字段的唯一性,防止数据重复导致和其他表join之后数据翻倍,导致最终统计数据偏大。
数据唯一
-- 写法1
select
    loc,
    count(1)
from
    dim_dev.dim_cycle_info_df
where
    stat_date = 20241118
    and is_deleted = 0
    and is_new = 0
    and is_distribut = 1
group by
    1
having
    count(1) > 1
 
-- 写法2
select
    count(distinct loc),
    count(1)
from
    dim_dev.dim_cycle_info_df
where
    stat_date = 20241118
    and is_deleted = 0
  • 数据枚举值检查:保证上游依赖数据的枚举值完整,枚举不多不少不为空。
数据枚举值
select
    distinct "source" "数据来源",
    is_new "是否新店"
from
    dim_dev.dim_cycle_info_df
where
    stat_date = 20241118
    and is_deleted = 0
  • 无效剔除数据:保证根据口径剔除的异常数据,符合剔除预期
无效数据剔除
select
    *
from
    dim_dev.dim_cycle_info_df
where
    stat_date = 20241118
    and is_deleted = 1
    -- 剔除数据 ,亦可追溯口径确认是否正确完整删除
  • 异常剔除数据:保证重要字段非空,防止空数据造成和表join之后数据丢失,导致最终统计数据偏少。
异常数据剔除
select
    *
from
    dim_dev.dim_cycle_info_df
where
    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.item
from
    dim.dim_store_basis_info_df t
left join ads.ads_list_df p on
    p.store = t.store
    and p.item = t.item
where
    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_df
where
    stat_date = 20241121
group by
    store ,
    store_name ),
t2 as(
select
    store ,
    store_name ,
    count(distinct wh) as "c2"
from
    ads.ads_store_item_replenishment_result_info_df
where
    stat_date = 20241120 -- 抽样:store =1005023557 wh =524
group by
    store ,
    store_name
    )
select
    t1.*,
    t2.*
from
    t1 t1
left join t2 t2 on
    t1.store = t2.store
where
    t1.c1 != t2.c2
    -- 通过汇总表和明细表的临时表分别统计不同类型数据量,再反向验证是否不匹配,如不匹配,则数据存在差异,反之,数据不存在差异。
  • 逻辑优化前后比对:确认自身任务优化前后的数据波动,防止数据因笛卡尔积等情况导致数据发散
逻辑优化前后比对
-- 生产表vs测试表自身比对
-- part1:同个表在生产和测试的数据差异
select
    t.goods_no ,
    p.goods_no,
    t.good_num ,
    p.good_num,
    t.data_source ,
    p.data_source
from
    ods.ods_pos_st_item_di t
left 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_num
where
    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_source
from
    ods.ods_pos_st_item_di t
left 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_num
where
    t.data_source != p.data_source
    and t.stat_date = 20241118
    and p.stat_date = 20241119
  • 数据异常DQC检验:检验库表及字段等是否存在异常
数据异常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前下发门店等,意味着数据处理各个环节需要有稳定的处理耗时,数据链路累加的数据处理时效需要满足业务使用时间点。

 

0:00~8:30数仓系统
9:30 业务中台
9:00 数据中台
9:30后 门店系统

数据转换加工

1、数据采集、处理调度配置
2、任务数据量核算
3、ETL任务执行成功耗时计算

数据二次处理

1、数据清理和接收
2、数据接收数据量核算
3、数据接收处理总耗时

数据接收

1、数据接收和规则处理
2、数据接收量核算
3、数据接收处理总耗时

数据运用

1、数据查看和运用
2、业务功能应用

数据链路
 

 

  • 调度服务:确认数仓任务执行是否成功,依赖是否超时,通过平台监测任务是否按设定的时间完成,否则则通过短信、电话、企微告警通知相应人员。

 

  • 数据链路监测:通过告警数据处理和下发情况,确保推送数据及时性和完整

4.4、数据稳定性验证(性能)

数据链路的性能需要至上而下,环环相扣,在实际的数据稳定性测试中,需要针对不同的数据节点逐步进行梳理和专项排查。

  • 梳理潜在性能瓶颈数据节点


  • 专项排查节点性能问题并逐步优化,以满足推广或业务使用。

 

四、总结

数据测试是确保大数据应用达到高质量标准的核心环节。它不仅帮助企业在大数据运营的投入转化为预期的业务成果,而且在数字化转型和激烈的市场竞争中,为企业保持竞争优势提供了支持。这也意味着,随着公司业务需求的不断演变发展,数据测试人员必须灵活调整其测试策略、提升对数仓模型和复杂算法策略的测试能力,以及增强自动化数据校对投入力度,以适应新的挑战。通过这些措施,才能更好支撑公司高质量数据服务,从而使公司在大数据领域保持领先地位。

 

posted on 2026-03-19 15:48  三顾繁华  阅读(48)  评论(0)    收藏  举报