# Шардинг тестов Rust {#rust-test-sharding}

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

> [!IMPORTANT] Requirements
> - Настройте <.localized_link href="/guides/features/test-insights/rust">Rust Test Insights</.localized_link> и аутентифицируйте CLI в задаче планирования и на воркерах.
> - Выберите один пакет, используя `-p <package>` в рабочем пространстве. Шардинг нескольких пакетов не поддерживается.
> - Используйте одинаковую ревизию, инструментарий Rust, выбор пакета, возможности (features) и фильтры тестов в каждой задаче.

## Создание плана {#create-a-plan}

Добавьте количество шардов к `--no-run`, чтобы скомпилировать и перечислить цели без выполнения тестов:

```sh
TUIST_SHARD_REFERENCE=my-ci-run tuist cargo test -p store --no-run --shard-max 4
```

Команда выводит JSON, содержащий `shard_plan_id` и массив `shards` с нулевой индексацией. В GitHub Actions она также записывает `shard-plan-id` и `shards` в `GITHUB_OUTPUT`. Если явная ссылка не указана, Tuist формирует её на основе поддерживаемой CI-среды.

| Опция | Описание |
| --- | --- |
| `--shard-max N` | Максимальное количество шардов |
| `--shard-min N` | Минимальное количество шардов |
| `--shard-total N` | Точное количество, вплоть до доступных целей |
| `--shard-max-duration N` | Целевая максимальная длительность шарда в миллисекундах |

Используйте `--shard-total` отдельно или комбинируйте `--shard-min` и `--shard-max`. При отсутствии исторических данных планировщик использует оценки целей по умолчанию. Обычная команда `--no-run` без опций шардинга остаётся командой только для сборки.

## Выполнение каждого шарда {#execute-each-shard}

Задайте ID плана и индекс шарда на каждом воркере, затем используйте те же аргументы для тестов Cargo:

```sh
TUIST_SHARD_PLAN_ID=<plan-id> TUIST_SHARD_INDEX=0 tuist cargo test -p store
```

В качестве альтернативы установите `TUIST_SHARD_REFERENCE` равным ссылке задачи планирования вместо передачи ID плана. Tuist получает назначение и просит Cargo выполнить только соответствующие цели. Недействительные или несовместимые назначения приводят к ошибке команды, а не к запуску всех тестов. Пустые назначения не выполняют тесты. Результаты с воркеров связываются с планом в Test Insights, и <.localized_link href="/guides/features/test-insights/flaky-tests/rust#quarantine">карантин</.localized_link> применяется в пределах каждого шарда.

## Ограничения {#limits}

Это шардинг на уровне целей, а не распределение с однократной сборкой. Каждому воркеру требуется клон исходного кода и сборка своих целей; <.localized_link href="/guides/features/cache/rust">кэш компиляции Cargo</.localized_link> позволяет повторно использовать подходящие результаты компиляции. Tuist не загружает исполняемые файлы тестов и не требует другого раннера для тестов Rust.

Для шардинга требуется выбрать один пакет. Сужение команды для нескольких пакетов может изменить унифицированные зависимости возможностей (features) в Cargo, поэтому Tuist отклоняет такую команду вместо запуска тестов с другим графом возможностей. Планируйте каждый пакет отдельно, пока не будет добавлена поддержка шардинга нескольких пакетов.

Шардинг требует стандартных harness'ов libtest и захвата вывода по умолчанию. Команды с тихим режимом, подробным выводом, альтернативным форматом, без захвата вывода и с пользовательскими harness'ами отклоняются. Если Cargo не может однозначно определить цель, выберите конкретный пакет рабочего пространства с помощью `-p <package>`. Пакеты зависимостей, селекторы с указанием версии, глобальные шаблоны имён пакетов/целей и ночная опция Cargo `-C` не поддерживаются для шардинга. Сохраняйте идентичный выбор тестов при планировании и выполнении.
