Цель: приобретение практических навыков модульного тестирования программ средствами Visual Studio.
Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. (wikipedia.org).
Модульный тест — это автоматизированный фрагмент кода, который вызывает тестируемый метод или класс, а затем проверяет несколько предположений относительно логического поведения метода или класса. (Джефф Левинсон).
При модульном тестировании первым шагом выбирается метод, который будет тестироваться.
В качестве примера разберем метод нахождения корней квадратного уравнения.
Далее необходимо добавить «Unit-test project» в Решение приложения. Для этого необходимо нажать правой клавишей на Решении (solution) в Обозревателе решений.
Из выпадающего меню выбрать пункт «Add» (добавить), добавляем новый проект (new project), и в открывшемся окне выбираем Unit Test Project.
Далее в браузере решений (Solution Explorer), в разделе тестов, необходимо в разделе References (ссылки) выбрать добавление нового решения. После чего откроется менеджер решений.
В разделе Решения (Solution) выбираем пункт Проекты (Project). Далее устанавливаем галочку напротив нужного решения и нажимаем «ОК». В обозревателе решений, появится ссылка на проект в разделе Ссылки (References).
Следующим шагом будет создание модульного теста. Для редактирования тестового класса, открываем класс UnitTest1.cs. В начале необходимо указать директиву с названием пространства имен класса, который подвергается тестированию. Название пространства имен указывается после слова namespace в тестируемом классе.
Далее изменяем тестовый метод TestMethod1(), который создается автоматически. Для этого напишем следующий код в тело метода.
Сперва указываются переменные, которые будут передаваться в метод в качестве аргументов.
Далее создается коллекция значений expected, эти значения задаются проверяющим, и они известны до начала тестирования.
После чего создается коллекция полученных результатов actual, которая получает значения из проверяемого метода.
Далее с помощью класса CollectionAssert сравниваются коллекции объектов.
! Если возникает ошибка защищенности метода или класса, то стоит сделать метод и/или класс публичным
Для того чтобы работать с модульными тестами, нам понадобиться открыть окно Test Exlorer-а: Test -> Windows -> Test Explorer. Если в нем нет написанных тестов, то необходимо собрать решение.
В Test Explorer можно запускать различные группы тестов:
1. все тесты
2. только не прошедшие
3. не запускавшиеся
4. только прошедшие.
Из контекстного меню на тесте, можно запустить конкретный тест, перейти к его описанию, провести отладку или получить анализ выполнения. Также имеется возможность запускать тесты принудительно, после выполнения каждого нового построения решения.
Включаем эту опцию и перестраиваем наше решение:
Выполнение тестов происходит в отдельном потоке, что позволяет производить параллельное тестирование программы с помощью ручного тестирования.
На данном этапе у нас имеется один тест, который проверяет один тестовый набор. Для проверки нескольких тестовых наборов необходимо создать новые методы, проверяющие оставшиеся тестовые наборы.
Для приведенного примера имеет смысл проверить несколько вариантов с различными выходными параметрами:
первый тестовый случай, когда у нас нет корней:
[TestMethod]
public void NotRootsTest()
{
double a = 1;
double b = 4;
double c = 5;
double[] actual = SqrtRoots.Calc(a, b, c);
Assert.IsNotNull(actual);
Assert.IsTrue(actual.GetLength(0) == 0);
}
второй, 2 одинаковых корня:
[TestMethod]
public void OneRootTest()
{
double a = 1;
double b = -4;
double c = 4;
double[] expected = { 2 };
double[] actual = SqrtRoots.Calc(a, b, c);
CollectionAssert.AreEqual(expected, actual);
}
третий, 2 различных корня:
[TestMethod]
public void DoubleRootsTest()
{
double a = 1;
double b = -5;
double c = 4;
double[] expected = { 4, 1 };
double[] actual = SqrtRoots.Calc(a, b, c);
CollectionAssert.AreEqual(expected, actual);
}
Для упрощения создания новых тестовых методов, можно скопировать первый тестовый метод, но обязательно необходимо изменить его имя, а также перед объявлением метода указать принадлежность метода к тестовым методам, дописав перед ним [TestMethod]. А также изменить входные параметры.
После того, как все тесты созданы, имеет смысл запустить их на проверку.
По окончании тестирования все тесты будут разделены на пройденные и не пройденные, и подсвечены соответствующим цветом. При нажатии на не пройденный тест можно увидеть сообщение об ошибке, из-за которой тестирование завершилось неудачей.
Самостоятельно на основе приведенного примера, реализуйте набор Unit-тестов для метода из тестируемого приложения. В качестве тестовых вариантов используйте материалы подготовленные в лабораторной №n «Функциональное тестирование».