Практическое занятие № 4. Модульное тестирование
Цель работы: изучить возможность создания автоматических тестов, для модульного тестирования.
Сегодня тестирование – это обязательная часть процесса разработки программного обеспечения (далее – ПО). Это связано с жесткими правилами конкуренции для компаний, производящих программные продукты (ПП).
Раньше таких компаний на рынке было мало и пользователи программных продуктов были продвинутыми и заменяли тестеров. Если в программе обнаруживались баги, то пользователь звонил или отправлял письмо в компанию, где ошибку исправляли и по почте отправляли дискетку со свежим релизом. Но начиная с 1990 года согласно статистики продажи персональных компьютеров с каждым годом удваивались. И появилась армия пользователей, которая не готова была что-то тестировать. Если что-то не устроило было проще обменять на другой софт, т.к. число компаний производящих ПО тоже увеличивалось с каждых готом. И у пользователей появился выбор что покупать и чем пользоваться.
Таким образом, тестирование ушло внутрь компаний, и появилась профессия тестировщика.
Рассмотрим определение, которое записано в SWEBOK.
Тестирование ПО – это проверка соответствия между реальным поведением программы и ее ожидаемым поведением на конечном наборе тестов, выбранном определенным образом. [IEEE Guide to Software Engineering Body of Knowledge, SWEBOK, 2004].
Все виды тестирования можно условно разделить на две большие группы: Статическое тестирование (static testing).
Динамическое тестирование (dynamic testing).
Статическое тестирование – это процесс анализа самой разработки программного обеспечения, т. е. тестирование без запуска программы.
К данной группе можно отнести анализ кода. Данный вид тестирования осуществляется в основном программистами. Проводят тестирование артефактов разработки программного обеспечения, таких как требования, дизайн или программный код, проводимое без исполнения этих артефактов. Например, с помощью рецензирования или статического анализа.
Статический анализ кода (static code analysis) – это анализ исходного кода, производимый без его исполнения.
Динамическое тестирование – это тестовая деятельность, предусматривающая эксплуатацию (запуск) программного продукта.
Динамическое тестирование предполагает запуск программы, выполнение всех еe функциональных модулей и сравнение фактического ее поведения с ожидаемым.
Статическое тестирование позволяет обнаружить дефекты, которые являются результатом ошибки и привести к сбоям в программном обеспечении. Динамическое тестирование позволяет продемонстрировать непосредственно сбои в программном обеспечении.
Существует несколько признаков, по которым принято производить классификацию видов тестирования.
По знанию системы выделяют:
тестирование «черного ящика» (black box testing);
тестирование «белого ящика» (white box testing);
тестирование «серого ящика» (grey box testing).
Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.
Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.
Цель модульного тестирования — изолировать отдельные части программы и показать, что по отдельности эти части работоспособны.
Задание 1. Создание проекта программы, модули которого будут тестироваться.
Разработаем проект содержащий класс, который вычисляет площадь прямоугольника по длине двух его сторон.
Создадим в Visual Studio новый проект Visual C# - Библиотека классов. Назовём его MathTaskClassLibrary.
Class1 переименуем в Geometry.
В классе реализуем метод, вычисляющий площадь прямоугольника. Для демонстрации остановимся на работе с целыми числами. Код программы приведён ниже.
Рисунок 2
Создание проекта для модульного тестирования в Visual Studio.
Чтобы выполнить unit-тестирование, необходимо в рамках того же самого решения создать ещё один проект соответствующего типа.
Правой кнопкой щёлкните по решению, выберите “Добавить” и затем “Создать проект…”.
Рисунок 3
В открывшемся окне в группе Visual C# щёлкните “Тест”, а затем выберите “Проект модульного теста”. Введите имя проекта MathTaskClassLibraryTests и нажмите “ОК”. Таким образом проект будет создан.
Рисунок 4
Перед Вами появится следующий код:
Рисунок 5
Директива [TestMethod] обозначает, что далее идёт метод, содержащий модульный (unit) тест. А [TestClass] в свою очередь говорит о том, что далее идёт класс, содержащий методы, в которых присутствуют unit-тесты.
В соответствии с принятыми соглашениями переименуем класс UnitTest1 в GeometryTests.
Затем в References проекта необходимо добавить ссылку на проект, код которого будем тестировать. Правой кнопкой щёлкаем на References, а затем выбираем “Добавить ссылку…”.
В появившемся окне раскрываем группу “Решение”, выбираем “Проекты” и ставим галочку напротив проекта MathTaskClassLibrary. Затем жмём “ОК”.
Рисунок 6
Также в коде необходимо подключить с помощью директивы using следующее пространство имён: using MathTaskClassLibrary;
Займёмся написание теста. Проверим правильно ли вычисляет программа площадь прямоугольника со сторонами 3 и 5. Ожидаемый результат (правильное решение) в данном случае это число 15.
Переименуем метод TestMethod1() в RectangleArea_3and5_15returned(). Новое название метода поясняет, что будет проверяться (RectangleArea – площадь прямоугольника) для каких значений (3 и 5) и что ожидается в качестве правильного результата (15 returned).
Тестирующий метод обычно содержит три необходимых компонента:
исходные данные: входные значения и ожидаемый результат;
код, вычисляющий значение с помощью тестируемого метода;
код, сравнивающий ожидаемый результат с полученным. Соответственно тестирующий код будет таким:
Рисунок 7
Для сравнения ожидаемого результата с полученным используется метод AreEqual класса Assert. Данный класс всегда используется при написании unit тестов в Visual Studio.
Теперь, чтобы просмотреть все тесты, доступные для выполнения, необходимо открыть окно “Обозреватель тестов”. Для этого в меню Visual Studio щёлкните на кнопку “ТЕСТ”, выберите “Окна”, а затем нажмите на пункт “Обозреватель тестов”.
Рисунок 8
В студии появится следующее окно:
Рисунок 9
В данный момент список тестов пуст, поскольку решение ещё ни разу не было собрано. Выполним сборку нажатием клавиш Ctrl + Shift + B. После её завершения в “Обозревателе тестов” появится наш тест.
Рисунок 10
Синяя табличка с восклицательным знаком означает, что указанный тест никогда не выполнялся. Выполним его.
Для этого нажмём правой кнопкой мыши на его имени и выберем “Выполнить выбранные тесты”.
Рисунок 11
Зелёный кружок с галочкой означает, что модульный тест успешно пройден: ожидаемый и полученный результаты равны.
Изменим код метода RectangleArea, вычисляющего площадь прямоугольника, чтобы сымитировать провал теста и посмотреть, как поведёт себя Visual Studio. Прибавим к возвращаемому значению 10.
Запустим unit-тест.
Рисунок 12
Как Вы видите, красный круг с крестиком показывает провал модульного теста, а ниже указано, что при проверке ожидалось значение 15, а по факту оно равно 25.
Задание 2. Разработать программу для подсчета объема цилиндра и создать модульный
тест.