⛳
スタブテストをdbtで行う「dbt-datamocktool」
何が出来るのか?
dbt-datamocktool(略称dmt)を使うことでモデルが使用するソースやrefの代わりとなるテーブルデータを定義した上で、モデルの処理をする際に用意した別のデータで処理されるように切り替え、モデルが出力すべき期待するデータになっているのかをテストすることが出来ます。
まずやってみる
1. パッケージをインストールする
packages.ymlに以下の設定を追加してdbt depsコマンドでインストールを行う
- package: mjirv/dbt_datamocktool
version: [">=0.1.10"]
2. 入力データと期待するデータを作成します
作成するデータは以下の2つを用意します。
- 入力側のソースやrefで参照する入力側データ
- 上記入力側に対して、モデルが処理して期待される出力側のデータ
このデータの生成方法はseedを使ったり、マクロを使ったり、他のモデル定義を参照したりすることができますが、おすすめは「モデル定義」をしてしまうのが良さそうです。
3. テストを設定する
モックデータを用意出来たら後はschema.ymlにテストを設定しましょう。
schema.yml
models:
- name: stg_orders
tests:
- dbt_datamocktool.unit_test:
input_mapping:
ref('raw_orders'): ref('dmt__raw_orders_1')
expected_output: ref('dmt__expected_stg_orders_1')
columns:
...
テストを実行しましょう
dbt test --select stg_orders
所感
ロジックが複雑になりがちで、また入力値側のデータの条件やパターンが多く結合テストをしづらい場合等に部分的に導入すると開発時のコストを一定下げていくことができそうです。ただそれには気をつけなければいけない視点もあり(後述のリンクたちに一旦任せる)どのように運用していくべきかは注意が必要。
この記事で今の所書けていないこと
- データの生成手法の細かい比較
- フォルダ毎に出力するデータセットをカスタマイズする方法
- 単体テスト(スタブ)は万能ではなく、気をつけなきゃいけない視点もある話
Discussion