{% 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 %}

Методичка


О системе

Структура сервиса

В сервисе существует два режима работы: И одна компанента:

Режим студента

Режим студента показывает курсы, на которые подписан пользователь, а также блоки, содержащиеся в них.
Напротив каждого блока стоит (или отсутствует) оценка за данный блок.
При нажатии на блок пользователь попадает в настройки выбранного блока.
На странице отображаются таски и (опционально) оценки за них.
Под списком тасков отображается информация о возможности отправки решений в блок, а также временной интервал активности блока.
Страница таска представляет из себя подробное описание задания, предлагаемого к решению.
Описание таска содержит в себе следующие атрибуты: Далее находится форма для отправки решения (.zip архив) и список отправленных решений.
Решение содержит в себе следующие атрибуты: Sprint поддерживает следующие варианты результатов тестирования:
При нажатии на результат тестирование можно получить информацию о том, какие именно тесты были пройдены, а какие - нет.
При нажатии на id решения пользователь попадает на страницу решения.
Страница с решением содержит ту же информацию, что и на странице таска.
Помимо этого, на данной странице можно выставить оценку за решение и оставить комментарий. Для сохранения результата необходимо нажать на кнопку "Зачесть".
Для выставления оценки 0 или максимальной оценки за таск, необходимо нажать на кнопку "Незачесть" или "Выставить максимальный балл" соответственно.
Комментарий будет сохранен при нажатии на любую из кнопок.
Внизу страницы отображаются файлы решения, содержащие только символы Unicode, иначе говоря, файлы с кодом.

Режим администратора

Некоторые функции доступны только преподавателям
Главная страница режима администратора показывает доступные для администрирования курсы, блоки в них и ссылку на данную методичку.
Добавление нового блока в курс происходит по нажатии кнопки "Новый блок".
При нажатии на кнопку "Участники курса" открывается страница с настройками участников курса.
Для подписки существующих студентов или преподавателей на курс, необходимо ввести в форму "Добавить участников" ФИО студента или email, на который зарегестрирован аккаунт.
Для подписки всех студентов определенной группы, нужно ввести название группы.
Для отписки студента от курса, нужно нажать на кнопку "отписка" рядом с нужным студентом.
Для того, чтобы сделать подписчика курса ассистентом или снятия с него таких прав, необходимо выбрать почту этого студента в форме "Назначить или разжаловать" и нажать на кнопку применить. Статус студента будет отображен в таблице ниже.
В Sprint отсутствует регистрация в обычном понимании данного термина, поэтому регистрация студентов происходит при первом добавлении его к некоторому курсу.
Прежде всего необходимо создать JSON файл по определенным правилам, описанным на странице участников курса.
При нажатии на блок, отображается страница с настройками блока.
Страница настроек блока содержит следующие аттрибуты: Ограничения по времени были внедрены для того, чтобы отложить запуск блока. Блок будет доступен студентам только если данный момент времени входит в интервал между временем начала и временем конца (границы включаются), и блок открыт для отправки решений.
После установки нужных значений необходимо нажать на кнопку "Сохранить".
Для создания нового таска после списка тасков есть кнопка "Новый таск".
При нажатии на таск из списка, откроется страница с настройками таска.
Поля "Легенда", "Входные данные", "Выходные данные" и "Спецификации" заполняются с помощью html разметки, которая потом будет отображена в режиме студента.
В настройках таска содержатся еще несколько аттрибутов: В форму загрузки тестов загружается .cs файл с Unit тестами библиотеки Nunit. По нажатии на кнопку "Посмотреть" можно посмотреть тесты и отредактировать их. Для сохранения файла необходимо нажать на кнопку "Сохранить" внизу страницы.
В форму "Дополнительные файлы" можно загрузить файлы, которые будут скорированы в директорию с исполняемыми файлами при тестировании.
При нажатии на кнопку "Посмотреть решения" на странице настроек блока открывается страница решений, загруженных в текущий блок.
Функциональность таблицы решений внизу страницы схожа с подобной в режиме студента.
Фильтр на данной странице содержит следующие поля: При нажатии на кнопку "Перетест" отфильтрованные решения будут перетестированы.

Darwin

Одним из ограниений Unit тестирования является невозможность тестирования приватных методов и приватных классов.
Для решения данной проблемы в Sprint содержится компонента Darwin. Загрузить библиотеку можно по данной ссылке.
Darwin позволяет создавать объекты приватных классов, задавать значения приватным полям и свойствам, а также вызывать приватные методы.
Основой библиотеки является класс DObject.
В конструктор передается имя того класса, объект которого необходимо создать, с указанием пространства имен.
using Darwin;
using Nunit.Framework;

[TestFixture]
public class Tests
{
    [Test]
    public void Test1()
    {
        DObject d = new DObject("Calculator.Calc");
    }
}
Для доступа к полям и свойствам класса нужно использовать индексатор.
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);
    }
}
Для вызова методов класса используется метод InvokeMethod.
В качетсве параметров передается имя метода и массив параметров.
Тип возвращаемого значения метода InvokeMethod - object, поэтому необходимо проводить каст к нужному типу после вызова.
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"]);
    }
}

Use cases

Как собрать таск


Как написать Unit тест правильно


Как написать тест на входные и выходные данные


Что необходимо указать в спецификациях


Полезные html тэги

{% endblock %}