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

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

Создать тест

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

См. пример создания тестов в задаче по программированию.

Авторское решение

Авторское решение понадобится для самопроверки при редактировании задачи, генерации файлов ответа и использовании генератора тестов.

Добавить авторское решение

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

Запустить задачу на авторском решении

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

Примечание

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

Запуск задачи локально

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

Примечание

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

Генераторы тестов

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

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

Окружение для генераторов тестов

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

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

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

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

Примечание

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

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

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

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

Внимание

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

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

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

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

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

Пример простого генератора на C++
#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.

Добавить генератор

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

Запустить генерацию теста

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

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

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

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

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

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

Валидаторы тестов

Валидатор — это программа, которая проверяет файл с входными данными, чтобы он четко соответствовал правилам.

Валидатор можно написать на C++ с использованием библиотеки testlib.h или на другом поддерживаемом языке.

Пример кода валидатора на C++

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

#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.

Добавить новый валидатор

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

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

Редактировать валидатор

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

  1. В списке валидаторов нажмите значок в строке с нужным валидатором.

  2. В открывшейся модальной форме вы можете:

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

Важно

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

Запустить валидатор

Нажмите кнопку Запустить все валидаторы или в строке с нужным валидатором нажмите значок .
Появятся результаты работы каждого валидатора для каждого файла теста или ответа.

Наборы тестов

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

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

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

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

Если хотите удалить набор, нажмите в строке с нужным набором.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Написать в службу поддержки
Предыдущая
Следующая