УДК 004

Разработка автоматической тестирующей платформы для учащихся средней школы

Федоров Александр Сергеевич – аспирант факультета Программной инженерии и компьютерной техники Университета ИТМО

Авксентьева Елена Юрьевна – кандидат педагогических наук, доцент факультета Программной инженерии и  компьютерной техники Университета ИТМО

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

Ключевые слова: автоматизация, автоматическая тестирующая система, онлайн обучение, разработка, проектирование.

Введение

Создание цифровых образовательных ресурсов является одним из основных направлений информатизации всех форм и уровней образования в России. Развитие индустрии информационных услуг наряду с созданием и развитием телекоммуникационных структур, систем контроля качества составляет основу формирования современной инфраструктуры информатизации образования. Внедрение ЦОР в образовательный процесс ВУЗа имеет следующие преимущества: возможность выбора индивидуальной образовательной траектории; автоматизация процессов контроля и оценки знаний; быстрый обмен информацией и др. [1]. В настоящее время различные системы автоматической проверки решений, обучающихся получили значительное распространение в как образовательном процессе, так и на различных соревнованиях, например на соревнованиях по спортивному программированию [2].

Для организации образовательного процесса и проведения соревнований среди обучающихся средней школы Санкт-Петербурга была разработана автоматическая тестирующая платформа размещённая в сети интернет. В настоящей статье рассмотрены принципы разработки. Исходный код тестирующей системы можно найти по ссылке: https://github.com/rcomrad/KusServer (devops и бэкенд), https://github.com/Pashs-ba/kus-sys (бэкенд).

Используемые при разработке технологии

При проектировании тестирующей системы были выделены следующие её части:

  • Ядро – серверный программный код, обрабатывающий запросы пользователя.
  • Сайт – часть платформы с которой взаимодействует пользователь для обмена данными с тестирующей системой.
  • База данных – энергонезависимое средство хранения объёмных данных которые необходимы системе для её функционирования.
  • Devops средства – скрипты и программы для организации рабочего пространства тестирующей платформы.
  • Для разработки системы были использованы следующие технологии:
  • React + TypeScript - для создания фронтенда, данный стек позволяет удобно создать генерируемые в соответствии с приходящим json-объектом формы и страницы.
  • С++ (cmake, crow, vcpkg) – для создания бэкенда; в данном стеке vcpkg является кроссплатформенным менеджером пакетов, cmake - кроссплатформенным средством сборки, а crow реализует протокол http.
  • Nginx – для организации перенаправления запросов и поддержки HTTPS запросов в связке с letsencrypt.
  • Postgresql – база данных, выбранная благодаря её открытости (является свободно распространяемым ПО) и быстродействии в сравнении с аналогами (MySQL).
  • Linux – в качестве операционной системы сервера благодаря его ресурсоёмкости и наличию большего функционала при работе из программного кода (Linux API). Также sh скрипты предоставляют значительную свободу действий в сравнении с bat скриптами.

Основные компоненты системы

Рассмотри ядро системы, написанное на языке С++. Для организации разработки итоговая программа была поделена на модули каждый из которых решает свою обособленную задачу. Для обозначения принадлежности класса к определённому модулю все файлы исходного кода были разбиты по папкам в соответствии со своими модулями. Данные модулю могут быть найдены в папке source бэкенд репозитория.

Из модулей достойных рассмотрения в настоящей статье стоит отметить код ответственный за обмен данными с базой данных (source/database). Во время разработки программы возникла следующая проблема: необходимо быстро заносить или считывать данные (поля) объекта по их названию. Например, для объекта пользователь могут использоваться поля логин, пароль, роль, время входа, id. Как можно заметить данные поля потенциально имеют разные типы данных что затрудняет их хранение в контейнере.

Чтобы решить данную задачу был написан модуль, генерирующий структуры по заданному описанию (source/code). Данный модуль создаёт для каждой таблицы базы данных соответствующую ей структуру на языке С++. При этом помимо обычных свойств в структуре, которые дублируют поля в таблице базы данных, также создаётся массив указателей void. При создании объекта структуры поля данного массива последовательно заполняются указателями на свойства структуры (данный код заносится в конструкторы структур модулем генерации). Сразу отметим что выделение памяти не происходит, благодаря чему отсутствует опасность утечек памяти: указатели ссылаются на уже созданные объекты, деконструирование полей структуры также производится операционной системой при вызове деконструктора структуры. Вместе с этим структура хранит словарь имён полей и массив описывающий тип данных каждого указателя (с помощью enum).

С целью тестирования программного кода участников был создан тестирующий модуль (source/tester). Модуль позволяет создавать процессы используя Linux API или Windows API. Во время эксплуатации, во-первых, было установлено, что необходимо осуществлять многопоточное тестирование при малой загруженности сайта. Это вызвано тем, что даже самые элементарные программы, проходящие тестирование, имеют значительную прибавку ко времени своего исполнения из-за постоянной необходимости зачистки тестирующего окружения: необходимо постоянно перезапускать процесс, зачищать используемые программой файлы, обеспечивать неизменность вводимых тестов. В свете последнего пункта обмен данными с созданным процессом происходит с помощью пайпов, поскольку если передавать процессы файл с тестирующими данными, то данный файл может быть изменён, а постоянное пересоздание файла займёт больше времени.

Ещё одной задачей стала необходимость быстрого создания и корректировки API тестирующей системы. С этой целью было решено создать шаблоны для get, post и delete запросов. Их идея заключается в том, что в программе создаётся словарь, ставящий в соответствие названию структуры шаблонную функцию, обрабатывающий данный запрос. Если для post и delete запросов данный шаблон очевиден, то для get запроса возникает задача обращения к данных из нескольких таблиц. Подобное требование можно реализовать с помощью рекурсивного URL: ссылка содержит в себе название таблицы и запрашиваемые у неё поля в квадратных скобках. Одно если вместо какого-либо поля необходимо вставить данные из другой таблицы, то запрашиваемые поля указываются в квадратных скобках после имени заменяемого поля. Например запрос competition_user[id,user_id[id,role_id]] вклеит в таблицу совмещающую номера пользователей и соревнований роль пользователя. Естественно при такой открытости базы данных внешним запросам необходимо жёстко пресекать любые возможности для sql-инъекций.

Также значительные трудности могут возникать при обработке ответов содержащие русские символы. Сразу отметим что перед обработкой ответа тестирующая платформа заменяет все знаки препинания и вайтспейсы на пробелы, а также заменяет несколько последовательных пробелом одним пробелом. Помимо этого, для эффективного оценивания ответа участника необходимо заменять все подобные буквы в разных языках одной и той же буквой (например, буквы A в русском и английском языках), стандартизировать взаимозаменяемые буквы языка (например, Е и Ё), а также обрезать окончания слов и пробелы по концам строки. К сожалению кодировка русских символов различается в зависимости от операционной системы, используемого контейнера языка (std::string/std::wstring) и настроек базы данных [3, 4]. Таким образом необходимо реализовать функцию для преобразования используемых данных к единому стандарту. Данным стандартом стал std::wstring, поскольку он позволяет не разделять букву на несколько ячеек (две ячейки по одному байту) [3], что упрощает преобразования описанные выше.

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

Заключение

В статье описаны основные моменты создания автоматической тестирующей платформы.  Рассмотрены проблемы возникающие при тестировании кода участников, организации потока данных с использованием базы данных, а также особенности оценивания языковых ответов.Описанная системы доступна для свободного использования и может быть скачана с репозитория на github (https://github.com/rcomrad/KusServer).

Список литературы

  1. Рихтер Т. В. Абрамова И. В. Использование цифровых образовательных ресурсов при изучении программирования в вузе // Карельский научный журнал. – 2021. – 10. № 2 (35). – С. 22-24.
  2. Козлов С.В., Быков А.А. Особенности обучения школьников олимпиадному программированию с использованием методов математического моделирования // Современные наукоемкие технологии. – 2022. – № 6. – С. 141-146.
  3. Документация языка С++ / [Электронный ресурс] URL: https://en.cppreference.com (дата обращения: 30.10.2023).
  4. Документация PostgreSQL / [Электронный ресурс] URL: https://www.postgresql.org (дата обращения: 30.10.2023).

Интересная статья? Поделись ей с другими: