sprint/templates/docs.html
Egor Matveev 9c0123cbf2 initial
2021-07-11 10:28:12 +03:00

235 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% extends 'base.html' %}
{% load static %}
{% block title %}Методичка{% endblock %}
{% block styles %}
.screenshot {
width: 100%;
}
.screenshot_div {
margin-top: 20px;
width: 80%;
margin-bottom: 20px;
}
.code {
padding: 15px;
margin-top: 15px;
margin-bottom: 15px;
}
{% endblock %}
{% block content %}
<h1>Методичка</h1>
<hr>
<h2><b>О системе</b></h2>
<h3>Структура сервиса</h3>
В сервисе существует два режима работы:
<ul>
<li>Режим студента</li>
<li>Режим администратора</li>
</ul>
И одна компанента:
<ul>
<li>Darwin</li>
</ul>
<hr>
<h3>Режим студента</h3>
Режим студента показывает курсы, на которые подписан пользователь, а также блоки, содержащиеся в них.<br>
Напротив каждого блока стоит (или отсутствует) оценка за данный блок.
<div class="border border-dark screenshot_div">
<img src="{% static 'img/main_page.png' %}" class="screenshot" />
</div>
При нажатии на блок пользователь попадает в настройки выбранного блока.<br>
На странице отображаются таски и (опционально) оценки за них.<br>
Под списком тасков отображается информация о возможности отправки решений в блок, а также временной интервал активности блока.
<div class="border border-dark screenshot_div">
<img src="{% static 'img/block_page.png' %}" class="screenshot" />
</div>
Страница таска представляет из себя подробное описание задания, предлагаемого к решению.<br>
Описание таска содержит в себе следующие атрибуты:
<ul>
<li>Легена</li>
<li>Формат входных данных</li>
<li>Формат выходных данных</li>
<li>Спецификации</li>
</ul>
Далее находится форма для отправки решения (.zip архив) и список отправленных решений.<br>
Решение содержит в себе следующие атрибуты:
<ul>
<li>id</li>
<li>Дата и время отправки</li>
<li>Результат тестирования</li>
<li>Оценка, выставленная преподавателем или ассистентом</li>
<li>Комментарий к решению</li>
</ul>
Sprint поддерживает следующие варианты результатов тестирования:
<ul>
<li>M/N - решение прошло M тестов из N</li>
<li>Time limit - превышен предел времени, отведенного на тестирование</li>
<li>Compilation error - не удалось скомпилировать решение</li>
<li>TEST ERROR - ошибка тестирования (может быть связана с некорректыми тестами)</li>
<li>TESTING - решение находится в процессе тестирования</li>
<li>IN QUEUE - решение находится в очереди на тестирование</li>
</ul>
<div class="border border-dark screenshot_div">
<img src="{% static 'img/task_page.png' %}" class="screenshot" />
</div>
При нажатии на результат тестирование можно получить информацию о том, какие именно тесты были пройдены, а какие - нет.
<div class="border border-dark screenshot_div">
<img src="{% static 'img/test_datails.png' %}" class="screenshot" />
</div>
При нажатии на id решения пользователь попадает на страницу решения.<br>
Страница с решением содержит ту же информацию, что и на странице таска.<br>
Помимо этого, на данной странице можно выставить оценку за решение и оставить комментарий. Для сохранения результата необходимо нажать на кнопку "Зачесть".<br>
Для выставления оценки 0 или максимальной оценки за таск, необходимо нажать на кнопку "Незачесть" или "Выставить максимальный балл" соответственно.<br>
Комментарий будет сохранен при нажатии на любую из кнопок.<br>
Внизу страницы отображаются файлы решения, содержащие только символы Unicode, иначе говоря, файлы с кодом.
<div class="border border-dark screenshot_div">
<img src="{% static 'img/solution_page.png' %}" class="screenshot" />
</div>
<hr>
<h3>Режим администратора</h3>
<i>Некоторые функции доступны только преподавателям</i><br>
Главная страница режима администратора показывает доступные для администрирования курсы, блоки в них и ссылку на данную методичку.<br>
Добавление нового блока в курс происходит по нажатии кнопки "Новый блок".
<div class="border border-dark screenshot_div">
<img src="{% static 'img/admin_page.png' %}" class="screenshot" />
</div>
При нажатии на кнопку "Участники курса" открывается страница с настройками участников курса.<br>
Для подписки существующих студентов или преподавателей на курс, необходимо ввести в форму "Добавить участников" ФИО студента или email, на который зарегестрирован аккаунт.<br>
Для подписки всех студентов определенной группы, нужно ввести название группы.<br>
Для отписки студента от курса, нужно нажать на кнопку "отписка" рядом с нужным студентом.<br>
Для того, чтобы сделать подписчика курса ассистентом или снятия с него таких прав, необходимо выбрать почту этого студента в форме "Назначить или разжаловать" и нажать на кнопку применить. Статус студента будет отображен в таблице ниже.
<div class="border border-dark screenshot_div">
<img src="{% static 'img/users_settings_page.png' %}" class="screenshot" />
</div>
В Sprint отсутствует регистрация в обычном понимании данного термина, поэтому регистрация студентов происходит при первом добавлении его к некоторому курсу.<br>
Прежде всего необходимо создать JSON файл по определенным правилам, описанным на странице участников курса.
<div class="border border-dark screenshot_div">
<img src="{% static 'img/upload_rules.png' %}" class="screenshot" />
</div>
При нажатии на блок, отображается страница с настройками блока.<br>
Страница настроек блока содержит следующие аттрибуты:
<ul>
<li>Набор тасков</li>
<li>Интервал времени, в течение которого можно отправлять решения</li>
<li>Решения, отправленные в данный блок</li>
</ul>
Ограничения по времени были внедрены для того, чтобы отложить запуск блока. Блок будет доступен студентам только если данный момент времени входит в интервал между временем начала и временем конца (границы включаются), и блок открыт для отправки решений.<br>
После установки нужных значений необходимо нажать на кнопку "Сохранить".<br>
Для создания нового таска после списка тасков есть кнопка "Новый таск".
<div class="border border-dark screenshot_div">
<img src="{% static 'img/admin_block_page.png' %}" class="screenshot" />
</div>
При нажатии на таск из списка, откроется страница с настройками таска.<br>
Поля "Легенда", "Входные данные", "Выходные данные" и "Спецификации" заполняются с помощью html разметки, которая потом будет отображена в режиме студента.<br>
<div class="border border-dark screenshot_div">
<img src="{% static 'img/task_settings_page_1.png' %}" class="screenshot" />
</div>
В настройках таска содержатся еще несколько аттрибутов:
<ul>
<li>Ограничения по времени - количество миллисекунд, которое отводится на тестирование решения (целое число)</li>
<li>Вес задачи - доля значимости таска в блоке (вещественное число, может быть больше единицы, а суммарно таски могут иметь вес отличный от единицы)</li>
<li>Максимальная оценка - максмальная оценка, которую можно выставить за таск (целое число)</li>
<li>Максимум решений - максимальное количество решений, которое можно отправить к таску (целое число, ограничение не действует на ассистентов и преподавателей)</li>
</ul>
В форму загрузки тестов загружается .cs файл с Unit тестами библиотеки Nunit. По нажатии на кнопку "Посмотреть" можно посмотреть тесты и отредактировать их. Для сохранения файла необходимо нажать на кнопку "Сохранить" внизу страницы.<br>
В форму "Дополнительные файлы" можно загрузить файлы, которые будут скорированы в директорию с исполняемыми файлами при тестировании.
<div class="border border-dark screenshot_div">
<img src="{% static 'img/task_settings_page_2.png' %}" class="screenshot" />
</div>
При нажатии на кнопку "Посмотреть решения" на странице настроек блока открывается страница решений, загруженных в текущий блок.<br>
Функциональность таблицы решений внизу страницы схожа с подобной в режиме студента.<br>
Фильтр на данной странице содержит следующие поля:
<ul>
<li>id - id решения</li>
<li>Таск - имя таска</li>
<li>Пользователь - почта студента</li>
<li>Группа - решения от студентов из данной группы</li>
<li>Последнее решение - последнее отправленное решение от каждого студента к каждому таску</li>
<li>Лучший результат - решения с наибольшим количеством пройденных тестов от каждого студента к каждому таску</li>
<li>Только студенты - исключить из фильтра решения от ассистентов и преподавателей</li>
</ul>
При нажатии на кнопку "Перетест" отфильтрованные решения будут перетестированы.
<div class="border border-dark screenshot_div">
<img src="{% static 'img/solutions_page.png' %}" class="screenshot" />
</div>
<hr>
<h3>Darwin</h3>
Одним из ограниений Unit тестирования является невозможность тестирования приватных методов и приватных классов.<br>
Для решения данной проблемы в Sprint содержится компонента Darwin. Загрузить библиотеку можно по данной <a href="{% static '/files/Darwin.dll' %}" download>ссылке</a>.<br>
Darwin позволяет создавать объекты приватных классов, задавать значения приватным полям и свойствам, а также вызывать приватные методы.<br>
Основой библиотеки является класс <b>DObject</b>.<br>
В конструктор передается имя того класса, объект которого необходимо создать, с указанием пространства имен.
<div class="border border-dark code">
<pre>
using Darwin;
using Nunit.Framework;
[TestFixture]
public class Tests
{
[Test]
public void Test1()
{
DObject d = new DObject("Calculator.Calc");
}
}
</pre>
</div>
Для доступа к полям и свойствам класса нужно использовать индексатор.<br>
<div class="border border-dark code">
<pre>
using Darwin;
using Nunit.Framework;
[TestFixture]
public class Tests
{
[Test]
public void Test1()
{
DObject d = new DObject("Calculator.Calc");
d["a"] = 5;
Assert.AreEqual(d["a"], 5);
}
}
</pre>
</div>
Для вызова методов класса используется метод InvokeMethod.<br>
В качетсве параметров передается имя метода и массив параметров.<br>
Тип возвращаемого значения метода InvokeMethod - object, поэтому необходимо проводить каст к нужному типу после вызова.
<div class="border border-dark code">
<pre>
using Darwin;
using Nunit.Framework;
[TestFixture]
public class Tests
{
[Test]
public void Test1()
{
DObject d = new DObject("Calculator.Calc");
d["a"] = 5;
Assert.AreEqual(d["a"], 5);
int val = (int)d.InvokeMethod("GetNumber", new object[] { d["a"] });
Assert.AreEqual(val, d["a"]);
}
}
</pre>
</div>
<hr>
<h2><b>Use cases</b></h2>
<h3>Как собрать таск</h3>
<hr>
<h3>Как написать Unit тест правильно</h3>
<hr>
<h3>Как написать тест на входные и выходные данные</h3>
<hr>
<h3>Что необходимо указать в спецификациях</h3>
<hr>
<h3>Полезные html тэги</h3>
{% endblock %}