You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无仓库真实表时用Mock数据开展Dbt单元测试?

问题

我正在研究dbt单元测试,看到官方文档提示:

你要进行单元测试的模型的直接父对象(比如示例中的stg_customers和top_level_email_domains)必须先存在于数据仓库中,才能执行单元测试。

但因特殊需求,我希望在数据仓库无真实表的情况下,通过Mock数据进行dbt单元测试,且仍连接Trino查询引擎执行SQL。例如针对如下模型:

SELECT t1.url
FROM {{ source('tuandb', 'news_urls') }} t1
    LEFT JOIN {{ source('tuandb', 'urls_2') }} t2
    ON t1.url = t2.url
WHERE t2.url IS NULL

仅需为不存在于仓库的news_urls和urls_2提供Mock数据,请问该方案是否可行?

回答

可行。你完全可以通过dbt单元测试的内置能力模拟源表数据,不需要依赖数据仓库里的真实表,同时保持Trino作为查询引擎的连接。具体操作如下:

  • 编写单元测试配置文件
    在tests/unit目录下创建对应模型的测试YAML文件(比如test_missing_urls.yml),通过sources块定义模拟的源表数据,直接替换仓库中不存在的真实表:
unit_tests:
  - name: test_missing_urls
    model: your_target_model  # 替换成你要测试的模型名称
    sources:
      - name: tuandb
        tables:
          - name: news_urls
            data:
              - url: "https://example.com/news1"
              - url: "https://example.com/news2"
              - url: "https://example.com/news3"
          - name: urls_2
            data:
              - url: "https://example.com/news2"
    expected:
      - url: "https://example.com/news1"
      - url: "https://example.com/news3"
  • 执行单元测试
    运行dbt单元测试命令即可,Trino会基于你定义的Mock数据执行测试逻辑,完全不需要访问仓库里的真实源表:
dbt test --select unit:test_missing_urls

背后的逻辑是:dbt执行单元测试时,会把你定义的Mock数据转换成临时CTE(公共表表达式),替换模型里引用的source对象,之后在Trino中运行完整的测试查询,自动对比结果和预期值是否匹配。

注意:要确保你的dbt Core版本在v1.3及以上(该版本开始支持单元测试功能),同时Trino适配器能正常处理临时CTE的逻辑。

内容的提问来源于stack exchange,提问作者mhtuan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:37:41