用途:为 dbt 模型编写单元测试,用静态输入验证 SQL 建模逻辑,测试失败时该模型不会被物化。适合复杂逻辑(正则、日期运算、窗口函数、多分支 case、复杂 join)、自定义数据处理逻辑、曾出现缺陷的逻辑、边界情况、重构前保护,以及高关键性模型。不建议测试仓库已充分覆盖的内置函数或 min() 等通用 SQL 函数。
主要能力:单元测试采用“模型—输入—输出”结构,model 指定被测模型,given 用 ref 或 source 模拟上游输入,expect 声明预期行。支持 dict(默认)、csv、sql 三种数据格式;dict 与 csv 只需列出相关列,sql 必须列出全部列。支持增量模型、版本化模型、ephemeral 依赖(须用 sql 格式)、特殊覆盖等场景,并提供各数据仓库的注意事项与数据类型说明。
使用方式:在 models 目录的 YAML 中定义 unit_tests,fixture 文件放在 tests/fixtures。运行 dbt build --select hello_world 可先跑单元测试再物化;仅跑单元测试用 dbt test --select "hello_world,test_type:unit",或按名称 dbt test --select test_is_valid_email_address。上游模型需先存在,可用 dbt run --select +my_model --exclude my_model --empty 构建仅含结构的版本,但 --empty 会覆盖已有模型数据,需谨慎。建议仅在开发或 CI 运行,生产构建用 --exclude-resource-type 或 DBT_EXCLUDE_RESOURCE_TYPES 排除。
限制:仅支持 SQL 模型,不支持 Python 模型、snapshot、seed、source、analysis 等非模型节点,不支持跨项目或包内模型、materialized view、递归 SQL、内省查询;不支持 Jinja 格式;增量模型不支持校验最终表状态。测试失败会显示 actual differs from expected 的数据差异,需人工判断是测试构造错误还是模型缺陷。具体平台细节与数据类型处理请查阅对应参考文件。