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

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

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

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

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

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

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

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

Следующие конфигурации можно использовать с селектором `test_type` для компиляции соответствующих узлов тестов без их выполнения. Подробнее о поведении команды см. в разделе [О команде dbt compile](https://docs.getdbt.tech/reference/commands/compile.md).

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

```bash
dbt test --select "test_type:unit"
```

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

```bash
dbt test --select "test_type:data"
```

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

```bash
dbt test --select "test_type:generic"
```

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

```bash
dbt test --select "test_type:singular"
```

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

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

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

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

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

Режимы `buildable` и `cautious` могут быть полезны, когда вы строите только подмножество вашего DAG и хотите избежать сбоев тестов в режиме `eager`, вызванных не построенными ресурсами. Вы также можете достичь этого с помощью [отложенного выполнения](https://docs.getdbt.tech/reference/node-selection/defer.md).

#### Режим 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 автоматически используется для [интерактивной компиляции](https://docs.getdbt.tech/reference/commands/compile.md#interactive-compile).

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

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

[![dbt build](/img/docs/reference/indirect-selection-dbt-build.png?v=2 "dbt build")](#)dbt build

[![Eager (по умолчанию)](/img/docs/reference/indirect-selection-eager.png?v=2 "Eager (по умолчанию)")](#)Eager (по умолчанию)

[![Buildable](/img/docs/reference/indirect-selection-buildable.png?v=2 "Buildable")](#)Buildable

[![Cautious](/img/docs/reference/indirect-selection-cautious.png?v=2 "Cautious")](#)Cautious

[![Empty](/img/docs/reference/indirect-selection-empty.png?v=2 "Empty")](#)Empty

### Режим Eager (по умолчанию)

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

```shell
dbt test --select "orders"
dbt build --select "orders"
```

### Режим Buildable

В этом примере dbt выполняет тесты, которые ссылаются на `orders` в рамках выбранных узлов (или их предков).

```shell
dbt test --select "orders" --indirect-selection=buildable
dbt build --select "orders" --indirect-selection=buildable
```

### Режим Cautious

В этом примере будут выполнены только те тесты, которые зависят *исключительно* от модели `orders`:

```shell
dbt test --select "orders" --indirect-selection=cautious
dbt build --select "orders" --indirect-selection=cautious
```

### Режим Empty

В этом режиме не выполняются никакие тесты — независимо от того, привязаны ли они напрямую к выбранному узлу или нет.

```shell
dbt test --select "orders" --indirect-selection=empty
dbt build --select "orders" --indirect-selection=empty
```

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

Параметр `indirect_selection` также можно задать в [yaml-селекторе](https://docs.getdbt.tech/reference/node-selection/yaml-selectors.md#indirect-selection).

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

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

````bash
# Запустить тесты для модели (косвенный выбор) 
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`. Все приведённые ниже команды позволят выбрать и выполнить именно этот тест:

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

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

```bash
# Запуск тестов для всех моделей с определённой 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

```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
```

```bash
dbt test --select "tag:my_column_tag"
```

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

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

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

models/\<filename>.yml

```yml
models:
  - name: orders
    columns:
      - name: order_id
        data_tests:
          - unique:
            config:
              tags: [my_test_tag] # changed to config in v1.10
```

```bash
dbt test --select "tag:my_test_tag"
```
