1. dbt测试与数据质量工程导论

数据质量工程的核心,是把“数据是否可信”从主观感受变成可验证、可追踪、可回归的工程事实。在 dbt 项目中,这意味着每一次模型构建都不只是生成一张表,而是同时回答三个问题:数据是否符合预期结构?业务规则是否被满足?异常是否能在影响下游之前被发现?本章建立后续 29 章共同使用的概念框架,并给出贯穿课程的项目背景。

一、数据质量的六个维度

讨论数据质量时,最容易陷入“数据对不对”这种笼统判断。工程上更有效的做法是把它拆成可分别度量的维度。本课程采用以下六个维度,它们也是后续选择 dbt 测试类型时的判断依据:

  • 完整性(Completeness):应存在的数据是否缺失。例如订单表主键非空、每日分区行数不为 0。
  • 唯一性(Uniqueness):同一实体是否被重复记录。例如 order_id 在订单明细中应唯一。
  • 一致性(Consistency):跨表、跨字段的取值是否自洽。例如订单金额应等于明细金额之和。
  • 准确性(Accuracy):数据是否真实反映业务事实。例如退款金额不得超过原订单金额。
  • 及时性(Timeliness):数据是否在约定时间窗口内可用。例如 T+1 报表应在每日 07:00 前完成。
  • 有效性(Validity):取值是否符合格式与枚举约束。例如 status 只能属于 paid/shipped/refunded。

这六个维度并非彼此独立。一个 NULL 的 customer_id 同时破坏完整性与一致性;一次延迟加载可能让及时性和准确性同时失效。因此在实际项目中,测试设计要按“维度 → 规则 → 断言”的顺序落地,而不是零散地堆砌检查。

二、dbt 在数据质量工程中的定位

dbt 的独特价值在于:它把数据质量检查放进了数据转换本身。传统做法是在 ETL 之外单独维护一套校验脚本,校验逻辑与转换逻辑分离,容易漂移;dbt 则让模型、测试、文档、血缘共享同一份代码仓库和同一次运行。

具体来说,dbt 在数据质量工程中承担四个角色:

  1. 声明式断言层:通过 schema.yml 声明 not_null、unique、accepted_values、relationships 等通用测试,无需为每条规则写独立 SQL。
  2. 可复用业务规则层:用 singular test 或 generic test 封装“金额守恒”“状态流转合法”等业务断言。
  3. 执行与阻断层:dbt test 在模型构建后运行,失败即返回非零退出码,可接入调度器阻断下游。
  4. 可观测层:测试结果、模型血缘、文档共同构成数据可信度的证据链。

需要明确边界:dbt 测试擅长“集合级断言”,不擅长逐行实时校验,也不替代源系统的输入校验。它检查的是转换结果,而不是采集过程。

三、测试驱动开发理念

测试驱动开发(TDD)在软件工程中的经典循环是“红—绿—重构”:先写失败测试,再写实现使其通过,最后重构。dbt 项目可以借鉴这一节奏,但顺序需要调整,因为数据模型往往先有业务需求、后有实现。

推荐的做法是“先定义断言,再实现模型”:

-- 1. 先声明期望(schema.yml)
models:
  - name: fct_orders
    columns:
      - name: order_id
        tests: [not_null, unique]
      - name: status
        tests:
          - accepted_values:
              values: ['paid', 'shipped', 'refunded']

-- 2. 再实现模型(fct_orders.sql)
select order_id, status, amount
from {{ ref('stg_orders') }}
where status is not null

-- 3. 运行验证
dbt test --select fct_orders

这种顺序带来两个直接收益:测试成为需求的显式表达,而不是事后补丁;模型实现有明确的完成标准,避免“看起来对”就交付。TDD 在 dbt 中不是教条,而是一种把质量前移的工程习惯。

四、课程项目背景与目标

本课程围绕一个虚构但贴近真实的电商数据仓库项目展开,代号 ShopFlow。项目包含订单、支付、退款、商品、用户五个业务域,源数据以每日增量方式进入 raw 层,经 staging 清洗后进入 marts 层供报表与风控使用。

项目初始状态存在若干典型质量问题:订单主键重复、退款金额超过原单、状态枚举出现未定义值、部分分区延迟到达。课程将逐步引入 dbt 测试、数据契约、异常监控与质量看板,最终形成一套可运行的质量保障体系。

学习目标包括:能按数据质量维度设计测试;能编写通用测试与 singular test;能用 dbt test 与调度器实现阻断;能通过测试结果定位问题根因;能建立覆盖核心链路的回归测试集。

dbt 数据质量工程:维度 → 断言 → 执行 → 证据 数据质量维度 完整性 Completeness 唯一性 Uniqueness 一致性 Consistency 准确性 Accuracy 及时性 Timeliness 有效性 Validity dbt 的四个角色 声明式断言层 not_null / unique / relationships 业务规则层 singular / generic test 执行与阻断层 dbt test → 非零退出码 可观测层 测试结果 + 血缘 + 文档 测试驱动:先断言,后实现 1. 声明期望 schema.yml 断言 2. 实现模型 SQL 转换逻辑 3. 运行测试 dbt test --select 4. 失败即阻断 定位 → 修复 → 回归 ShopFlow 项目链路 raw staging marts 订单 · 支付 · 退款 · 商品 · 用户 典型问题:主键重复 / 金额越界 / 枚举异常 / 分区延迟 映射 落地