DBT中覆写source宏实现测试运行动态数据源的方案咨询
DBT动态切换数据源实现端到端业务测试方案
核心方案:覆写source宏(完全无需修改现有源配置)
你提出的覆写source宏的思路完全可行,且不会破坏原生source宏的血缘生成、文档渲染、元数据关联等所有能力,也不需要开发人员修改任何现有模型代码或源配置文件,对业务逻辑完全无侵入。
具体实现如下:
- 在项目的
macros目录下新建任意命名的宏文件(比如custom_source.sql),写入以下代码:
{% macro source(source_name, table_name) %} -- 先调用原生source宏保留所有元数据收集能力 {% set original_source = builtins.source(source_name, table_name) %} -- 根据is_test变量判断是否切换测试数据源 {% if var('is_test', default=False) %} -- 可根据你的测试表规则修改,以下是两种常见场景二选一: -- 场景1:测试表和源表同schema,表名加_test后缀 {% set test_source = original_source.replace(identifier = original_source.identifier ~ '_test') %} -- 场景2:所有测试源表统一放在单独的测试schema下,表名和原表一致 -- {% set test_source = original_source.replace(schema = 'your_test_source_schema') %} {% do return(test_source) %} {% else %} {% do return(original_source) %} {% endif %} {% endmacro %}
- 运行测试时只需要在命令行传入变量即可自动切换测试数据源,配合你已有的测试profile输出到独立测试schema:
dbt run --vars '{"is_test": true}' --profile your_test_profile - 校验环节可以额外编写数据对比宏,直接比对模型输出表和你预先准备的预期结果表的全量数据是否一致即可完成业务逻辑验证。
备选方案(无需覆写宏)
如果不想修改宏的实现,也可以通过DBT原生的源覆盖配置实现,仅需在dbt_project.yml中增加以下配置:
sources: your_source_name: +schema: "{% if var('is_test', False) %}your_test_source_schema{% else %}your_prod_source_schema{% endif %}"
该方案同样不需要修改模型代码,仅需调整一次项目级配置即可,缺点是如果有多个源需要逐一配置规则,灵活性略低于覆写宏的方案。
注意事项
- 两种方案都完全保留原生source的所有能力,血缘、文档、现有schema测试都不受任何影响
- 测试用例的输入数据建议通过dbt seed功能统一管理,测试运行前先执行
dbt seed --vars '{"is_test": true}'即可自动导入测试数据到对应测试表
内容的提问来源于stack exchange,提问作者Catazza
相关产品推荐
相关产品推荐

