Тесты и решения
Для задачи можно создать тесты, указать файлы с авторским решением — для самопроверки при редактировании задачи, настроить генераторы и валидаторы тестов, а также собрать наборы тестов.
Создать тест
- На странице с задачей выберите в меню слева Тесты и решения.
- Нажмите кнопку Создать тест.
- Заполните поля формы: укажите название тестового файла, тестовые данные, название файла ответа и ответ.
- Нажмите кнопку Добавить. Файл теста появится в директории tests.
См. пример создания тестов в задаче по программированию.
Авторское решение
Авторское решение понадобится для самопроверки при редактировании задачи, генерации файлов ответа и использовании генератора тестов.
Добавить авторское решение
- В разделе Решения нажмите кнопку Добавить решение.
- Нажмите Выбрать файл и загрузите готовое решение. Файл с авторским решением появится в директории с файлами задачи.
- Выберите загруженный файл и нажмите Выбрать. Файл добавится в задачу. Пока это просто файл, отмеченный как решение.
Запустить задачу на авторском решении
- В списке решений выберите компилятор, подходящий авторскому решению.
- Нажмите Отправить. Будет создана посылка, на которой будут выполнены все тесты и учтены настроенные ограничения.
Примечание
Если задача изменилась, необязательно снова загружать авторское решение и создавать из него посылку. Просто нажмите Пересудить у уже созданной посылки. В этом случае решение будет перезапущено с новыми файлами тестов и настройками.
Запуск задачи локально
Для запуска решения задачи на локальном компьютере используйте утилиту yc-invoke. Чтобы получить пример команды запуска утилиты для вашей задачи, выберите необходимый компилятор из списка представленных.
Примечание
Локальный запуск доступен не для всех типов задач и компиляторов. Подробнее про настройку, параметры запуска и ограничения в использовании утилиты читайте в разделе Локальный запуск задачи.
Генераторы тестов
Генератор — это специальная программа, которой на вход может подаваться какое-то значение. На выходе образуется псевдослучайный набор данных, которые будут использоваться как тестовые.
Отличительная особенность генератора от простого рандомизатора — постоянство выходных данных работы генератора при одних и тех же входных данных на разных платформах.
Окружение для генераторов тестов
Для генераторов тестов можно выбрать окружение (компилятор), в котором они будут выполняться. Выбранный компилятор применяется ко всем генераторам в задаче.
Как выбрать окружение
Чтобы выбрать окружение:
- Перейдите в раздел Тесты и решения и найдите поле Окружение генераторов.
- Выберите нужное окружение из выпадающего списка.
Примечание
При изменении окружения в поле отображается индикатор загрузки до завершения сохранения.
Особенности работы с окружением
Если в задаче нет генераторов, в поле отображается текст Не выбрано, а кнопка Добавить заблокирована.
После выбора окружения в поле отображается его название, и настройка сразу применяется ко всем существующим генераторам.
Внимание
Для задач, созданных до появления возможности выбирать окружение, в поле может отображаться 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.
Добавить генератор
- В разделе Сгенерировать тесты нажмите Добавить новый генератор.
- Нажмите Выбрать файл и загрузите файл с кодом генератора. Файл с генератором появится в директории с файлами задачи.
- Выберите загруженный файл и нажмите Выбрать. Файл добавится в задачу.
Запустить генерацию теста
Чтобы запустить генерацию тестов, потребуется добавленное авторское решение и скрипт генерации тестов.
В скрипте генерации указывается название файла генератора. Аргументы запуска файла и вывод сохраняются в определенный файл, обычно в файл теста:
generator_name.cpp 1 > tests/01
generator_name.cpp 5 > tests/02
generator_name.cpp 15 > tests/03
Чтобы запустить генерацию тестов и ответов:
- В поле Редактировать скрипт генерации тестов введите или вставьте скрипт генерации тестов и нажмите Сохранить.
- В списке ниже выберите загруженное авторское решение и нажмите Выполнить.
Система поочередно запустит генератор с переданными аргументами и сохранит данные в файлы тестов. После этого система поочередно запустит авторское решение и сгенерированные файлы тестов. Вывод сохранится в файл ответа теста.
Валидаторы тестов
Валидатор — это программа, которая проверяет файл с входными данными, чтобы он четко соответствовал правилам.
Валидатор можно написать на 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.
Добавить новый валидатор
- В разделе Валидаторы нажмите Добавить валидатор.
- Нажмите Выбрать файл и загрузите файл с кодом валидатора. Файл с валидатором появится в директории с файлами задачи.
- Выберите загруженный файл и нажмите Выбрать. Файл добавится в задачу.
- Выберите окружение для запуска валидатора из выпадающего списка. По умолчанию выбирается C++20 (GCC 14.1).
- В списке валидаторов выберите Да, чтобы валидатор применялся к файлу ответа, или Нет, чтобы валидатор применялся к файлу входных данных.
В таблице валидаторов отображается колонка Окружение, в которой указана выбранная среда выполнения для каждого валидатора. Для валидаторов, добавленных до внедрения выбора окружения, отображается метка Legacy.
Редактировать валидатор
Чтобы изменить настройки валидатора:
-
В списке валидаторов нажмите значок
в строке с нужным валидатором. -
В открывшейся модальной форме вы можете:
- Просмотреть имя файла валидатора (только для чтения);
- Изменить настройку Применить к ответу (Да/Нет);
- Выбрать другую среду выполнения для запуска валидатора.
-
Нажмите Сохранить.
Важно
Для валидаторов с окружением 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".
-
После изменений обновите наборы тестов: раскройте нужный набор и нажмите кнопку Обновить тесты. Список тестов в наборе будет обновлен в соответствии с шаблонами входного файла и файла правильного ответа.