235 lines
16 KiB
HTML
235 lines
16 KiB
HTML
{% 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 %} |