7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

dbtのcustom generic testを実装してみた

Posted at

dbtのcustom generic testを実装してみた

generic testとはなにか

dbtのテストは以下の3種類が存在しています。

  1. generic test
  2. singular test
  3. 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に渡されてテストが実行されることになります。

実際にテストを実行してみると、以下のようにテストが実施され成功していることがわかります。

image.png

わざと失敗をするSELECT文に修正をしてテストを実行すると、このようにエラーが検出されます。
image.png

参考

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?