Traffine I/O

Bahasa Indonesia

2022-12-30

Tes dbt

Pendahuluan

dbt menyediakan kemampuan untuk menguji model. Tes digunakan untuk mendeteksi masuknya data berkualitas rendah dan untuk menjaga kualitas data.

Ada dua cara untuk mendefinisikan tes

  • Tes tunggal
  • Tes generik

Setelah mendefinisikan sebuah tes, jalankan perintah dbt test untuk menjalankan tes.

Tes tunggal

Tes tunggal adalah menulis kode tes sebagai file .sql di direktori yang ditentukan dalam test-paths di dbt_project.yml (/tests secara default).

Kode tes harus berisi pernyataan SELECT yang mencari baris yang seharusnya tidak ada.

Sebagai contoh, jika Anda memiliki model yang disebut fct_payments dan Anda ingin menguji apakah amount adalah nilai positif, Anda akan menulis SQL berikut.

tests/assert_amount_is_positive.sql
-- Refunds have a negative amount, so the total amount should always be >= 0.
-- Therefore return records where this isn't true to make the test fail
select
  order_id,
  sum(amount)
from {{ ref('fct_payments')}}
group by 1
having not(amount >= 0)

Perintah dbt test mengeksekusi kode tes, dan jika sebuah baris diambil, tes gagal. Jika test gagal, akan terlihat seperti ini.

$ dbt test
14:19:07  Running with dbt=1.0.4
14:19:07  Found 1 model, 1 test, 0 snapshots, 0 analyses, 165 macros, 0 operations, 0 seed files, 2 sources, 0 exposures, 0 metrics
14:19:07
14:19:07  Concurrency: 1 threads (target='dev')
14:19:07
14:19:07  1 of 1 START test assert_amount_is_positive........................ [RUN]
14:19:07  1 of 1 FAIL 1 assert_amount_is_positive............................ [FAIL 1 in 0.05s]
14:19:07
14:19:07  Finished running 1 test in 0.23s.
14:19:07
14:19:07  Completed with 1 error and 0 warnings:
14:19:07
14:19:07  Failure in test assert_fct_payments (tests/assert_amount_is_positive.sql)
14:19:07    Got 1 result, configured to fail if != 0
14:19:07
14:19:07    compiled SQL at target/compiled/my_dbt_proj/tests/assert_amount_is_positive.sql
14:19:07
14:19:07  Done. PASS=0 WARN=0 ERROR=1 SKIP=0 TOTAL=1

Tes yang berhasil akan menghasilkan yang berikut ini.

$ dbt test

14:21:33  Running with dbt=1.0.4
14:21:33  Found 1 model, 1 test, 0 snapshots, 0 analyses, 165 macros, 0 operations, 0 seed files, 2 sources, 0 exposures, 0 metrics
14:21:33
14:21:33  Concurrency: 1 threads (target='dev')
14:21:33
14:21:33  1 of 1 START test assert_amount_is_positive....................... [RUN]
14:21:33  1 of 1 PASS assert_amount_is_positive............................. [PASS in 0.05s]
14:21:33
14:21:33  Finished running 1 test in 0.23s.
14:21:33
14:21:33  Completed successfully
14:21:33
14:21:33  Done. PASS=1 WARN=0 ERROR=0 SKIP=0 TOTAL=1

Tes Generik

Tes generik menggunakan empat tes skema standar yang disediakan oleh dbt.

  • unique
    apakah kolom tersebut unik atau tidak.
  • not_null
    apakah kolom tidak memiliki nilai null
  • accepted_values
    Apakah kolom memiliki nilai yang ditentukan atau tidak.
  • relationships
    Apakah integritas referensial terpenuhi.

Sebagai contoh, dalam file .yml sebagai berikut.

models/schema.yml
version: 2

models:
  - name: customers
    columns:
      - name: customer_id
        tests:
          - unique
          - not_null

  - name: stg_customers
    columns:
      - name: customer_id
        tests:
          - unique
          - not_null

  - name: stg_orders
    columns:
      - name: order_id
        tests:
          - unique
          - not_null
      - name: status
        tests:
          - accepted_values:
              values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
      - name: customer_id
        tests:
          - not_null
          - relationships:
              to: ref('stg_customers')
              field: customer_id

Running dbt test will run a test of the contents of the above yml file.

The schema test can also be extended by yourself by using external packages such as dbt-utils.

Tes Generik kustom

Tes Generik kustom dapat dibuat jika tes Generik standar tidak memiliki fungsionalitas.

Tes Generik kustom adalah file SQL dengan blok test di direktori tests/generic atau macros/.

tests/generic/test_is_even.sql
{% test is_even(model, column_name) %}

with validation as (
    select
        {{ column_name }} as even_field
    from {{ model }}
),
validation_errors as (
    select even_field
    from validation
    where (even_field % 2) = 1
)
select *
from validation_errors

{% endtest %}

Buat file .yml pada level yang sama dengan file model data dan letakkan nama-nama tes di bagian tests sebagai berikut.

models/schema.yml
version: 2

models:
  - name: users
    columns:
      - name: favorite_number
        tests:
          - is_even

Referensi

https://docs.getdbt.com/docs/build/tests

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!