数据质量是数据仓库建设中的重中之重,数据仓库的测试应成为确保数据质量、满足上层应用需求的关键环节,应该得到足够的重视。但目前数据仓库的业务逻辑比较复杂,也缺乏成熟的测试策略,因此记录下工作中对数仓的测试方法。
前言
数仓模型的构建主要包括 业务建模、领域概念建模、逻辑模型 和 物理建模 四个阶段。
物理建模主要包含以下几个部分:
- 针对特定物理化平台,做出相应的技术调整
- 针对模型的性能考虑,对特定平台作出相应的调整
- 针对管理的需要,结合特定的平台,做出相应的调整
-
物理模型具体要求
确定项目资源
根据预算和项目需求,对该项目的成本周期和资源进行估算
-
确定软硬件配置
估算数据容量
-
数据仓库的存储设计
ODS 层:从应用系统采集而来,只保存一定时间,同时支持部分近实时性报表展示
- DWD 层:保存经过清洗、转换和重新组织的业务数据,数据将保存较久,满足系统最细颗粒度的查询需求
- DWS 层:支持汇总层面的指标查询,提高汇总级数据展示的速度和数据保存时间,保存较久的历史数据
APP 层:基于一类特定分析主题需要,从企业级数据仓库单独获取的一个数据逻辑或物理子集
ETL 工具选择
spark
- hive
- sqoop
- kylin
-
测试策略
按照测试对象的不同,将数据仓库测试分为 数据集测试 和 脚本级测试
数据级测试
测试对象:数据仓库中的表、字段、记录数等内容,内容包括:
完整性验证
- 准确性验证
- 合理性验证
数据完整性测试
数据完整性测试是指保证数据仓库中的所有表、表的所有字段没有遗漏。具体来讲,数据完整性测试又包含表的完整性检查、记录数完整性检查、字段完整性检查、主外键关系完整性检查四个方面:
1、表的完整性检查:
- 定义:表的完整性是检查是否需要入库的目标表已经存在于数据仓库中,以防止有数据表的遗漏
- 方法:对需要入库的表和已在库中的表进行比对,查看需要入库的表是否全部已入库
2、记录数完整性检查:
- 定义:录数完整性检查是指检查所有在库目标表的记录数,查看记录数是否在合理范围内
- 方法:用 SQL 语句中的 count 函数查询待检查表的实际记录数,并与预期的做比较
3、字段完整性检查:
- 定义:是指检查所有在库目标表的实际字段和预期设计字段是否一致
- 方法:检查数仓中表的数据结构,并与预期的字段列表、字段类型做比较
4、主外键关系完整性检查:
- 定义:外键表中外键的取值必须在主键表中存在,否则在今后对外键表、主键表关联时,就可能会出现错误
- 方法:将外键表中外键的取值与主键表中主键的取值进行比对,比对前可以进行 distinct 操作
数据合理性测试
- 主键重复检查:在一个表里,主键是不能重复的,否则在今后取值应用时会出现错误
- 测试方法:执行 SQL:SELECT PK1,PK2 FROM TABLE GROUP BY PK1,PK2 HAVING COUNT(*)>1
- 通过准则:查询结果要为空
- 时间拉链检查:起始时间和结束时间容易混,结束时间要大于起始时间
- 字段取值范围检查:数据库表中每个字段的取值需要符合字典表的范围设置
- 取值分布检查:正常情况下,即使某个字段允许为空,但为空的字段也不能过多(如超过所有记录数的20%)。如果超过,则可能是数据在处理过程中出现了问题,需要检查
日期字段检查:如果日期型数据在源表中是字符类型的,转换到目标表后就要做日期格式的校验,验证一下是否还是有效的日期格式
数据准确性测试
总体汇总校验:对于数值型字段,可以从整个表的层面,对其汇总数据进行整体校验,常见:
- 按时间汇总校验:全年销额 = 1月销额+2月销额…+12月的销额
- 按店铺汇总校验:全年销额 = 店铺A+店铺B的销额+…
- 按品类汇总校验:全年销额 = A品类 + B品类的销额+…
- 从交易明细汇总:全年销额 = 全年所有单笔订单交易销额总和
- 同比环比校验:可以计算出同环比的销额,然后再进行比较
- 采用双路比对进行校验:所谓双路比对,就是测试人员重新根据业务逻辑编写一遍ETL,生成结果表,将测试人员生成的结果表中的数据与开发人员的生成数据进行比对。此种测试工作量较大,对测试人员的编程能力要求较高,耗费时间长
脚本级测试
测试对象:数据仓库脚本(ETL 脚本、数据访问脚本等),内容包括:
