Лабораторная работа

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

Цель: приобретение практических навыков модульного тестирования программ средствами 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. Если в нем нет написанных тестов, то необходимо собрать решение.

Описание: http://4.bp.blogspot.com/-5pTGRUp2EHc/UPJ0VgdjK6I/AAAAAAAAA5k/Ivdi2zq7gbM/s320/04.png

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

1.     все тесты

2.     только не прошедшие

3.     не запускавшиеся

4.     только прошедшие.

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

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

Описание: http://3.bp.blogspot.com/-nR_cxGq_P9E/UPJ1rnRPmsI/AAAAAAAAA6M/lDJBl9qIfkg/s1600/06.png

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

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

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

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

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

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

 

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

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

Описание: http://2.bp.blogspot.com/-3OWiDhrFKhU/UPKIKcKOKMI/AAAAAAAAA8c/S9rB1x3Fey4/s320/11.png

 

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

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