Примеры выбора тестов
Выбор тестов работает немного иначе, чем выбор других типов ресурсов. Это делает очень простым выполнение следующих задач:
- запуск тестов для конкретной модели
- запуск тестов для всех моделей в подкаталоге
- запуск тестов для всех моделей выше / ниже по графу зависимостей (upstream / downstream) относительно модели и т.д.
Как и все типы ресурсов, тесты можно выбирать напрямую — с помощью методов и операторов, которые сопоставляются с их атрибутами: именем, свойствами, тегами и т.д.
В отличие от других типов ресурсов, тесты также можно выбирать косвенно. Если метод или оператор выбора включает родительский ресурс (или ресурсы) теста, то сам тест тоже будет выбран. Подробнее см. ниже.
Выбор тестов — мощный механизм, и мы понимаем, что он может быть непростым для понимания. Поэтому ниже мы привели большое количество примеров.
Прямой выбор (Direct selection)
Запуск только generic-тестов:
dbt test --select "test_type:generic"
Запуск только singular-тестов:
dbt test --select "test_type:singular"
В обоих случаях test_type проверяет свойство самого теста. Это примеры прямого выбора тестов.
Косвенный выбор (Indirect selection)
Вы можете использовать следующие режимы для настройки поведения при выполнении косвенного выбора (по умолчанию используется режим eager). Исключение тестов всегда жадное: если ЛЮБОЙ родитель явно исключен, тест также будет исключен.
Режимы buildable и cautious могут быть полезны, когда вы строите только подмножество вашего DAG и хотите избежать сбоев тестов в режиме eager, вызванных не построенными ресурсами. Вы также можете достичь этого с помощью отложенного выполнения.
Режим Eager
По умолчанию запускает тесты, если любой из родительских узлов выбран, независимо от того, выполнены ли все зависимости. Это включает ЛЮБЫЕ тесты, которые ссылаются на выбранные узлы. Модели будут построены, если они зависят от выбранной модели. В этом режиме любые тесты, зависящие от не построенных ресурсов, вызовут ошибку.
Режим Buildable
Запускает только те тесты, которые ссылаются на выбранные узлы (или их предков). Этот режим немного более инклюзивен, чем cautious, включая тесты, ссылки которых находятся в пределах выбранных узлов (или их предков). Этот режим полезен, когда тест зависит от модели и прямого предка этой модели, например, для подтверждения, что агрегирование имеет те же итоги, что и его входные данные.
Режим Cautious
Гарантирует, что тесты выполняются и модели строятся только тогда, когда все необходимые зависимости выбранных моделей выполнены. Ограничивает тесты только теми, которые исключительно ссылаются на выбранные узлы. Тесты будут выполнены только в том случае, если все узлы, от которых они зависят, выбраны, что предотвращает выполнение тестов, если один или несколько их родительских узлов не выбраны и, следовательно, не построены.
Режим Empty
Ограничивает сборку только выбранным узлом и игнорирует любые косвенные зависимости, включая тесты. Он не выполняет никаких тестов, независимо от того, прикреплены ли они непосредственно к выбранному узлу или нет. Режим empty не включает никаких тестов и автоматически используется для интерактивной компиляции.
Примеры косвенного выбора
Чтобы наглядно представить работу этих режимов, предположим, что у вас есть model_a, model_b и model_c и связанные с ними data tests. Ниже показано, какие тесты будут выполнены при запуске dbt build с различными режимами косвенного выбора:
- Режим Eager (по умолчанию)
- Режим Buildable
- Режим Cautious
- Режим Empty
В этом примере во время процесса сборки будут выполнены любые тесты, которые зависят от выбранной модели orders или от моделей, зависящих от неё, даже если сами тесты также зависят от других моделей.
dbt test --select "orders"
dbt build --select "orders"
В этом примере dbt выполняет тесты, которые ссылаются на orders в рамках выбранных узлов (или их предков).
dbt test --select "orders" --indirect-selection=buildable
dbt build --select "orders" --indirect-selection=buildable
В этом примере будут выполнены только те тесты, которые зависят исключительно от модели orders:
dbt test --select "orders" --indirect-selection=cautious
dbt build --select "orders" --indirect-selection=cautious
В этом режиме не выполняются никакие тесты — независимо от того, привязаны ли они напрямую к выбранному узлу или нет.
dbt test --select "orders" --indirect-selection=empty
dbt build --select "orders" --indirect-selection=empty
Примеры синтаксиса выбора тестов
Параметр indirect_selection также можно задать в yaml-селекторе.
Следующие примеры должны показаться знакомыми, если вы привыкли выполнять dbt run с опцией --select для сборки частей вашего DAG:
# Запуск тестов для одной модели (косвенный выбор)
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"
# Запуск тестов для всех моделей с определённой materialization (косвенный выбор)
dbt test --select "config.materialized:table"
Тот же принцип можно применить и к тестам, определённым для других типов ресурсов. В этих случаях будут выполнены все тесты, определённые на источниках, выбранных с помощью метода source::
# тесты на всех источниках
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:
- 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:
- 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"




