Тестирование SQL: тесты dbt и Great Expectations
Пишите тесты качества данных с помощью dbt (unique, not_null, accepted_values) и создавайте более подробные проверки с Great Expectations
«Тестирование SQL: тесты dbt и Great Expectations» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Зачем тестировать SQL?
Плохие данные остаются незаметными, пока не приведут к неверному решению. Тесты выявляют:
- Изменение схемы (столбец удалён, тип изменён)
- Качество данных (
NULLтам, где он запрещён, дубликаты, значения вне допустимого диапазона) - Проблемы ссылочной целостности (осиротевшие строки)
- Бизнес-инварианты (выручка ≥ 0, итоговые значения сходятся)
Встроенные тесты dbt
Объявляйте их для каждого столбца в 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']Запуск тестов dbt
Выполните все тесты:
dbt test
dbt test --select orders
dbt build # = run + testСпециальные отдельные тесты
Тест — это всего лишь SELECT, который при сбое возвращает строки:
-- tests/no_negative_totals.sql
SELECT id, total
FROM {{ ref('orders') }}
WHERE total < 0Обобщённые тесты
Параметризованные тесты для повторного использования в разных столбцах:
-- 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: 120Пакет dbt-utils
Добавляет дополнительные тесты: уникальные комбинации, expression_is_true, equal_rowcount и другие:
- dbt_utils.expression_is_true:
expression: "revenue >= 0"
- dbt_utils.equal_rowcount:
compare_model: ref('staging_orders')Great Expectations
Более тяжёлая альтернатива — фреймворк на Python с обширной библиотекой проверок и подробными отчётами:
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')Когда что использовать
- тесты dbt — первый выбор, если вы уже используете dbt; лёгкое решение только на SQL
- Great Expectations — когда нужны подробные отчёты, более широкий набор проверок и форматы за пределами SQL (CSV/parquet)
Критичность тестов
dbt 1.0+ поддерживает уровни критичности warn и error:
- accepted_values:
values: [...]
config:
severity: warn
warn_if: ">100"
error_if: ">1000"Интеграция с непрерывной интеграцией
Запускайте тесты для каждого PR и блокируйте слияние при сбое:
# GitHub Actions
- run: dbt deps && dbt build --profiles-dir profiles
- if: failure()
run: echo "::error::dbt tests failed"Панели качества данных
dbt-utils, dbt-expectations и Elementary могут преобразовать результаты тестов в панель Grafana / Looker.
Тесты схемы и тесты строк
Выявляйте регрессии схемы с помощью «снимка» dbt, содержащего типы столбцов; тесты строк выявляют ошибки в данных.
Итоги
Тестирование превращает SQL из «просто поверьте мне» в «проверено».
- тесты dbt для декларативных проверок в хранилище данных
- Great Expectations для более широких и подробных проверок
- Запускайте в непрерывной интеграции и блокируйте процесс при сбое
- Отслеживайте результаты во времени
Быстрая проверка
Вам нужен тест dbt, который завершается ошибкой, если в какой-либо строке есть total < 0. Какой подход будет самым простым?
Часто задаваемые вопросы
Урок «Тестирование SQL: тесты dbt и Great Expectations» бесплатный?
Да — полный текст урока «Тестирование SQL: тесты dbt и Great Expectations» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Тестирование SQL: тесты dbt и Great Expectations»?
Пишите тесты качества данных с помощью dbt (unique, not_null, accepted_values) и создавайте более подробные проверки с Great Expectations Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Тестирование SQL: тесты dbt и Great Expectations»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы DBT (Data Build Tool)
- SQLFluff и статический анализ
- Тестирование SQL: тесты dbt и Great Expectations
- CI для изменений схемы (GitHub Actions)