# Нестабильные тесты в Rust {#rust-flaky-tests}

Tuist может обнаруживать противоречивые результаты тестов Cargo и помогать вам исследовать их в разделе **Тесты → Нестабильные тесты**.

> [!IMPORTANT] Requirements
> - Настройте <.localized_link href="/guides/features/test-insights/rust">аналитику тестов Rust</.localized_link>.

## Как работает обнаружение нестабильности {#how-it-works}

Tuist сравнивает запуски CI для одного и того же коммита. Тест, который проходит в одном запуске и падает в другом, может быть помечен как нестабильный.

Отправляйте отчет о каждом запуске с помощью обычной команды:

```sh
tuist cargo test --workspace
```

Cargo не повторяет упавшие тесты автоматически. Повторный запуск задачи CI на том же коммите дает еще один результат для межзапускового обнаружения.

## Управление нестабильными тестами {#managing-flaky-tests}

### Автоматическая очистка

Обнаружение и восстановление выполняются через автоматизацию проекта «Обнаружение нестабильных тестов». По умолчанию флаг нестабильности снимается через 14 дней без повторного срабатывания. Измените окно восстановления и действия в разделе **Настройки → Автоматизации**.

### Ручное управление

Откройте **Тесты → Нестабильные тесты**, чтобы просмотреть историю теста. Вы можете вручную пометить или снять пометку о нестабильности на странице деталей теста.

## Карантин и стресс-тестирование {#quarantine}

Заглушите или пропустите тест на странице его деталей либо настройте карантин в разделе **Настройки → Автоматизации**. Следующий запуск `tuist cargo test` получит текущее состояние карантина проекта:

- **Заглушенные** тесты все равно выполняются и сообщают свои фактические результаты, но их сбои не приводят к падению команды. Другие сбои тестов, ошибки компиляции, краши и неполные результаты по-прежнему приводят к обычному падению.
- **Пропущенные** тесты исключаются из выполнения и отмечаются как пропуски из-за карантина. Сопоставление включает пакет, цель, путь модуля Rust и имя теста, поэтому тесты с похожими именами остаются независимыми.

При заглушении сохраняются выбранные пакеты рабочего пространства и возможности, а также выполняются все выбранные цели, даже если заглушенная цель падает. Пропуск по карантину требует выбора одного пакета: используйте `tuist cargo test -p store` вместо команды для многопакетного рабочего пространства. Tuist отклоняет пропуск нескольких пакетов, потому что сужение команды может изменить объединенные возможности зависимостей Cargo.

Карантин также применяется к <.localized_link href="/guides/features/test-sharding/rust">разделенным запускам Cargo</.localized_link>. Если Tuist не может получить состояние, он выдает предупреждение и выполняет запуск без карантина; сбои не подавляются. Чтобы намеренно запустить без карантина:

```sh
TUIST_TEST_SKIP_QUARANTINE=1 tuist cargo test --workspace
```

Для применения требуются стандартные harness-фреймворки libtest и захват вывода по умолчанию. Команды с тихим, подробным, альтернативным форматом или незахваченным выводом завершаются ошибкой, когда нужно применить карантин. Выберите точный пакет рабочего пространства с помощью `-p <package>`, если определение цели неоднозначно. Пользовательские harness-фреймворки, глобы имен пакетов/целей и неразрешенные выборы пакетов не поддерживаются. Doctest-тесты также можно заглушать или пропускать, но фильтрация тестов Rustdoc не может различить каждую возможную пару имен примеров. Если пропуск примера также привел бы к пропуску включенного примера или частичное исключение doctest использует `--exact`, Tuist завершается с диагностикой вместо выполнения пропущенного примера или молчаливого пропуска включенных тестов; используйте приведенное выше переопределение во время расследования.

Tuist не проводит стресс-тестирование новых тестов Cargo. Используйте фильтр тестов Cargo, чтобы повторить падающий тест во время его исследования:

```sh
tuist cargo test -p store rejects_invalid_token
```

## Уведомления в Slack {#notifications}

Настройте <.localized_link href="/guides/integrations/slack#flaky-test-alerts">оповещения о нестабильных тестах в Slack</.localized_link>, чтобы уведомлять вашу команду, когда тест становится нестабильным.
