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.
-- 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 nullaccepted_values
Apakah kolom memiliki nilai yang ditentukan atau tidak.relationships
Apakah integritas referensial terpenuhi.
Sebagai contoh, dalam file .yml
sebagai berikut.
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/
.
{% 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.
version: 2
models:
- name: users
columns:
- name: favorite_number
tests:
- is_even
Referensi