Перейти к основному содержимому

Примеры выбора тестов

Выбор тестов работает немного иначе, чем выбор других типов ресурсов. Это делает очень простым выполнение следующих задач:

  • запуск тестов для конкретной модели
  • запуск тестов для всех моделей в подкаталоге
  • запуск тестов для всех моделей выше / ниже по графу зависимостей (upstream / downstream) относительно модели и т.д.

Как и все типы ресурсов, тесты можно выбирать напрямую — с помощью методов и операторов, которые сопоставляются с их атрибутами: именем, свойствами, тегами и т.д.

В отличие от других типов ресурсов, тесты также можно выбирать косвенно через связи в вашем DAG. Если метод или оператор выбора включает модель, от которой зависит тест, dbt также выберет этот тест. Например, при выполнении dbt test --select model_b dbt включает тесты, определённые для model_b, а также тесты для связанных моделей (например, model_a), которые ссылаются на model_b. Подробнее об управлении этим поведением см. в разделе Косвенный выбор.

Выбор тестов — мощный механизм, и мы понимаем, что он может быть непростым для понимания. Поэтому ниже мы привели большое количество примеров.

Прямой выбор (Direct selection)​

Используйте селектор test_type, чтобы запускать определённую категорию тестов независимо от выбора моделей. Это полезно, когда нужно отделить модульные тесты от тестов данных — например, запускать только модульные тесты во время разработки для быстрой обратной связи или только тесты данных в продакшене, где вычисления для модульных тестов не нужны. Селектор test_type работает со всеми движками (dbt v1 и dbt v2).

Следующие конфигурации можно использовать с селектором test_type для компиляции соответствующих узлов тестов без их выполнения. Подробнее о поведении команды см. в разделе О команде dbt compile.

Запуск только модульных тестов — используйте этот вариант во время разработки или в CI для проверки SQL-логики до материализации моделей:

dbt test --select "test_type:unit"

Запуск всех тестов данных (включая типовые и единичные) — используйте этот вариант, чтобы полностью пропустить модульные тесты, например в производственных пайплайнах:

dbt test --select "test_type:data"

Запуск только типовых тестов данных — используйте этот вариант для выполнения проверок на уровне схемы, определённых в файлах .yml (таких как not_null и unique), без запуска пользовательских SQL-файлов тестов:

dbt test --select "test_type:generic"

Запуск только единичных тестов данных — используйте этот вариант для запуска только пользовательских SQL-файлов тестов из каталога tests/, без запуска типовых тестов схемы:

dbt test --select "test_type:singular"

Во всех случаях test_type проверяет свойство самого теста — это варианты «прямого» выбора тестов.

Косвенный выбор​

Режимы косвенного выбора определяют, какие тесты запускаются в зависимости от выбранных моделей и их связей в вашем DAG. Эти режимы определяют, как dbt обрабатывает тесты, которые ссылаются на выбранные модели напрямую или через связи с вышестоящими и нижестоящими моделями.

Вы можете использовать следующие режимы (по умолчанию — eager). Исключение тестов всегда выполняется по жадному принципу: если ХОТЯ БЫ ОДИН родительский узел явно исключён, тест также будет исключён.

Создание подмножеств DAG

Режимы buildable и cautious могут быть полезны, когда вы строите только подмножество вашего DAG и хотите избежать сбоев тестов в режиме eager, вызванных не построенными ресурсами. Вы также можете достичь этого с помощью отложенного выполнения.

Режим eager (по умолчанию)​

Этот режим охватывает наибольшее количество тестов и запускает их, если выбран хотя бы один из родительских узлов, независимо от того, удовлетворены ли все зависимости. Сюда входят любые тесты, которые ссылаются на выбранные узлы, даже если они также ссылаются на другие, невыбранные узлы.

Например, если вы выполните dbt test --select model_b, в режиме eager будут запущены:

  • Тесты непосредственно для model_b
  • Тесты в вышестоящих моделях (таких как model_a), которые ссылаются на model_b
  • Тесты в нижестоящих моделях, которые ссылаются на model_b

dbt строит модели, которые зависят от выбранной модели. В этом режиме любые тесты, зависящие от ресурсов, которые не были построены, приведут к ошибке.

Режим Buildable​

Режим Buildable — это промежуточный вариант между cautious и eager: в нём запускаются только тесты, ссылающиеся на выбранные узлы (или их предков). Этот режим немного менее строгий, чем cautious: он включает тесты, каждая ссылка которых указывает на выбранный узел или его предка. Этот режим полезен, когда тест зависит от модели и её непосредственного предка, например при проверке того, что итоговые значения после агрегации совпадают с итоговыми значениями входных данных.

Режим Cautious​

Cautious — самый строгий режим: он гарантирует, что тесты выполняются, а модели строятся только при соблюдении всех необходимых зависимостей выбранных моделей. Он ограничивает набор тестов теми, которые ссылаются исключительно на выбранные узлы. Тесты выполняются только в том случае, если выбраны все узлы, от которых они зависят. Это предотвращает запуск тестов, если один или несколько их родительских узлов не выбраны и, следовательно, не построены.

Режим Empty​

В режиме Empty тесты не запускаются, а построение ограничивается выбранным узлом: все косвенные зависимости игнорируются. В этом режиме не выполняются никакие тесты, независимо от того, привязаны ли они непосредственно к выбранному узлу. Режим Empty автоматически используется для интерактивной компиляции.

Примеры косвенного выбора​

Чтобы наглядно представить работу этих режимов, предположим, что у вас есть model_a, model_b и model_c и связанные с ними data tests. Ниже показано, какие тесты будут выполнены при запуске dbt build с различными режимами косвенного выбора:

dbt builddbt build
Eager (по умолчанию)Eager (по умолчанию)
BuildableBuildable
CautiousCautious
EmptyEmpty

В этом примере во время процесса сборки будут выполнены любые тесты, которые зависят от выбранной модели orders или от моделей, зависящих от неё, даже если сами тесты также зависят от других моделей.

dbt test --select "orders"
dbt build --select "orders"

Примеры синтаксиса выбора тестов​

Параметр indirect_selection также можно задать в yaml-селекторе.

В следующих примерах для косвенного выбора по умолчанию используется режим eager, если вы не укажете другой режим (например, --indirect-selection=cautious).

Операторы выбора (+, tags и другие) определяют, какие модели будут выбраны; режим косвенного выбора определяет, какие тесты будут запущены для этих моделей.

# Запустить тесты для модели (косвенный выбор) 
dbt test --select "customers"

# Запустить тесты для двух или более конкретных моделей (косвенный выбор)
dbt test --select "customers orders"

# Запуск тестов для всех моделей в директории models/staging/jaffle_shop (косвенный выбор)
dbt test --select "staging.jaffle_shop"

# Запуск тестов ниже по графу зависимостей от модели
# (обратите внимание: эти тесты будут выбраны напрямую!)
dbt test --select "stg_customers+"

# Запуск тестов выше по графу зависимостей от модели (косвенный выбор)
dbt test --select "+stg_customers"

# Запуск тестов для всех моделей с определённым тегом (прямой + косвенный выбор)
dbt test --select "tag:my_model_tag"

# Запустить тесты для всех моделей с определённой материализацией (косвенный выбор)
dbt test --select "config.materialized:table"

# Чтобы изменить режим косвенного выбора, добавьте флаг:
dbt test --select "customers" --indirect-selection=cautious

Тот же принцип можно применить и к тестам, определённым для других типов ресурсов. В этих случаях будут выполнены все тесты, определённые на источниках, выбранных с помощью метода `source:`:

```bash
# тесты на всех источниках
dbt test --select "source:*"

# тесты на одном источнике
dbt test --select "source:jaffle_shop"

# тесты на двух или более конкретных источниках
dbt test --select "source:jaffle_shop source:raffle_bakery"

# тесты на одной таблице источника
dbt test --select "source:jaffle_shop.customers"

# тесты на всём, _кроме_ источников
dbt test --exclude "source:*"

Более сложный выбор​

Комбинируя прямой и косвенный выбор, можно добиться одного и того же результата разными способами. Допустим, у нас есть data test с именем assert_total_payment_amount_is_positive, который зависит от модели payments. Все приведённые ниже команды позволят выбрать и выполнить именно этот тест:

dbt test --select "assert_total_payment_amount_is_positive" # прямой выбор теста по имени
dbt test --select "payments,test_type:singular" # косвенный выбор, v1.2

Если вы можете выбрать общее свойство группы ресурсов, косвенный выбор позволяет выполнить все тесты, связанные с этими ресурсами. В примере выше мы увидели, что можно запустить тесты для всех моделей с materialization table. Этот принцип распространяется и на другие типы ресурсов:

# Запуск тестов для всех моделей с определённой materialization
dbt test --select "config.materialized:table"

# Запуск тестов для всех seeds, использующих materialization 'seed'
dbt test --select "config.materialized:seed"

# Запуск тестов для всех snapshots, использующих materialization 'snapshot'
dbt test --select "config.materialized:snapshot"

Обратите внимание, что это поведение может измениться в будущих версиях dbt.

Запуск тестов для колонок с тегами​

Поскольку колонка order_id помечена тегом my_column_tag, сам тест также получает тег my_column_tag. Поэтому это пример прямого выбора.

models/<filename>.yml
models:
- name: orders
columns:
- name: order_id
config:
tags: [my_column_tag] # changed to config in v1.10 and backported to 1.9
data_tests:
- unique
dbt test --select "tag:my_column_tag"

В настоящее время тесты «наследуют» теги, применённые к колонкам, источникам и таблицам источников. Они не наследуют теги, применённые к моделям, seeds или snapshots. Скорее всего, такие тесты всё равно будут выбраны косвенно, потому что тег выбирает их родительский ресурс. Это тонкое различие, и оно может измениться в будущих версиях dbt.

Запуск только тегированных тестов​

Это ещё более наглядный пример прямого выбора: сам тест помечен тегом my_test_tag и выбирается напрямую.

models/<filename>.yml
models:
- name: orders
columns:
- name: order_id
data_tests:
- unique:
config:
tags: [my_test_tag] # changed to config in v1.10
dbt test --select "tag:my_test_tag"

Нашли ошибку?

0
Loading