Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
"ЮЖНО-УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ"
Механико-математический факультет
Кафедра системного программирования
КУРСОВАЯ РАБОТА
Система автоматизированной проверки задач
по программированию в среде UniCST
Научный руководитель кандидат физ.-мат. наук, доцент _ М.Л. Цымблер Автор работы, студент группы MM-396 _ К.С. Пан Челябинск-2008 Оглавление Введение
1. Компонентный тип «Задача по программированию»
2. Анализ требований и разработка спецификаций
2.1. Основные термины
2.2. Интерфейс пользователя системы
2.3. Формат входных данных
2.4. Формат выходных данных
3. Проектирование
3.1. Классы
3.2. Алгоритмы
4. Реализация
4.1. Программное окружение
4.2. Формат конфигурационных данных
4.3. Форматы входных и выходных данных
5. Тестирование
5.1. Тест 1: Успешная компиляция
5.2. Тест 2: Ошибка компиляции
Заключение
Литература
Введение Система UniCST предназначена для создания электронных энциклопедий и электронных учебных курсов по различным учебным дисциплинам и проведения компьютерного тестирования. Система UniCST может быть использована для организации и проведения лекций, семинаров, зачетов, экзаменов и других учебных или контрольных мероприятий [1].
В UniCST Модуль – базовая поименованная структурная единица электронного учебного курса. Семантически модуль соответствует некоторому предметному понятию («словарной статье»). Каждый модуль состоит из заголовка и набора поименованных дидактических компонент. Семантика компоненты полностью определяется ее компонентным типом. Каждый компонентный тип определяется путем задания его интерфейса: структуры данных (набора атрибутов) и набора операций [1].
Цель данной работы состоит в создании системы автоматизированной проверки задач по программированию в среде UniCST.
В задачи работы входит следующее:
1. Разработка компонентного типа «Задача по программированию».
2. Анализ требований и разработка спецификаций для системы автоматизированной проверки задач по программированию в среде UniCST.
3. Проектирование системы автоматизированной проверки задач по программированию в среде UniCST.
4. Реализация системы автоматизированной проверки задач по программированию в среде UniCST.
5. Разработка тестов и тестирование системы автоматизированной проверки задач по программированию в среде UniCST.
Работа состоит из введения, пяти разделов, заключения и библиографии. В каждом разделе рассматривается одна из задач работы.
Объём работы составляет 21 страницу, объём библиографии 7 наименований.
1. Компонентный тип «Задача по программированию»
В этом разделе определяется компонент «Задача по программированию» путем задания его интерфейса: структуры данных (набора атрибутов) и набора операций.
Атрибуты:
name – название задачи objective – формулировка задачи maxTimePerTest – максимальное время выполнения каждого теста test1Input – входные данные первого теста test1Ouput – выходные данные первого теста...
test10Input – входные данные десятого теста test10Output – выходные данные десятого теста create – создание задачи delete – удаление задачи (освобождение памяти, занимаемой атрибутами компоненты) browse – просмотр атрибутов задачи без возможности изменения run – запуск проверки решения задачи print – получение представления, пригодного для печати edit – редактирование компоненты 2. Анализ требований и разработка спецификаций В этом разделе рассматривается первый этап цикла разработки системы. Перечислены основные термины, используемые в работе, требования к интерфейсу пользователя, формата входных и выходных данных системы.
Разрабатываемая система получила название RoST (Robot for Solution Testing).
2.1. Основные термины Далее в работе используются следующие термины:
1. Решение исходный код программы, предположительно решающей задачу по программированию.
2. Тест эталонные входные и соответствующие выходные данные для проверки решения задачи.
3. Протокол проверки результат работы системы, получаемый в ходе проверки решения и потом передаваемый в 4. Задание данные, которые передаёт UniCST в систему для 2.2. Интерфейс пользователя системы В среде UniCST пользователь выбирает задачу, т.е. компоненту типа «Задача по программированию». Пользователь решает задачу, заполняет форму отправки решения и нажимает кнопку «Отправить».
Пример формы отправки решения представлен на рисунке 1. UniCST формирует Задание, соединяется с системой RoST и отправляет ей Задание. Далее RoST обрабатывает Задание, отправляет в ответ Протокол. После этого соединение между RoST и UniCST завершается, а UniCST заносит в базу результаты проверки. Пользователь среды UniCST может посмотреть результаты проверки присланных им решений в любое время. Пример таблицы результатов приведён на рисунке 2.3. Формат входных данных Необходимо разработать формат входных данных системы.
Входные данные должны содержать описание тестов, временных ограничений, исходный код решения.
2.4. Формат выходных данных Необходимо разработать формат выходных данных системы.
Выходные данные, или протокол проверки, содержат описание результата компиляции решения задачи и результаты прохождения тестов, а также само задание.
3. Проектирование В этом разделе представлена структурно-функциональная модель системы RoST. При проектировании были использованы диаграммы UML [3]. Далее представлены диаграмма классов, описание классов и диаграммы деятельности.
3.1. Классы Диаграмма классов представлена на рисунке 3.
3.1.1. Класс «Робот»
Принимает соединения от внешних систем и создаёт Получателя для каждого нового соединения. Каждый Получатель запускается в новом потоке и принимает задание.
3.1.2. Класс «Очередь заданий»
Хранит Задания в виде очереди. Получатели, как только сформируют Задание, кладут его в Очередь, а Тестировщики, как только освободились, достают и обрабатывают.
capacity максимальное количество заданий в очереди 3.1.3. Класс «Задание»
Хранит входные данные, полученные от внешней системы.
maxTimePerTest максимальное время выполнения каждого теста 3.1.4. Класс «Тест»
Хранит тест для проверки решения.
input входные данные, которые будут подаваться на вход скомпилированному решению при запуске output эталонные выходные данные, с которыми будут сравниваться результаты выполнения скомпилированного решения 3.1.5. Класс «Решение»
Хранит решение, которое нужно проверить.
source собственно текст решения на каком-либо языке программирования lang язык программирования, на котором написан исходный код 3.1.6. Класс «Протокол»
Хранит протокол проверки.
3.1.7. Класс «Тестировщик»
Берёт задания из очереди и обрабатывает их. Если Заданий в Очереди нет, то ждёт, пока они появятся. После проверки каждого Задания создаёт и запускает Отправителя.
3.1.8. Класс «Компилятор»
Компилирует исходный код, создавая Скомпилированное решение.
3.1.9. Класс «Скомпилированное решение»
Исполняемая программа, которая проверяется путём запуска на наборе тестов.
run запускает программу на указанных входных данных и возвращает результат работы 3.1.10. Класс «Получатель»
Получает входные данные от внешней системы, анализирует их и формирует Задание. Ставит Задание в Очередь.
3.1.11. Класс «Отправитель»
Формирует Протокол проверки, отправляет его внешней системе и завершает соединение.
3.2. Алгоритмы В этом подразделе с помощью диаграмм деятельности описаны алгоритмы проверки решения и проверки скомпилированного решения на тестах.
3.2.1. Проверка решения Алгоритм проверки решения описан с помощью диаграммы деятельности, представленной на рисунке 4.
Рис. 4. Диаграмма деятельности «Проверка решения»
3.2.2. Проверка скомпилированного решения на тестах Алгоритм проверки скомпилированного решения на тестах описан с помощью диаграммы деятельности, представленной на рисунке 5.
Рис. 5. Диаграмма деятельности «Проверка скомпилированного решения на тестах»
4. Реализация В этом разделе описано программное окружение системы, разработанные форматы данных.
4.1. Программное окружение Система реализуется на платформе Java SE 6 [4], с использованием библиотеки JDOM [5] для работы с XML. В качестве средства автоматизации сборки системы использован инструмент Apache Ant, который сам написан на Java, что обеспечивает большую мобильность разрабатываемой системы [6].
Используемые стандартные классы и интерфейсы:
java.lang.Runnable реализуется всеми классами, содержащими метод run(), то есть классами Робот, Тестировщик, Получатель, Отправитель, Скомпилированное решение.
java.lang.Thread используется для запуска метода run() у вышеперечисленных классов.
java.net.ServerSocket, java.net.Socket используются Роботом, Получателем, Отправителем для взаимодействия со внешней системой (UniCST).
java.util.concurrent.LinkedBlockingQueue является готовой реализацией класса Очередь заданий.
java.lang.Runtime используется для взаимодействия со средой выполнения (для запуска компиляторов).
java.util.Date используется для измерения времени.
4.2. Формат конфигурационных данных Система получает конфигурационные данные в виде параметров при запуске. Таких параметров всего три:
1. Порт (для TCP-соединений [7]) 2. Количество запускаемых одновременно тестировщиков (см.
п. 3.1.7) 3. Путь к каталогу для хранения временных файлов 4.3. Форматы входных и выходных данных Для представления входных и выходных данных был разработан язык на основе XML и описан с помощью DTD (Document Type Definition). DTD это язык, с помощью которого можно описать структуру XML-документа [2]. Кроме того, при передаче данных от UniCST к RoST нужно как-то обозначить, где они заканчиваются.
Поэтому в первой строке входных данных от UniCST передаётся количество строк в Задании.
Далее представлено описание входных и выходных данных и примеры.
4.3.1. DTD входных данных (далее task.dtd) 4.3.2. DTD выходных данных 4.3.3. Пример входных данных 4.3.4. Пример протокола проверки 5. Тестирование На этапе тестирования были разработаны тесты и программа, эмулирующая работу UniCST, с помощью которой RoST проверялась на разработанных тестах.
Тестирование включает два теста. Первый для случая успешной компиляции, второй для случая ошибки компиляции. Решаемая задача в тестах одинакова сложить два целых числа.
5.1. Тест 1: Успешная компиляция Этот тест позволяет проверить работу системы при успешном выполнении компиляции. Должны получиться все возможные результаты запуска скомпилированного решения. Их всего три: "правильные выходные данные", "неправильные выходные данные" и "превышение максимального времени выполнения на одном Тесте".
Далее представлены эталонные Задание и Протокол для такой проверки.
5.1.1. Задание #include <iostream>
std::cout << a + b << std::endl;
5.1.2. Протокол #include <iostream>
std::cin >> a >> b;
std::cout << a + b << std::endl;
5.2. Тест 2: Ошибка компиляции Этот тест позволяет проверить работу системы при ошибке компиляции. Далее представлены эталонные Задание и Протокол для такой проверки. В исходном коде решения допущена синтаксическая ошибка в директиве #include.
5.2.1. Задание #includ <iostream>
std::cin >> a >> b;
std::cout << a + b << std::endl;
5.2.2. Протокол #includ <iostream>
std::cin >> a >> b;
std::cout << a + b << std::endl;
prog.cpp:1:2: error: invalid preprocessing directive #includ prog.cpp:11:2: warning: no newline at end of file prog.cpp: In function ‘int main()’:
prog.cpp:5: ошибка: ‘cin’ не является элементом ‘std’ prog.cpp:6: ошибка: ‘cout’ не является элементом ‘std’ prog.cpp:6: ошибка: ‘endl’ не является элементом ‘std’ prog.cpp:8: ошибка: нет декларации ‘sleep’ в этой области видимости Заключение В ходе работы получены следующие основные результаты:
1. Разработан компонентный тип «Задача по программированию», который обеспечивает интеграцию системы RoST в среду UniCST.
2. Проведены анализ требований и разработка спецификаций для RoST.
3. Произведено проектирование системы RoST.
4. Произведена реализация системы RoST.
5. Разработаны тесты и проведено тестирование системы RoST.
6. Система RoST внедрена в опытную эксплуатацию.
Литература 1. Соколинский Л. Б., Жигальская Н. С., Евдокимова А. С. Модель электронного учебного курса и энциклопедии. Технический отчет UniCST-07-01. -Челябинск: ЮУрГУ, 2. W3C, Extensible Markup Language (XML) 1.0 (Fourth Edition) [http:// www.w3.org/TR/2006/REC-xml-20060816/#dt-doctype], 16.08. 3. Буч Г., Рамбо Дж., Якобсон И. Язык UML. Руководство пользователя // М.: ДМК Пресс. -2007. -С. 496.
[http://java.sun.com/javase/reference/api.jsp] [http://www.jdom.org/docs/apidocs/index.html] 6. Stephane Bailliez, Nicola Ken Barozzi. Apache Ant Manual [http://ant.apache.org/manual/index.html] 7. Information Sciences Institute. Transmission Control Protocol [http://tools.ietf.org/html/rfc793]. University of Southern California, 1981.