Я уже несколько лет готовлю задачи для республиканской и районных олипиад по информатике у себя в стране. Конечно, сложно придумать красивую и оригинальную задачу. Но этот процесс творчесский и приятный. Другое дело — писать тесты для задачи. Это работа нудная и тяжелая. Впрочем, в некоторых случаях, когда проверяются краевые условия, есть немного творчества. Однако, в ряде случаев тесты необходимо просто сгенерировать в соответствии с некоторыми условиями. Вашему вниманию представляется генератор тестов, то есть входных данных, для конкурсных задач по программированию.
Исходники приложения доступны по адресу: https://github.com/mcroitor/testgenerator
Для использования генератора необходимо его скачать и собрать (позже, когда ветер будет попутным, выложу и бинарники).
Требования / зависимости утилиты:
-
CMake
-
C++17
-
библиотека yaml-cpp
Сборка стандартная для консольных утилит. Необходимо скачать (или склонировать) проект и в консоли выполнить следующие команды:
mkdir build cd build cmake ../src cmake --build .
После этого, в папке build будет исполняемый файл testgenerator.
Для использования приложения необходимо передать ему в качестве параметра файл описания формата тестов в формате yaml, например:
./testgenerator test-spec.yml
Чтобы ознакомиться со спецификацией тестов можно выполнить команду
./testgenerator --sample
в результате чего будет сгенерирован файл sample_test_description.yaml следующего содержания:
filename: input%.txt from: 1 to: 10 description: Test description blocks: - nr_of_lines: 1 line: - type: integer min: 1 max: 10 name: N - type: integer min: 1 max: 10 name: M - nr_of_lines: N line: - type: array size: M element: type: string min_length: 8 max_length: 8 characters: abc
Данная спецификация определяет генерацию 10 тестов с именем input%.txt соответствующих описанию:
-
в первой строке содержатся два целых числа N и M, 1 <= N, M, <= 10 (первый логический блок теста)
-
следующие N строк содержат по M строк из 8 символов, состоящих из символов abc (второй логический блок).
Более подробную спецификацию смотрите в README файле проекта.
Что можно (важно)
-
задавать именованные значения (переменные) для их использования в описании теста.
-
использовать базовые типы: целые числа, действительные числа, строки
-
задавать массивы базовых типов
-
определять минимальное и максимальное значение числовых типов
-
определять количество символов в строке
-
определять используемые в строке символы
-
определять несколько спецификаций тестов в одном документе yaml.
Ну, еще один пример описания тестов для задачи 2106А с CodeForces
Скрытый текст
filename: input%.txt from: 1 to: 3 description: Small blocks: - nr_of_lines: 1 line: - type: integer min: 1 max: 10 name: N - nr_of_lines: 2 line: - type: integer min: 1 max: 10 name: M - type: string min_length: M max_length: M characters: '01' --- filename: input%.txt from: 4 to: 6 description: Medium blocks: - nr_of_lines: 1 line: - type: integer min: 10 max: 100 name: N - nr_of_lines: 2 line: - type: integer min: 1 max: 10 name: M - type: string min_length: M max_length: M characters: '01' --- filename: input%.txt from: 7 to: 10 description: Large blocks: - nr_of_lines: 1 line: - type: integer min: 900 max: 1000 name: N - nr_of_lines: 2 line: - type: integer min: 1 max: 10 name: M - type: string min_length: M max_length: M characters: '01'
Понимаю специфику приложения, и узкое применение, однако, надеюсь, оно будет полезно не только мне.
ссылка на оригинал статьи https://habr.com/ru/articles/909420/
Добавить комментарий