Skip to content

System for running the source code and its testing with some addditional futures

Notifications You must be signed in to change notification settings

aantr/test-system

Repository files navigation

Тестирующая система

Система для автоматической проверки решений на составленных тестах. Идея взята с Yandex LMS, Codeforces, acmp.ru Поддерживаются все популярные ЯП: Python, Java, C, C#, C++.

Настройка

Для начала работы необходимо внести изменения в файле config/test_program.json. Для каждого ЯП укажите местоположение на диске компилятора (обратите внимание, что для Java нужно 2 пути). Если компилятор отсутствует, то можете оставить поле пустым, но тогда при выборе данного ЯП будет выдаваться вердикт "Server error". Если в приложении нужна регистрация учеников, поменяйте поля mail_login и mail_password на логин и пароль от почты (тестировался гугл аккаунт) для сервисной отправки регистрационного письма. Поле run_as_user_linux меняйте только в том случае, если вы запускаете приложение в ОС Linux (см. Настройка для линукс). Для запуска приложения запускаем файл main.py.

Некоторые крутые фичи, реализованные с помощью JavaScript

  • динамическое обновление статуса проверки задач (чтобы дождаться проверки задачи не нужно перезагружать страницу)
  • всплывающие окна на подтверждение действия при удалении или других необратимых действиях
  • графики для отображения статистики пользователя с помощью библиотеки Chart.js
  • таймер на окончание сессии

Учетные записи

Приложение предусматривает несколько уровней учетных записей:

  • ученик
  • учитель (дополнительно имеет права на составление, редактирование своих задач, редактирование групп и сессий)
  • администратор (дополнительно имеет права на редактирование категорий задач)

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

  1. admin:admin
  2. teacher:teacher
  3. student0:student0, student1:student1, ... , student29:student29

Задача

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

В program_testing/test_problem_submit содержаться примеры необходимых файлов (архив с тестами, картинки, условие, решения на разных языках) для добавления в систему задачи и тестирования работы.

Алгоритм проверки решения

Алгоритм описан в классе TestProgram в файле program_testing/test_program.py. Все посланные решения попадают в очередь проверки. Для ускорения проверки запустим сразу несколько потоков проверяющих функций. Рассмотрим отдельно один проверяющий поток. Поток берет из очереди самое позднее по времени отправки решение и запускает последовательно на тестах. Если программа завершилась с ошибкой или выдала неверный результат, завершаем тестирование. Для динамического обновления статуса без обновления страницы проверки задачи на каждом этапе проверки записываем в базу данных текущее состояние проверки.

Формат тестов

Тесты для автоматической проверки необходимо загружать в виде архива с расширением .zip:

  • последовательность запуска тестов соответствует алфавитному расположению имен файлов.
  • на каждый тест по 2 файла с расширениями .in и .out c одинаковым именем до расширения.

Пример архива: File "tests.zip":
01.in
01.out
02.in
02.out
03.in
03.out

Архив задач

Все добавленные задачи попадают на вкладку "Archive" в приложении. Любой авторизованный пользователь может решать задачи в архиве.

Сессии

Сессия объединяет несколько пользователей для проведения мероприятия по решению задач (контрольная работа, самостоятельная работа, олимпиада и так далее) Параметры настраиваются учителем. У каждой сессии может быть назначен уникальный идентификатор для приглашения на вступление, по которому любой пользователь сможет отправить приглашение на вступление в сессию создателю сессии. Только с разрешения создателя сессии выполняется набор участников. Уникальный идентификатор для приглашения создан для упрощения добавления большого количества пользователей.

Сессия имеет собственный статус проверки решений. Если задача, добавленная составителем сессии уже было решена участником сессии, то в сессии задача пометится как нерешенная. Каждый раз, когда задача добавляется в сессию, она помечается как нерешенная в самой сессии, в то время как в архиве задач она будет уже решена. Только после решения задачи из сессии она помечается как решенная.

Группы

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

Рабочее место

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

Таблица результатов

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

Приглашения

На вкладке "Action" в приложении можно отправить запрос на приглашение в определенную группу или сессию, введя идентификатор, сообщенный организатором.

Настройка безопасности для линукс

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

Если вы просто тестируете работу функций приложения, пропустите этот пункт. В Windows придется также пропустить этот этап настройки, хотя для пригодного использования (для релиза) он необходим. В исходном коде решения может содержаться различный небезопасный код. Для предотвращения выполнения ненужных команд в командной оболочке и чтения, записи данных в файлы выполним следующие шаги:

  • создаем нового пользователя и узнаем его uid c помощью команды "cat /etc/passwd"
  • в файл конфигураций в поле run_as_user_linux пишем этот uid.
  • запускаем файл main.py c необязательным аргументом --init_user для ограничения прав созданного пользователя.
  • устанавливаем компонент, с помощью которого будет производится запуск исходного кода также для безопасности и ограничения прав с помощью команды "apt-get install firejail"

Теперь все решения, посланные на проверку будут запускаться от имени пользователя с ограниченными правами.

Видео

Туториал

На видео показаны только некоторые аспекты работы с приложением.

About

System for running the source code and its testing with some addditional futures

Topics

Resources

Stars

Watchers

Forks

Contributors 3

  •  
  •  
  •