如何在无仓库真实表时用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
相关产品推荐
相关产品推荐

