Генератор тестов для конкурсов

от автора

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


Исходники приложения доступны по адресу: 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *