Создание модульных тестов в MS Visual Studio

Создание модульных тестов в MS Visual Studio

Цель: приобретение практических навыков модульного тестирования программ средствами Visual Studio.

Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.

Модульный тест — это автоматизированный фрагмент кода, который вызывает тестируемый метод или класс, а затем проверяет несколько предположений относительно логического поведения метода или класса Джефф Левинсон).

Подключение тестового решения

При модульном тестировании первым шагом выбирается метод, который будет тестироваться.

В качестве примера разберем метод нахождения корней квадратного уравнения.

Далее необходимо добавить «Unit-test project» в Решение приложения. Для этого необходимо нажать правой клавишей на Решении (solution) в Обозревателе решений.

Из выпадающего меню выбрать пункт «Add» (добавить), добавляем новый проект (newproject), и в открывшемся окне выбираем Unit TestProject.

Далее в браузере решений (SolutionExplorer), в разделе тестов, необходимо в разделе References (ссылки) выбрать добавление нового решения. После чего откроется менеджер решений.

В разделе Решения (Solution) выбираем пункт Проекты (Project). Далее устанавливаем галочку напротив нужного решения и нажимаем «ОК». В обозревателе решений, появится ссылка на проект в разделе Ссылки (References).

Задание 1:
Самостоятельно откройте тестовое приложение соответствующее вашему варианту с помощью Visual Studio и добавьте в проект модульный тест. Вариант задания выбирается по последним двум цифрам в студенческом билете. Тестовое приложение находится в папке "Programms".

Создание модульного теста

Следующим шагом будет создание модульного теста. Для редактирования тестового класса, открываем класс UnitTest1.cs. В начале необходимо указать директиву с названием пространства имен класса, который подвергается тестированию. Название пространства имен указывается после слова namespace в тестируемом классе.

Далее изменяем тестовый метод TestMethod1(), который создается автоматически. Для этого напишем следующий код в тело метода.

Сперва указываются переменные, которые будут передаваться в метод в качестве аргументов.

Далее создается коллекция значений expected, эти значения задаются проверяющим, и они известны до начала тестирования.

После чего создается коллекция полученных результатов actual, которая получает значения из проверяемого метода.

Далее с помощью класса CollectionAssert сравниваются коллекции объектов.

Если возникает ошибка защищенности метода или класса, то стоит сделать метод и/или класс публичным

Задание 2:
Для тестового приложения выделите метод, который необходимо протестировать на основе спецификации, а также напишите для него положительный модульный тест по аналогии с примером.

Работа с Обозревателем тестов

Для того чтобы работать с модульными тестами, нам понадобиться открыть окно Test Exlorer-а: Test -> Windows -> Test Explorer. Если в нем нет написанных тестов, то необходимо собрать решение.

В Test Explorer можно запускать различные группы тестов:

  1. Все тесты.
  2. Только не прошедшие.
  3. Не запускавшиеся.
  4. Только прошедшие.

Из контекстного меню на тесте, можно запустить конкретный тест, перейти к его описанию, провести отладку или получить анализ выполнения. Также имеется возможность запускать тесты принудительно, после выполнения каждого нового построения решения.

Включаем эту опцию и перестраиваем наше решение:

Выполнение тестов происходит в отдельном потоке, что позволяет производить параллельное тестирование программы с помощью ручного тестирования.

Задание 3:
Проверьте созданный метод с помощью Обозревателя тестов

Создание набора тестов

На данном этапе у нас имеется один тест, который проверяет один тестовый набор. Для проверки нескольких тестовых наборов необходимо создать новые методы, проверяющие оставшиеся тестовые наборы.

Для приведенного примера имеет смысл проверить несколько вариантов с различными выходными параметрами:


первыйтестовый случай, когда у нас нет корней:

[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 voidOneRootTest()

{

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].А также изменить входные параметры.

После того, как все тесты созданы, имеет смысл запустить их на проверку.

По окончании тестирования все тесты будут разделены на пройденные и не пройденные, и подсвечены соответствующим цветом. При нажатии на не пройденный тест можно увидеть сообщение об ошибке, из-за которой тестирование завершилось неудачей.

Задание 4:
Создайте остальные модульные тесты исходя из данных полученных в лабораторной «Функциональное тестирование» и проведите тестирование с помощью Обозревателя тестов.


Контрольное задание

Самостоятельно на основе приведенного примера, реализуйте набор Unit-тестов для метода из тестируемого приложения, соответствующего вашему варианту. Вариант задания выбирается по последним двум цифрам в студенческом билете. В качестве тестовых вариантов используйте материалы подготовленные в лабораторной «Функциональное тестирование».