Difference between revisions of "Подготовка задачи tests"

From EjudgeWiki
Line 97: Line 97:
  
 
Часть этих параметров можно перенести в раздел абстрактной задачи.
 
Часть этих параметров можно перенести в раздел абстрактной задачи.
 +
 +
=== Написание проверяющей программы для тестов ===
 +
 +
Следующий шаг — написание программы для проверки корректности тестов. Эта программа получает два аргумента
 +
командной строки: имя файла с тестовыми данными и имя файла с правильным результатом работы. Программа проверки корректности тестов может, в принципе, модифицировать и первый, и второй файл. Для последующего тестирования будут передаваться уже модифицированные файлы.
 +
 +
Рассмотрим программу для проверки корректности тестов для задачи сложения двух целых чисел. На стандартном потоке ввода задаются два целых числа в диапазоне [-32768;32767]. На стандартный поток вывода необходимо напечатать сумму этих чисел.
 +
 +
Программу проверки корректности тестов можно писать на любом языке (в том числе и скриптовом). В нашем случае эта программа будет написана на языке Си с использованием библиотеки [[libchecker]].
 +
 +
#include "[[libchecker:checkutils.h|checkutils.h]]"
 +
 +
#include <limits.h>
 +
 +
int
 +
main(int argc, char **argv)
 +
{
 +
  int x, y, z;
 +
 +
  if (argc != 3) fatal_CF("wrong number of arguments");
 +
 +
  [[libchecker:checker_in_open|checker_in_open]](argv[1]);
 +
  [[libchecker:checker_read_int_ex|checker_read_int_ex]](f_arr[0], fatal_PE, "x", 1, &x);
 +
  [[libchecker:checker_read_int_ex|checker_read_int_ex]](f_arr[0], fatal_PE, "y", 1, &y);
 +
  [[libchecker:checker_eof|checker_eof]](f_arr[0], fatal_PE, "test input");
 +
  [[libchecker:checker_in_close|checker_in_close]]();
 +
  if (x < SHRT_MIN || x > SHRT_MAX)
 +
    fatal_PE("first value is out of range");
 +
  if (y < SHRT_MIN || y > SHRT_MAX)
 +
    fatal_PE("second value is out of range");
 +
 +
  checker_out_open(argv[2]);
 +
  checker_read_int_ex(f_arr[1], fatal_PE, "z", 1, &z);
 +
  checker_eof(f_arr[1], fatal_PE, "test answer");
 +
  checker_out_close();
 +
 +
  if (z != x + y)
 +
    fatal_WA("wrong answer");
 +
 +
  return 0;
 +
}

Revision as of 11:40, 30 June 2010

Навигация: Главная страница/Система ejudge/Использование/Виды задач/Задача на написание тестов/Подготовка задачи

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

Настройка основных параметров задачи

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

# Идентификационные параметры задачи
id = ...
short_name = ...
long_name = ...
# Основные параметры задачи
test_sfx = ".dat"            # Суффикс имен файлов с тестовыми данными
use_corr                     # Проверка использует файлы с правильными ответами
corr_dir = "%Ps"             # Каталог с файлами с правильными ответами - значение не важно
corr_sfx = ".ans"            # Суффикс имен файлов с правильным ответом
use_stdin                    # Программа считывает результат со стандартного потока ввода
use_stdout                   # Программа выводит результат на стандартный поток вывода
standard_checker = "cmp_int" # Проверка - сравнение двух целых чисел
time_limit = 1               # Ограничение времени ЦП - 1 секунда
real_time_limit = 5          # Ограничение реального времени - 5 секунд
max_stack_size = 8M          # Ограничение размера стека - 8 мегабайт
max_vm_size = 64M            # Ограничение общего размера вирт. памяти - 64 мегабайта

Идентификационные параметры задачи — это идентификатор задачи id, короткое название short_name, полное название long_name и, возможно, внутреннее название задачи internal_name.

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

Настройка дополнительных параметров для задач на разработку тестов

Для задачи на написание тестов должны быть установлены следующие параметры задачи.

type = "tests"
binary
enable_language = "application/x-gzip"

Параметр type задает тип задачи как задачу на разработку тестов. Параметр binary разрешает прием двоичных файлов в качестве решений. Параметр enable_language разрешает прием файлов формата GZIP в качестве решений.

Настройка проверки правильности сдаваемого архива

Архив, сдаваемый участником на проверку, должен быть проверен на корректность. Необходимо проверить, что файлы в архиве по отдельности и все в целом удовлетворяют ограничениям на размер и количество файлов, что имена всех файлов заданы корректно, что в архиве отсутствуют лишние файлы. Эта проверка должна быть выполнена без разархивирования архива в файловую систему во избежание потенциальных дыр в безопасности. Такая проверка выполняется программой style_archive, поставляемой в составе ejudge.

Чтобы включить проверку сдаваемых архивов необходимо добавить в раздел описания задачи определение конфигурационной переменной style_checker.

style_checker_cmd = "@prefix@/libexec/ejudge/checkers/style_archive"

Здесь @prefix@ будет автоматически заменен на каталог, в который проинсталлирована система ejudge. Параметры проверки архива на целостность программе style_archive можно передавать либо с помощью командной строки, либо с помощью переменных окружения. В разделе конфигурации задачи можно воспользоваться механизмом передачи параметров с помощью переменных окружения.

Чтобы установить максимальный размер файла в архиве равным 1 килобайт необходимо задать переменную окружения EJ_MAX_FILE_SIZE.

style_checker_env = "EJ_MAX_FILE_SIZE=1K"

Чтобы установить максимальное количество тестов (то есть пар файлов c входными данными и с правильным ответом) равным 10 необходимо задать переменую окружения EJ_MAX_TEST_COUNT.

style_checker_env = "EJ_MAX_TEST_COUNT=10"

Параметр style_checker_env может повторяться в разделе описания задачи несколько раз. Для полного описания поддерживаемых программой style_archive переменных окружения смотрите ее описание.

Настройка проверки тестов

Файлы с тестовыми данными, сданные на проверку, должны быть предварительно проверены на корректность проверяющей программой для тестов. Провеяющая программа для тестов должна проверить входной и выходной форматы файлов, ограничения на входные данные. Кроме того, программа может проверить соответствие входных данных и ответа.

Имя проверяющей программы для тестов задается с помощью конфигурационной переменной test_checker_cmd. При необходимости дополнительные переменные окружения могут задаваться с помощью конфигурационной переменной test_checker_env.

test_checker_cmd = "testcheck"

В этом примере имя проверяющей программы — testcheck.

Итоговая конфигурация задачи

С учетом всего вышесказанного, раздел конфигурации задачи может выглядеть следующим образом.

id = ...
short_name = ...
long_name = ...
type = "tests"
test_sfx = ".dat"
use_corr
corr_dir = "%Ps"
corr_sfx = ".ans"
use_stdin
use_stdout
standard_checker = "cmp_int"
time_limit = 1
real_time_limit = 5
max_stack_size = 8M
max_vm_size = 64M
binary
enable_language = "application/x-gzip"
style_checker_cmd = "@prefix@/libexec/ejudge/checkers/style_archive"
style_checker_env = "EJ_MAX_FILE_SIZE=1K"
style_checker_env = "EJ_MAX_TEST_COUNT=10"
test_checker_cmd = "testcheck"

Часть этих параметров можно перенести в раздел абстрактной задачи.

Написание проверяющей программы для тестов

Следующий шаг — написание программы для проверки корректности тестов. Эта программа получает два аргумента командной строки: имя файла с тестовыми данными и имя файла с правильным результатом работы. Программа проверки корректности тестов может, в принципе, модифицировать и первый, и второй файл. Для последующего тестирования будут передаваться уже модифицированные файлы.

Рассмотрим программу для проверки корректности тестов для задачи сложения двух целых чисел. На стандартном потоке ввода задаются два целых числа в диапазоне [-32768;32767]. На стандартный поток вывода необходимо напечатать сумму этих чисел.

Программу проверки корректности тестов можно писать на любом языке (в том числе и скриптовом). В нашем случае эта программа будет написана на языке Си с использованием библиотеки libchecker.

#include "checkutils.h"

#include <limits.h>

int
main(int argc, char **argv)
{
  int x, y, z;

  if (argc != 3) fatal_CF("wrong number of arguments");

  checker_in_open(argv[1]);
  checker_read_int_ex(f_arr[0], fatal_PE, "x", 1, &x);
  checker_read_int_ex(f_arr[0], fatal_PE, "y", 1, &y);
  checker_eof(f_arr[0], fatal_PE, "test input");
  checker_in_close();
 if (x < SHRT_MIN || x > SHRT_MAX)
   fatal_PE("first value is out of range");
 if (y < SHRT_MIN || y > SHRT_MAX)
   fatal_PE("second value is out of range");

  checker_out_open(argv[2]);
  checker_read_int_ex(f_arr[1], fatal_PE, "z", 1, &z);
  checker_eof(f_arr[1], fatal_PE, "test answer");
  checker_out_close();

  if (z != x + y)
    fatal_WA("wrong answer");

  return 0;
}