Позволяет проводить тестирование в терминале. Тесты хранятся в виде markdown файлов, что позволяет быстро и удобно управлять тестами. Для повышения эффективности управления и безопасности система была разделена на серверную часть, хранящую тесты и правильные ответы и клиентскую, имеющую доступ только к сгенерированным вариантам.
Для сборки проекта необходим компилятор rustc и менеджер пакетов cargo. Чаще всего устанавливаются одним пакетом rust или аналогичным.
Необходимо клонировать репозиторий и собрать проект:
makeВ результате сборки в корне проекта появятся файлы
learned-cat и learned-cat-daemon,
которые представляют клиента и сервер соответственно.
Для установки проекта можно выполнить команду:
sudo make installКоторая:
- соберет серверное и клиентские приложения,
- поместит клиента в /usr/bin,
- создаст файлы сервера в /opt/learned-cat, содержащие примеры конфигурации,
- добавит пользователя learnedcat владеющего директорией /opt/learned-cat,
- добавит сервис systemd для запуска сервера.
По умолчанию директория сервера /opt/learned-cat/, для настройки необходимо указать путь в переменной окружения LEARNED_CAT_PATH.
Общие настройки сервера и тестов находятся в файле settings.toml. Пример настройки, включающей все параметры, создается при инициализации сервера ключем -i и представлен в каталоге example-config.
В случае, если был изменен парамер server_address на клиенте необходимо задать адрес сервера с помощью переменной окружения, например:
export SERVER_ADDRESS=127.0.0.1:65432Markdown файлы тестов лежат в каталоге tests. Тест представляет собой документ, состоящий из заголовков, текста и списков.
В начале файла должен располагаться текст - описание теста (баннер), может состоять из любого количества строк.
Текст вопроса начинается с заголовка (#), далее следует произвольное количество обычных строк. Варианты ответов представляют собой маркерный список.
Неправильные ответы начинаются с символа -, а правильные с +. Ответы также могут занимать несколько строк.
Правильных ответов может быть несколько, в этом случае за каждый правильный ответ начисляется одинаковое количество баллов, а за неправильный полагается штраф:
- За правильный ответ начисляется
1 / n_trueбаллов, гдеn_true- количество правильных ответов. Неправильный ответ нивелирует один правильный. При этом общий балл за вопрос не может быть меньше нуля или больше единицы.
Пример теста приведен ниже:
Описание теста. Тут указывается информация, необходимая для прохождения теста.
Например:
Чтобы получить максимальный балл, отвечайте правильно на все вопросы. Удачи!
# Пример вопроса с одним правильным ответом.
- Неправильный ответ.
+ Правильный ответ
- Ещё один неправильный ответ
# Пример вопроса с несколькими правильными ответами
- Неправильный ответ, -0,5 балла.
+ Правильный ответ, +0,5 балла.
- Неправильный ответ, -0,5 балла.
+ Правильный ответ, +0,5 балла.Клиент отправляет короткие запросы и получает ответы от сервера. Осуществляет две основные функции:
- Получение информации о доступных тестах (при запуске без аргументов или с ключем -l).
- Запуск и прохождение теста (при запуске с именем теста в качестве параметра).
При запросе на сервер клиент указывает учетные данные пользователя, чтобы получить список тестов, доступных данному пользователю. При запуске теста сначала выводится описание теста и предложение к началу тестирования. В случае согласия пользователя загружается первый вопрос. Тест считается запущенным с момента ввода согласия на начало тестирования.
Клиент отправляет ответы на вопрос серверу, а сервер присылает следующий вопрос. Ответами на вопросы является одно или несколько чисел - номеров правильных ответов, либо слово или строка текста для ответа на открытый вопрос. Числа указываются через пробел без знаков препинания.
После ответа на последний вопрос сервер присылает результат или сообщение о завершении теста, если публикация результатов отключена в настройках. При преждевременном завершении теста можно продолжить тестирование с последнего отвеченного вопроса, для этого необходимо заново запустить тест. При досрочном прерывании тестирования время не останавливается. В случае если тест ограничен по времени, после окончания времени пользователь НЕ может ответить на последний вопрос, загруженный до окончания времени, все оставшиеся вопросы считаются неотвеченными и баллы за них не начисляются, сервер сохраняет результат тестирования.
При запуске сервера с параметром run или -r выполняются следующие действия:
- Считывание настроек из файла
/opt/learned-cat/settings.toml. - Парсинг тестов, указанных в настройках из markdown файлов и расположенных в каталоге
/opt/learned-cat/tests/(или другом, указанном в настройках). - Чтение базы данных, по умолчанию
/opt/learned-cat/marks.db. - Запуск цикла обработки запросов, в этот момент выводится сообщение о номере прослушиваемого порта.
При запуске сервера с параметром export-resuls или -o:
Осуществляется экспорт результатов тестирования из каталога /opt/learned-cat/results в виде csv таблицы в формате:
имя теста, имя пользователя, время начала теста, время завершения тестирования, результат
В рамках взаимодействия с клиентами сервер осуществляет:
- Проверку доступа пользователя. Пользователь может получить информацию только о доступных ему тестах и запускать только доступные ему тесты.
- Выдачу описания теста.
- Генерацию варианта с учетом настроек теста.
- Регистрацию времени начала и времени окончания тестирования.
- Подведение итогов, проверку тестирования.
- Завершение тестирования при окончании времени.
- Занесение оценки за тест в базу данных. Протокол обмена данных пользователя и клиента описан в исходном коде и осуществляется в бинарном формате по протоколу TCP.
Результаты тестирования хранятся в SQLite базе данных и содержат оценку и время тестирования.