Как стать автором
Обновить

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

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров272

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


Исходники приложения можно скачать с GITHUB.

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

Требования / зависимости утилиты:

  • 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'

Понимаю специфику приложения и его узкое применение, однако, надеюсь, оно будет полезно не только мне.

Теги:
Хабы:
+3
Комментарии0

Публикации

Ближайшие события