Testowanie SQL: testy dbt, Great Expectations
Pisać testy jakości danych za pomocą dbt (unique, not_null, accepted_values) oraz bardziej rozbudowane asercje z Great Expectations
Testowanie SQL: testy dbt, Great Expectations to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Dlaczego testować SQL?
Błędne dane pozostają niewidoczne, dopóki nie doprowadzą do błędnej decyzji. Testy wykrywają:
- Rozbieżności schematu (usuniętą kolumnę, zmieniony typ)
- Problemy z jakością danych (NULL-e tam, gdzie są niedozwolone, duplikaty, wartości poza zakresem)
- Problemy z integralnością referencyjną (osierocone wiersze)
- Niezmienniki biznesowe (przychód ≥ 0, sumy się zgadzają)
Wbudowane testy dbt
Deklaruje się je dla każdej kolumny w YAML:
# models/orders.yml
version: 2
models:
- name: orders
columns:
- name: id
tests:
- unique
- not_null
- name: user_id
tests:
- not_null
- relationships:
to: ref('users')
field: id
- name: status
tests:
- accepted_values:
values: ['pending', 'paid', 'cancelled']Uruchamianie testów dbt
Uruchomienie wszystkich testów:
dbt test
dbt test --select orders
dbt build # = run + testNiestandardowe testy singularne
Test to po prostu instrukcja SELECT, która w przypadku niepowodzenia zwraca wiersze:
-- tests/no_negative_totals.sql
SELECT id, total
FROM {{ ref('orders') }}
WHERE total < 0Testy generyczne
Sparametryzowane testy do ponownego wykorzystania w wielu kolumnach:
-- tests/generic/test_in_range.sql
{% test in_range(model, column_name, min, max) %}
SELECT * FROM {{ model }}
WHERE {{ column_name }} < {{ min }} OR {{ column_name }} > {{ max }}
{% endtest %}
-- Use it in YAML:
columns:
- name: age
tests:
- in_range:
min: 0
max: 120Pakiet dbt-utils
Dodaje więcej testów: unikalne kombinacje, expression_is_true, equal_rowcount itd.:
- dbt_utils.expression_is_true:
expression: "revenue >= 0"
- dbt_utils.equal_rowcount:
compare_model: ref('staging_orders')Great Expectations
Bardziej rozbudowana alternatywa — framework Pythona z obszerną biblioteką asercji i bogatymi raportami:
import great_expectations as ge
suite = context.add_or_update_expectation_suite('orders')
batch = context.get_validator(batch_request, expectation_suite_name='orders')
batch.expect_column_values_to_not_be_null('id')
batch.expect_column_values_to_be_between('total', 0, 10000)
results = context.run_checkpoint('orders_checkpoint')Kiedy używać poszczególnych narzędzi
- testy dbt — pierwszy wybór, gdy już używają Państwo dbt; lekkie rozwiązanie działające wyłącznie z SQL
- Great Expectations — gdy potrzebne są bogate raporty, szerszy zakres asercji oraz formaty inne niż SQL (CSV/parquet)
Poziom ważności testu
dbt 1.0+ obsługuje poziomy ważności warn i error:
- accepted_values:
values: [...]
config:
severity: warn
warn_if: ">100"
error_if: ">1000"Integracja z CI
Uruchamiaj testy przy każdym PR — w przypadku niepowodzenia blokuj scalanie:
# GitHub Actions
- run: dbt deps && dbt build --profiles-dir profiles
- if: failure()
run: echo "::error::dbt tests failed"Pulpity jakości danych
dbt-utils + dbt-expectations + Elementary mogą przekształcić wyniki testów w pulpit Grafana / Looker.
Testy schematu a testy wierszy
Regresje schematu można wykrywać za pomocą „migawki” typów kolumn w dbt, a testy wierszy wykrywają błędy danych.
Podsumowanie
Testowanie zmienia SQL z „zaufaj mi” w „zweryfikowano”.
- Testy dbt do deklaratywnego wykonywania w hurtowni
- Great Expectations do szerszych i bogatszych testów
- Uruchamianie w CI; blokowanie w przypadku niepowodzenia
- Śledzenie wyników w czasie
Szybki test
Chcą Państwo utworzyć test dbt, który zakończy się niepowodzeniem, jeśli dowolny wiersz będzie zawierał total < 0. Jakie jest najprostsze rozwiązanie?
Często zadawane pytania
Czy lekcja „Testowanie SQL: testy dbt, Great Expectations” jest bezpłatna?
Tak — pełny tekst „Testowanie SQL: testy dbt, Great Expectations” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Testowanie SQL: testy dbt, Great Expectations”?
Pisać testy jakości danych za pomocą dbt (unique, not_null, accepted_values) oraz bardziej rozbudowane asercje z Great Expectations Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Testowanie SQL: testy dbt, Great Expectations”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy DBT (Data Build Tool)
- SQLFluff i lintowanie
- Testowanie SQL: testy dbt, Great Expectations
- CI dla zmian schematu (GitHub Actions)