Генерация тестов

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

Генераторы тестов – это программы, которые выводят входные или выходные данные в свой стандартный поток вывода ("на экран"). Кроме того, генераторы ответов получают входные данные через стандартный ввод, поэтому вы можете использовать авторские решения как генератор ответов. Вы можете настроить поведение генератора, указав дополнительные аргументы при настройке тестов.

Процесс генерации выполняется асинхронно. Каждый раз, когда вы изменяете код генератора или параметры теста, отдельный процесс генерирует тестовые данные и загружает их в задачу. Эти данные генерируются один раз и используются во время оценивания. Однако в редких случаях, если пользователь отправляет решение сразу после внесения изменений в тесты, но до того, как были сгенерированы тестовые данные, система сгенерирует эти данные во время процесса оценивания. Помните об этом, когда вносите изменения в задачи во время активного соревнования.

Настройка генераторов тестов

Чтобы использовать генераторы тестов, сначала нужно создать программу генератора в разделе «Скрипты», а затем настроить его в самом тесте.

  1. Откройте консоль, выберите пространство и задачу, которую хотите настроить.

  2. Перейдите в раздел «Скрипты», создайте новый скрипт и укажите компилятор и исходный код для генератора.

  3. Перейдите в раздел «Тестирование» и выберите набор тестов.

  4. Откройте тест и выберите «Сгенерировать входные данные с помощью скрипта» и/или «Сгенерировать ответ с помощью скрипта».

  5. Введите команду для генерации, используя синтаксис: script-name arg1 arg2 arg3.... Команда состоит из аргументов, разделенных пробелами, начиная с имени скрипта (генератора). Остальные аргументы передаются программе во время выполнения и зависят от реализации генератора.

После сохранения этих изменений система поставит задачу на генерацию тестов в очередь. Вы можете отслеживать прогресс во вкладке «Активность» задачи.

Рис. 1. Раздел «Активность» в задаче

После завершения генерации данные станут доступны в блоке «Предварительный просмотр ответа» в тесте.

Примеры

Генерация ответов

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

  • Подготовьте файлы входных данных и решение автора для задачи.

  • В разделе «Скрипты» задачи добавьте новый скрипт с именем solution, выберите язык программирования и вставьте исходный код решения автора.

    Рис. 2. Диалог создания скрипта

  • Перейдите в раздел «Тестирование», выберите или добавьте набор тестов.

  • Добавьте новый тест, загрузите входные данные и выберите «Сгенерировать ответные данные с помощью скрипта». Укажите solution в поле «Команда для ответа».

    Test generators.png

    Рис. 3. Интерфейс редактирования теста

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

Генерация входных данных для простой задачи

Этот пример демонстрирует, как написать генератор входных данных для Простой задачи. Генератор принимает два аргумента: нижнюю и верхнюю границы, и генерирует случайное целое число в этом диапазоне. Эти аргументы позволяют вам контролировать параметры теста.

Вот пример скрипта генератора:

import random
import sys

if len(sys.argv) != 3:
    print("Usage: python gen.py <lower_bound> <higher_bound>")
    sys.exit(1)

lower = int(sys.argv[1])
higher = int(sys.argv[2])

print(random.randint(lower, higher))

Создайте скрипт с названием gen для генерации входных данных.

Рис. 4. Диалог создания скрипта для gen

Для генерации ответов можно использовать решение для простой задачи, написанное на Python:

n = int(input())
print(int(n / 10), n % 10)

Создайте скрипт с названием solution для генерации ответов.

Рис. 5. Диалог создания скрипта для solution

Теперь создайте тесты:

Рис. 6. Диалог для создания нового теста с использованием сгенерированных данных

Здесь используйте скрипт gen для генерации случайного числа в диапазоне от 10 до 20 и скрипт solution для вычисления ответа. Скрипт solution получит выходные данные от скрипта gen, что позволит ему сгенерировать правильный ответ.

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

Рис. 7. Предварительный просмотр сгенерированных данных

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