Лабораторная работа № 2 Интеграционное тестирование Цель работы: 1. Изучение назначения и задач интеграционного тестирования. 2. Программная реализация тестов, производящих интеграционное тестирование алгоритма пирамидальной сортировки из курса лабораторных работ. Общие сведения Интеграционное тестирование — это тестирование программного обеспечения на корректность взаимодействия нескольких модулей, объединенных в единое целое. Несмотря на то, что результатом тестирования и верификации отдельных модулей, составляющих программную систему, является заключение о том, что эти модули являются внутренне непротиворечивыми и соответствуют требованиям, это не гарантирует их корректную совместную работу. Целью интеграционного тестирования является проверка соответствия проектируемых единиц функциональным, приёмным и требованиям надежности. Тестирование этих проектируемых единиц — объединения, множества или группа модулей — выполняются через их интерфейс, используя тестирование «чёрного ящика». Интеграционное тестирование называют еще тестированием архитектуры системы. Результаты выполнения интеграционных тестов – один из основных источников информации для процесса улучшения и уточнения архитектуры системы, межмодульных и межкомпонентных интерфейсов. Т.е. с интеграционные тесты проверяют корректность взаимодействия компонент системы. Интеграционное тестирование, как правило, представляет собой итеративный процесс, при котором проверяется функциональность все более и более увеличивающейся в размерах совокупности модулей. Юнит-тестирование Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок. В данной работе мы будем использовать юнит-тесты для проверки функциональных требований программы. Для использования юнит-тестов будем использовать JUnit. JUnit — библиотека для модульного тестирования программного обеспечения на языке Java. Скачать свежую версию данной библиотеки можно по адресу http://www.junit.org. Пример юнит-теста, проверяющего равенство 2+2=4, приведен в листинге 4.1. Листинг 4.1 – пример юнит-теста import org.junit.Test; import junit.framework.Assert; public class MathTest { @Test public void testEquals() { Assert.assertEquals(4, 2 + 2); Assert.assertTrue(4 == 2 + 2); } @Test public void testNotEquals() { Assert.assertFalse(5 == 2 + 2); } } Предварительная подготовка к работе Так как алгоритм реализован на языке Java, то юнит-тесты следует писать с использованием библиотеки JUnit (http://www.junit.org). Допускается использовать любую удобную среду разработки (IDEA / Eclipse / др.). Для упрощения задачи, предлагается выполнить интеграционное тестирование по восходящему подходу. При использовании этого метода подразумевается, что сначала тестируются все программные модули, входящие в состав системы, и только затем они объединяются инкрементально для интеграционного тестирования. При таком подходе значительно упрощается локализация ошибок: если модули протестированы по отдельности, то ошибка при их совместной работе есть проблема их интерфейса. Также при таком подходе при постепенном увеличении проверенного объединённого кода получается итоговая работоспособность всей программы. Интеграционные тесты должны проверять совместную работу отдельных модулей или наборов модулей, между которыми есть зависимости. При этом тесты должны проверять тестируемые модули на соответствие функциональным требованиям и требованиям надежности. В этом случае тестирование происходит по методу «черного ящика». Другими словами, одно из ключевых особенностей интеграционного тестирования — проверить, правильно ли обрабатываются входные данные отдельных методов при вызове их при разных ситуациях и наборах исходных данных (функциональная сторона интеграционного тестирования) и проверить стабильность работы модуля при разных исходных данных (проверка на надежность работы модуля интеграционным тестированием). Несмотря на то, что интеграционные тесты не являются юнит-тестами в классическом понимании, при выполнении задач лабораторной работы необходимо использовать библиотеку JUnit и написать модуль юнит-тестирования вручную (используя Java-аннотации @Test и документацию библиотеки JUnit). Реализовать юнит-тесты следует так, чтобы они выполнял функциональное тестирование программы сортировки в соответствии с целями работы. Прежде чем приступать к написанию тестов, необходимо составить план интеграционного тестирования — документ, где описан общий подход к определению последовательности, в которой должны интегрироваться модули. Существует несколько подходов к составлению такого документа. В данной работе предлагается использовать интеграционный тест-план кластерного типа. Для составления плана тестирования необходимо разделить существующие в проекте модули на кластеры — отдельные классы или наборы классов, имеющие вместе некоторую замкнутую и законченную функциональность. Также практически удобно делить модули на кластеры по принципу наличия зависимостей между модулями (если модуль зависит от двух модулей, а они от него нет, то они выделяются в, к примеру, Кластер 1, а независимый модуль — в Кластер 2). Затем, для каждого кластера необходимо определить следующее: кластеры, от которых зависит данный кластер; кластеры, которые должны быть протестированы до тестирования данного кластера; описание функциональности тестируемого кластера; список модулей в кластере; описание тестовых примеров для проверки кластера; По окончании составления этого списка, в последней графе для каждого кластера будет содержаться список тестов, которые будут реализованы в отдельном java-файле для проверки интеграционной работоспособности классов. Порядок выполнения работы 1. Откройте выбранную IDE и создайте проект на основе существующих программных кодов, реализующих алгоритм пирамидальной сортировки. 2. Подключите к проекту библиотеку JUnit. 3. Сгруппируйте модули в кластеры. В данном случае под кластерами подразумеваются классы или наборы классов, имеющие совместную замкнутую функциональность (не зависящий друг от друга). Учтите, что данный пункт является ключевым во всей работе, так как от того, как вы разделите модули проекта на кластеры, зависит непосредственно качество покрытия тестами их совместной работы. Интеграционные тесты должны проверять совместную работу отдельных модулей или наборов модулей, между которыми есть зависимости. При этом тесты должны проверить, правильно ли обрабатываются входные данные отдельных методов при вызове их при разных ситуациях и наборах исходных данных (функциональная сторона интеграционного тестирования) и проверить стабильность работы модуля при разных исходных данных (проверка на надежность работы модуля интеграционным тестированием). 4. Напишите план интеграционного тестирования в соответствии с рекомендациями, приведенными в пункте «Подготовка к лабораторной работе». 5. Исходя из количества описанных кластеров и заявленных для них тестовых примеров (последний пункт плана), создайте соответствующее количество юнит-тестов. 6. Отладьте и запустите все юнит-тесты. При этом не требуется исправление ошибок в исходном коде, если таковые были обнаружены. 7. Оцените результаты выполнения юнит-тестирования и сделайте соответствующие выводы. Содержание отчёта 1. Необходимо представить исходный код, описание и результаты работы юнит-тестов на проверку правильности интеграции модулей системы. 2. Изложить вводы по результатам тестирования и проделанной лабораторной работе.