Интеграционное тестирование. Уровни, стратегии, их достоинства и недостатки.
Интеграционное тестирование (integration testing) – это этап тестирования, следующий за модульным тестированием (unit testing). На этапе модульного тестирование выполняется проверка корректности работы отдельных модулей системы, а целью этапа интеграционного тестирования – является проверка их взаимодействия. При разработке сложной программной системы, состоящей из множества подсистем, интеграционное тестирование может применяться на разных уровнях детализации для проверки взаимодействия:
Множества модулей (компонент);
Множества компонент (продукт);
Множества продуктов (система);
Существует несколько стратегий интеграционного тестирования:
Стратегия инкрементального тестирования (Incremental):
восходящее (bottom-up);
нисходящее (top-bottom);
Стратегия мгновенного тестирования (Instantaneous);
Инкрементальное интеграционное тестирование проходит следующим образом: вначале тестируются пары модулей, затем в большие блоки и так далее, пока все модули не будут объединены в единую систему, причём порядок объединения определяется выбранной стратегией (восходящей или нисходящей).
Ошибка, выявленная при тестировании взаимодействия пары модулей, чья функциональность уже протестирована, будет заключаться в их интерфейсе. При объектно-ориентированном программировании, ошибки взаимодействия в основном случаются при реализации отношений ассоциации (а так же агрегирования и композиции, в частности) между классами, которые отражаются в интерфейсах классов. Классы могут взаимодействовать между собой следующими способами:
Общедоступная операция имеет один или большее число формальных параметров объектного типа. Сообщение устанавливает ассоциацию между получателем и параметром, которая позволяет получателю взаимодействовать с этим параметрическим объектом;
Общедоступная операция возвращает значения объектного типа. На класс может быть возложена задача создания возвращаемого объекта, либо он может возвращать модифицированный параметр;
Метод одного класса создает экземпляр другого класса как часть своей реализации;
Метод одного класса ссылается на глобальный экземпляр некоторого другого класса;
Порядок проведения нисходящего интеграционного тестирования модулей:
Driver – Код – оболочка, вызывающий тестируемый модуль;
Stub – методы – заглушки;
Достоинства:
Позволяет легко верифицировать высокоуровневое поведение;
Требуется только один драйвер;
Модули могут добавляться последовательно по мере их Unit-тестирования;
Поддерживает поиск в ширину и глубину;
Недостатки:
Задерживает верификацию низкоуровневого поведения;
Частое использование заглушек для отсутствующих элементов;
Тестовые наборы могут быть трудны для написания.
Результаты тестовых наборов могут быть трудны для интерпретации;
Порядок проведения восходящего интеграционного тестирования модулей:
Достоинства:
Позволяет легко верифицировать низкоуровневое поведение;
Отсутствие необходимости написания вспомогательных заглушек;
Легко сформулировать входные данные для поддерева;
Легко интерпретировать выходные данные;
Недостатки:
Задерживает верификацию высокоуровневого поведения;
Требуется большое количество драйверов для имитации запускающих модулей;
При объединении поддеревьев большое число элементов может быть интегрировано в один момент времени;
Стратегия мгновенного тестирования является альтернативой инкрементальной стратегии и заключается в том, что выполняется тестирование взаимодействия всех модулей одновременно. Предположительно, данная стратегия должна быть более экономичной по времени тестирования, чем инкрементальная, однако, учитывая время, необходимое на локализацию возникшей ошибки, данное предположение спорно.
