---
metadata:
  - name: generator
    content: Diplodoc Platform v5.48.2
alternate:
  - https://admin.contest.yandex.ru/docs/en/problem/tests.md
  - https://admin.contest.yandex.ru/docs/ru/problem/tests.md
---
> **Documentation Index:** Fetch the complete configuration index at https://admin.contest.yandex.ru/docs/ru/llms.txt

# Тесты и решения

Для задачи можно создать тесты, указать файлы с авторским решением&nbsp;— для самопроверки при редактировании задачи, настроить генераторы и валидаторы тестов, а также собрать наборы тестов.

## Создать тест {#test-make}

1. На странице с задачей выберите в меню слева **Тесты и решения**.
2. Нажмите кнопку **Создать тест**.
3. Заполните поля формы: укажите название тестового файла, тестовые данные, название файла ответа и ответ.
4. Нажмите кнопку **Добавить**. Файл теста появится в директории **tests**.

См. пример создания тестов в [задаче по программированию](https://admin.contest.yandex.ru/docs/ru/examples/programming.md#add-test).

## Авторское решение {#author-solutions}

Авторское решение понадобится для самопроверки при редактировании задачи, генерации файлов ответа и использовании [генератора тестов](#tests-generators).

### Добавить авторское решение {#author-solutions}

1. В разделе **Решения** нажмите кнопку **Добавить решение**.
2. Нажмите **Выбрать файл** и загрузите готовое решение. Файл с авторским решением появится в директории с файлами задачи.
3. Выберите загруженный файл и нажмите **Выбрать**. Файл добавится в задачу. Пока это просто файл, отмеченный как решение.

### Запустить задачу на авторском решении {#author-solutions}

1. В списке решений выберите компилятор, подходящий авторскому решению.
2. Нажмите **Отправить**. Будет создана посылка, на которой будут выполнены все тесты и учтены настроенные ограничения.

{% note info %}

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

{% endnote %}

## Запуск задачи локально {#local-run}

Для запуска решения задачи на локальном компьютере используйте утилиту **yc-invoke**. Чтобы получить пример команды запуска утилиты для вашей задачи, выберите необходимый компилятор из списка представленных.

{% note info %}

Локальный запуск доступен не для всех типов задач и компиляторов. Подробнее про настройку, параметры запуска и ограничения в использовании утилиты читайте в разделе [Локальный запуск задачи](https://admin.contest.yandex.ru/docs/ru/problem/local-run.md).

{% endnote %}

## Генераторы тестов {#tests-generators}

Генератор&nbsp;— это специальная программа, которой на вход может подаваться какое-то значение. На выходе образуется псевдослучайный набор данных, которые будут использоваться как тестовые.

Отличительная особенность генератора от простого рандомизатора&nbsp;— постоянство выходных данных работы генератора при одних и тех же входных данных на разных платформах.

### Окружение для генераторов тестов {#generators-environment}

Для генераторов тестов можно выбрать окружение (компилятор), в котором они будут выполняться. Выбранный компилятор применяется ко всем генераторам в задаче.

#### Как выбрать окружение

Чтобы выбрать окружение:

1. Перейдите в раздел **Тесты и решения** и найдите поле **Окружение генераторов**.
2. Выберите нужное окружение из выпадающего списка.

{% note info %}

При изменении окружения в поле отображается индикатор загрузки до завершения сохранения.

{% endnote %}

#### Особенности работы с окружением

Если в задаче нет генераторов, в поле отображается текст **Не выбрано**, а кнопка **Добавить** заблокирована.

После выбора окружения в поле отображается его название, и настройка сразу применяется ко всем существующим генераторам.

{% note alert %}

Для задач, созданных до появления возможности выбирать окружение, в поле может отображаться **Legacy** окружение. Это старый способ запуска генераторов.

При выбранном **Legacy**:

- Добавление или удаление генераторов заблокировано.
- Редактирование скрипта заблокировано.
- Существующие генераторы по-прежнему можно запускать.

Для работы с генераторами выберите современное окружение.

При смене с **Legacy** на другое окружение **Legacy** больше не отображается в выпадающем списке.

{% endnote %}

{% cut "Пример простого генератора на C++" %}

```cpp
#include "testlib.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    registerGen(argc, argv, 1);
    int n = atoi(argv[1]);
    cout << rnd.next(1, n) << " ";
    cout << rnd.next(1, n) << endl;
}
```

Этот генератор принимает на вход один аргумент и выдает в **stdout** два числа в диапазоне от 1 до входного аргумента. Подробнее см. на сайте [Testlib](https://github.com/MikeMirzayanov/testlib).

{% endcut %}

### Добавить генератор {#tests-generators}

1. В разделе **Сгенерировать тесты** нажмите **Добавить новый генератор**.
2. Нажмите **Выбрать файл** и загрузите файл с кодом генератора. Файл с генератором появится в директории с файлами задачи.
3. Выберите загруженный файл и нажмите **Выбрать**. Файл добавится в задачу.

### Запустить генерацию теста {#tests-generators}

Чтобы запустить генерацию тестов, потребуется добавленное авторское решение и скрипт генерации тестов.

В скрипте генерации указывается название файла генератора. Аргументы запуска файла и вывод сохраняются в определенный файл, обычно в файл теста:

```
generator_name.cpp 1 > tests/01
generator_name.cpp 5 > tests/02
generator_name.cpp 15 > tests/03
```

Чтобы запустить генерацию тестов и ответов:

1. В поле **Редактировать скрипт генерации тестов** введите или вставьте скрипт генерации тестов и нажмите **Сохранить**.
2. В списке ниже выберите загруженное авторское решение и нажмите **Выполнить**.

Система поочередно запустит генератор с переданными аргументами и сохранит данные в файлы тестов. После этого система поочередно запустит авторское решение и сгенерированные файлы тестов. Вывод сохранится в файл ответа теста.

## Валидаторы тестов {#tests-validators}

Валидатор&nbsp;— это программа, которая проверяет файл с входными данными, чтобы он четко соответствовал [правилам](https://codeforces.com/blog/entry/18426).

Валидатор можно написать на C++ с использованием библиотеки [testlib.h](https://github.com/MikeMirzayanov/testlib) или на другом поддерживаемом языке.

{% cut "Пример кода валидатора на C++" %}

Валидатор проверяет, что в файле теста строго подряд идут: число, пробел, число, конец строки. Конец такого файла:

```cpp
#include "testlib.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    registerValidation();

    cout << inf.readLong(-1000000000000000LL, 1000000000000000LL);
    inf.readSpace();
    cout << " ";
    cout << inf.readLong(-1000000000000000LL, 1000000000000000LL);
    inf.readEoln();
    cout << endl;
    inf.readEof();
}
```

Подробнее см. [Testlib](https://github.com/MikeMirzayanov/testlib).

{% endcut %}

### Добавить новый валидатор {#tests-validators}

1. В разделе **Валидаторы** нажмите **Добавить валидатор**.
2. Нажмите **Выбрать файл** и загрузите файл с кодом валидатора. Файл с валидатором появится в директории с файлами задачи.
3. Выберите загруженный файл и нажмите **Выбрать**. Файл добавится в задачу.
4. Выберите окружение для запуска валидатора из выпадающего списка. По умолчанию выбирается C++20 (GCC 14.1).
5. В списке валидаторов выберите **Да**, чтобы валидатор применялся к файлу ответа, или **Нет**, чтобы валидатор применялся к файлу входных данных.

В таблице валидаторов отображается колонка **Окружение**, в которой указана выбранная среда выполнения для каждого валидатора. Для валидаторов, добавленных до внедрения выбора окружения, отображается метка **Legacy**.

### Редактировать валидатор {#tests-validators-edit}

Чтобы изменить настройки валидатора:

1. В списке валидаторов нажмите значок ![](../_images/edit-icon.png) в строке с нужным валидатором.
2. В открывшейся модальной форме вы можете:

   - Просмотреть имя файла валидатора (только для чтения);
   - Изменить настройку **Применить к ответу** (Да/Нет);
   - Выбрать другую среду выполнения для запуска валидатора.

3. Нажмите **Сохранить**.

{% note warning %}

Для валидаторов с окружением **Legacy** обязательно требуется выбрать среду выполнения. Пока она не выбрана, в форме редактирования будет отображаться ошибка, и кнопка сохранения будет неактивна.

{% endnote %}

### Запустить валидатор {#tests-validators}

Нажмите кнопку **Запустить все валидаторы** или в строке с нужным валидатором нажмите значок ![](../_images/play-icon.png).
Появятся результаты работы каждого валидатора для каждого файла теста или ответа.

## Наборы тестов {#test-set}

Наборы тестов нужны для группировки и разделения тестов. По умолчанию в задаче есть набор **All tests**. Также в задачу можно добавить наборы **samples** и простые нумерованные наборы (1, 2, 3 и т. д.).

Набор **samples**&nbsp;— это специальный набор, который отображается в условии задачи. Рекомендуем включать в этот набор 1–3 теста, чтобы участники соревнования видели, с какими данными им предстоит работать.

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

Чтобы добавить набор тестов, нажмите кнопку **Добавить набор тестов**, чтобы добавить **samples**&nbsp;— кнопку **Добавить сэмплы**.

Если хотите удалить набор, нажмите ![](../_images/remove-icon.png) в строке с нужным набором.

Нажмите название набора, чтобы перейти к настройкам:

- **Шаблон входного файла (input)**&nbsp;— это шаблон, по которому система ищет файлы тестов. По умолчанию указано значение, которое позволяет найти тесты со стандартным названием.

    Для поиска файлов вы можете использовать следующие выражения:

    - **Без шаблонов** — соответствует заданному имени.

        Например, "tests/01" — система будет искать в&#160;папке "tests" файл с именем "01".

    - **Wildcard-матчер** — одна подстановка: "?" — это один любой символ.

        Например, "tests/??" — система будет искать в папке "tests" файлы, имена которых состоят из двух символов, "a1", "b2", "00" и так далее.

    - **Range-матчер** — диапазон или отдельные значения.

        Например, "tests/{1-2,5,44-}" — система будет искать в папке "tests" файлы, имена которых состоят из символов 1, 2, 5 или начиная с 44 и далее. Начальные нули игнорируются, так строка "01" будет рассматриваться как 1.



- **Шаблон файла правильного ответа**&nbsp;— это шаблон, по которому система ищет файл с ответом теста.

    В шаблонах можно использовать:

    - **\*** — полный путь к инпуту.

        Например, файл с тестами "tests/01.txt" будет соответствовать "tests/01.txt".

    - **%f** — имя файла инпута.

        Например, файл с тестами "tests/01.txt" будет соответствовать "01.txt".

    - **%s** — имя файла инпута без расширения.

        Например, файл с тестами "tests/01.txt" будет соответствовать "01".

    - **%p** — полный путь к инпуту без расширения.

        Например, файл с тестами "tests/01.txt" будет соответствовать "tests/01".




После изменений обновите наборы тестов: раскройте нужный набор и нажмите кнопку **Обновить тесты**. Список тестов в наборе будет обновлен в соответствии с шаблонами входного файла и файла правильного ответа.

<!-- source: ru/_includes/reusables/support-button.md -->
<a href="../../troubleshooting">
  <span class="button">Написать в службу поддержки</span>
</a>



<!-- endsource: ru/_includes/reusables/support-button.md -->
