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

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

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

  • запуска тестов на конкретной модели
  • запуска тестов на всех моделях в подкаталоге
  • запуска тестов на всех моделях, находящихся выше или ниже по потоку от модели, и т.д.

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

В отличие от других типов ресурсов, тесты также могут быть выбраны косвенно. Если метод выбора или оператор включает родительский(ие) элемент(ы) теста, тест также будет выбран. См. ниже для получения более подробной информации.

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

Прямой выбор

Запуск только общих тестов:

dbt test --select "test_type:generic"

Запуск только единичных тестов:

dbt test --select "test_type:singular"

В обоих случаях test_type проверяет свойство самого теста. Это формы "прямого" выбора тестов.

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

Вы можете использовать следующие режимы для настройки поведения при выполнении косвенного выбора (по умолчанию используется режим eager). Исключение тестов всегда жадное: если ЛЮБОЙ родитель явно исключен, тест также будет исключен.

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

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

Режим Eager

По умолчанию запускает тесты, если любой из родительских узлов выбран, независимо от того, выполнены ли все зависимости. Это включает ЛЮБЫЕ тесты, которые ссылаются на выбранные узлы. Модели будут построены, если они зависят от выбранной модели. В этом режиме любые тесты, зависящие от не построенных ресурсов, вызовут ошибку.

Режим Buildable

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

Режим Cautious

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

Режим Empty

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

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

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

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

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

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

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

Установка 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"

# Запуск тестов на всех моделях с определённой материализацией (косвенный выбор)
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:*"

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

С помощью комбинации прямого и косвенного выбора существует множество способов достичь одного и того же результата. Допустим, у нас есть тест данных с именем 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
dbt test --select "payments,test_type:data" # косвенный выбор, v0.18.0
dbt test --select "payments" --data # косвенный выбор, более ранние версии

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

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

# Запуск тестов на всех seeds, которые используют материализацию 'seed'
dbt test --select "config.materialized:seed"

# Запуск тестов на всех snapshots, которые используют материализацию 'snapshot'
dbt test --select "config.materialized:snapshot"

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

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

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

models/<filename>.yml
version: 2

models:
- name: orders
columns:
- name: order_id
tags: [my_column_tag]
tests:
- unique

dbt test --select "tag:my_column_tag"

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

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

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

models/<filename>.yml
version: 2

models:
- name: orders
columns:
- name: order_id
tests:
- unique:
tags: [my_test_tag]

dbt test --select "tag:my_test_tag"

0