dbtのcustom generic testを実装してみた
generic testとはなにか
dbtのテストは以下の3種類が存在しています。
- generic test
- singular test
- unit test
generic testの考え方
generic testは特定のmodel、columnに対して、データのテストを行います。
エラーデータを抽出するためのSELECT文を書き、実際にデータが抽出されたらエラーを検出します。
個人的な理解だと「テスト用の関数」です。
SELECT文の書き方
例えば、特定のカラムが正の数であることを保証するテストは以下のように作成します。
SELECT文は、0以下の値を持つレコードが抽出されるように条件を追加します。
select * from {{model}}
where {{column_name}} <= 0 -- 0以下の値が抽出されるようにする
{{model}} {{column_name}} については現段階ではスルーしてください。
generic testを定義するファイル作成
実際にはSELECT文だけではなく、以下のようにdbt用のおまじないを付け足します。
{% test myTest(model, column_name) %}
select * from {{model}}
where {{column}} <= 0 -- 0以下の値が抽出されるようにする
{% endtest %}
これを「.sql」の拡張子で指定したフォルダに配置します。
ここでは、myTest.sqlという名前にします。
sqlファイルを置く場所
作成したmyTest.sqlを以下の場所に配置します。
dbt/tests/generic
「tests」はデフォルトの位置です。
変更したい場合は、「dbt_project.yml」の以下のセクションで指定します。
test-paths: ["tests"]
ここまで出来たらcustom generic testの定義は完成です。
実際にテストをする
次は、テストの適用方法です。
modelを定義するymlに以下のように記載をします。
version: 2
models:
- name: test_object
columns:
- name: TEST_ID
description: ''
data_type: INT
tests:
- myTest
このように記載すると、「myTest」のgeneric testに、test_objectというモデルのTEST_IDというカラムがテスト対象として指定されることになります。
{% test myTest(model, column_name) %}
ここのmodel、column_nameに渡されてテストが実行されることになります。
実際にテストを実行してみると、以下のようにテストが実施され成功していることがわかります。
わざと失敗をするSELECT文に修正をしてテストを実行すると、このようにエラーが検出されます。