スタブテストをdbtで行う「dbt-datamocktool」

2022/06/20に公開

何が出来るのか?

dbt-datamocktool(略称dmt)を使うことでモデルが使用するソースやrefの代わりとなるテーブルデータを定義した上で、モデルの処理をする際に用意した別のデータで処理されるように切り替え、モデルが出力すべき期待するデータになっているのかをテストすることが出来ます。

https://github.com/mjirv/dbt-datamocktool

まずやってみる

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