Difference between revisions of "Подготовка задачи tests"
(→Написание проверяющей программы для тестов) |
(→Написание проверяющей программы для тестов) |
||
Line 115: | Line 115: | ||
{ | { | ||
int x, y, z; | int x, y, z; | ||
− | + | ||
/* проверить, что передано правильное число аргументов командной строки */ | /* проверить, что передано правильное число аргументов командной строки */ | ||
if (argc != 3) [[libchecker:fatal_CF|fatal_CF]]("wrong number of arguments"); | if (argc != 3) [[libchecker:fatal_CF|fatal_CF]]("wrong number of arguments"); | ||
Line 131: | Line 131: | ||
if (y < SHRT_MIN || y > SHRT_MAX) | if (y < SHRT_MIN || y > SHRT_MAX) | ||
[[libchecker:fatal_PE|fatal_PE]]("second value is out of range"); | [[libchecker:fatal_PE|fatal_PE]]("second value is out of range"); | ||
− | + | ||
/* открыть файл с правильным ответом и прочитать число */ | /* открыть файл с правильным ответом и прочитать число */ | ||
[[libchecker:checker_out_open|checker_out_open]](argv[2]); | [[libchecker:checker_out_open|checker_out_open]](argv[2]); | ||
Line 137: | Line 137: | ||
[[libchecker:checker_eof|checker_eof]]([[libchecker:Глобальные переменные|f_arr[1]]], [[libchecker:fatal_PE|fatal_PE]], "test answer"); | [[libchecker:checker_eof|checker_eof]]([[libchecker:Глобальные переменные|f_arr[1]]], [[libchecker:fatal_PE|fatal_PE]], "test answer"); | ||
[[libchecker:checker_out_close|checker_out_close]](); | [[libchecker:checker_out_close|checker_out_close]](); | ||
− | + | ||
/* проверить правильность ответа */ | /* проверить правильность ответа */ | ||
if (z != x + y) | if (z != x + y) |
Revision as of 12:17, 30 June 2010
Навигация: Главная страница/Система ejudge/Использование/Виды задач/Задача на написание тестов/Подготовка задачи
Задачи этого типа являются самыми сложными для подготовки. При описании подготовки таких задач будет предполагаться, что турнир настраивается в альтернативной раскладке файлов, то есть все файлы, относящиеся к задаче, размещаются в одном каталоге.
Contents
Настройка основных параметров задачи
Поскольку задача на написание тестов предполагает запуск программ на тестовых данных аналогично стандартной задаче, в разделе конфигурации задачи должны быть установлены параметры, относящиеся к тестированию задач. Например:
# Идентификационные параметры задачи 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; }