0Pricing
SQL Academy · Урок

Тестирование 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы DBT (Data Build Tool)
  2. SQLFluff и статический анализ
  3. Тестирование SQL: тесты dbt и Great Expectations
  4. CI для изменений схемы (GitHub Actions)
← Назад к SQL Academy