Модульное тестирование. Интеграционное тестирование. Восходящее и нисходящее тестирование
Уровни и виды тестирования
- Модульное тестирование (component testing)
- Интеграционное тестирование (integration testing)
- Системное тестирование (system testing)
- Приемочное тестирование ( a cceptance testing)
- smoke testing
- регрессионное тестирование
«Смок-тест» ( S moke Tes ting , «дымовое тестирование») в тестировании означает минимальный набор тестов на явные ошибки ( проверка наиболее важных ТС, невыполнение которых показывает, что продукт недееспособен ) . Дымовой тест обычно выполняется самим программистом; не проходящую этот тест программу не имеет смысла отдавать на более глубокое тестирование.
***История.
Первое свое применение этот термин получил у печников, которые, собрав печь, закрывали все заглушки, затапливали её и смотрели, чтобы дым шёл только из положенных мест.
Повторное «рождение» термина произошло в радиоэлектронике. Подключив в первый раз собранное устройство к источнику питания, радиолюбитель, пристально разглядывая каждый участок печатной платы, проводит так называемый «Smoke Test» — наблюдает, задымится или нет
Системное тестирование -проводится в конце validation phase – тестирование в условиях, максимально приближенных к условиям конечных п-лей
Модульное тестирование ( Unit testing)
- Модульное тестирование - это тестирование программы на уровне отдельно взятых модулей, функций или классов.
- Цель модульного тестирования состоит в выявлении локализованных в модуле ошибок в реализации алгоритмов, а также в определении степени готовности системы к переходу на следующий уровень разработки и тестирования.
- Модульное тестирование чаще всего проводится по принципу "белого ящика“.
- Модульное тестирование обычно подразумевает создание вокруг каждого модуля определенной среды
Среды, включающей заглушки для всех интерфейсов тестируемого модуля. Некоторые из них могут использоваться для подачи входных значений, другие для анализа результатов, присутствие третьих может быть продиктовано требованиями, накладываемыми компилятором и сборщиком.
Обнаруживаемые ошибки
- На уровне модульного тестирования проще всего обнаружить дефекты, связанные с алгоритмическими ошибками и ошибками кодирования алгоритмов.
- Ошибки, связанные с неверной трактовкой данных, некорректной реализацией интерфейсов, совместимостью, производительностью и т.п. обычно выявляются на более поздних стадиях тестирования.
, типа работы с условиями и счетчиками циклов, а также с использованием локальных переменных и ресурсов
Интеграционное тестирование
- Интеграционное тестирование (тестирование сборки) - тестирование части системы, состоящей из двух и более модулей.
- Основная задача - поиск дефектов, связанных с ошибками в реализации и интерпретации взаимодействия между модулями.
- Так же, как и модульное тестирование, оперирует интерфейсами модулей и подсистем и требует создания тестового окружения
- Основная разница между модульным и интеграционным тестированием состоит в типах обнаруживаемых дефектов. В частности, на уровне интеграционного тестирования часто применяются методы, связанные с покрытием интерфейсов
- Интеграционное тестирование использует модель "белого ящика" на модульном уровне.
Методы сборки модулей
- Монолитный , характеризующийся одновременным объединением всех модулей в тестируемый комплекс. Для замены неразработанных к моменту тестирования модулей необходимо дополнительно разрабатывать драйверы ( test driver ) и/или заглушки ( stub )
- Инкрементальный , характеризующийся помодульным наращиванием комплекса программ с пошаговым тестированием собираемого комплекса.
В инкрементальном методе выделяют две стратегии добавления модулей:
- "Сверху вниз" ( нисходящее тестирование) "Снизу вверх" ( восходящее тестирование)
- "Сверху вниз" ( нисходящее тестирование)
- "Снизу вверх" ( восходящее тестирование)
Сравнение методов
- Монолитное тестирование требует больших трудозатрат, связанных с дополнительной разработкой драйверов и заглушек и со сложностью идентификации ошибок, проявляющихся в пространстве собранного кода.
- Монолитное тестирование предоставляет большие возможности распараллеливания работ, особенно на начальной фазе тестирования.
- Пошаговое тестирование связано с меньшей трудоемкостью идентификации ошибок за счет постепенного наращивания объема тестируемого кода и соответственно локализации добавленной области тестируемого кода.
Нисходящее тестирование
- Нисходящее тестирование — это метод интеграционного тестирования, при котором процесс происходит постепенно по мере создания новых модулей командой разработки.
Восходящее тестирование
- Восходящее тестирование — это метод тестирования программного обеспечения, при котором программа собирается и тестируется снизу вверх.
Системное тестирование
- Основная задача системного тестирования - выявление дефектов, связанных с работой системы в целом:
- отсутствующая или неверная функциональность неверное использование ресурсов системы непредусмотренные комбинации данных пользовательского уровня несовместимость с окружением непредусмотренные сценарии использования неудобство в применении и тому подобное.
- отсутствующая или неверная функциональность
- неверное использование ресурсов системы
- непредусмотренные комбинации данных пользовательского уровня
- несовместимость с окружением
- непредусмотренные сценарии использования
- неудобство в применении и тому подобное.
- Системное тестирование производится над проектом в целом с помощью метода «черного ящика».
Категории тестов системного тестирования
- Полнота решения функциональных задач.
- Тестирование целостности (соответствие документации, комплектность).
- Проверка инсталляции и конфигурации на разных платформах.
- Оценка производительности.
- Стрессовое тестирование - на предельных объемах нагрузки входного потока.
- Корректность использования ресурсов (утечка памяти, возврат ресурсов).
- Эффективность защиты от искажения данных и некорректных действий.
- Корректность документации и т.д.
Объемы данных на этом уровне таковы, что обычно более эффективным подходом является полная или частичная автоматизация тестирования
Другой пример разделения на категории:
- Функциональное тестирование (functional testing)
- Тестирование производительности (perfo r mance testing)
- Стрессовое тестирование (stress testing)
- Нагрузочное тестирование (load testing)
- HP LoadRunner
- HP LoadRunner
- Тестирование удобства использования (usability testing)
- Тестирование интерфейса пользователя (UI testing)
- Тестирование безопасности (security testing)
- Тестирование локализации (localization testing)
- Тестирование совместимости (compatibility testing)
Функциональное тестирование (functional testing)
каждое функциональное требование транслируется в тест-кейсы (используя техники «черного ящика») для того, чтобы проверить, что система функционирует в точности, как и описано в спецификации (функциональных требованиях к системе)
проверяем, все ли функциональные требования действительно закодированы\реализованы.
Тестирование производительности (perfomance testing)
Специализированные тесты проверки удовлетворения специфических требований, предъявляемых к параметрам производительности. Существует особый подвид таких тестов, когда делается попытка достижения количественных пределов, обусловленных характеристиками самой системы и ее операционного окружения:
продемонстрировать, что система удовлетворяет критериям производительности при заданных условиях
измерить, какая часть системы является причиной «плохой» производительности системы
измерить время реакции на действие пользователя, время отклика на запрос, и т.д.
Стрессовое тестирование (stress testing)
тестирование операционных характеристик приложения в условиях ограниченных ресурсов (например, скорость, память, место на диске и т.д.)
проверить, что система в стрессовых условиях не прекращает свою работу некорректным образом (без сохранения копии базы данных, вывода сообщения пользователям и т.п.)
Нагрузочное тестирование (load testing)
применяется для анализа работы информационных систем на различных уровнях нагрузки.
основным понятием нагрузочного тестирования является "виртуальный пользователь". Управляя числом виртуальных пользователей, тестировщик управляет нагрузкой на систему .
определяем, при какой максимальной нагрузке (максимальном количестве пользователей) система способна функционирвать в соответствии с требованиями к производительности
HP LoadRunner
Тестирование удобства использования (usability testing)
- эксперимент, выполняемый с целью определения, насколько хорошо люди могут использовать некоторый искусственный объект (такой как веб-страница, пользовательский интерфейс или устройство) для его предполагаемого применения, то есть юзабилити-тестирование измеряет юзабилити объекта. Юзабилити-тестирование сосредоточено на определённом объекте или небольшом наборе объектов, в то время как исследования взаимодействия человек-компьютер в целом — формулируют универсальные принципы.
- метод оценки удобства продукта в использовании, основанный на привлечении пользователей в качестве тестировщиков, испытателей и суммировании полученных от них выводов.
Тестирование интерфейса пользователя (UI testing)
тестирование графического интерфейса пользователя для того, чтобы убедиться, что он соответствует принятым стандартам и их требованиям.
проверяем, как приложение обрабатывает ввод с клавиатуры и «мышки» и как отображаются элементы графического интерфейса (текст, кнопки, меню, списки и прочие элементы).
Тестирование безопасности (security testing)
- оценка уязвимости программного обеспечения к различным атакам.
В ходе тестирования безопасности испытатель играет роль взломщика. Ему разрешено все:
попытки узнать пароль с помощью внешних средств;
атака системы с помощью специальных утилит, анализирующих защиты;
подавление, ошеломление системы (в надежде, что она откажется обслуживать других клиентов);
целенаправленное введение ошибок в надежде проникнуть в систему в ходе восстановления;
просмотр несекретных данных в надежде найти ключ для входа в систему.
Тестирование локализации (localization testing)
проверяем функционирует ли система как ожидается под разными языковыми локализациями операционных систем
Тестирование совместимости (compatibility testing)
проверить, что приложение совместимо с определенными конфигурациями оборудования, операционными системами, базами данных, браузерами , и т.д.
Регрессионное тестирование
- Регрессионное тестирование - цикл тестирования, который производится при внесении изменений на фазе системного тестирования или сопровождения продукта.
- Главная проблема регрессионного тестирования - выбор между полным и частичным перетестированием и пополнение тестовых наборов. При частичном перетестировании контролируются только те части проекта, которые связаны с измененными компонентами.
Исправление дефекта
- Получив отчет об ошибке, программист анализирует исходный код, находит ошибку, исправляет ее и модульно или интеграционно тестирует результат.
- В свою очередь тестировщик, проверяя внесенные программистом изменения, должен:
- Проверить и утвердить исправление ошибки. Для этого необходимо выполнить указанный в отчете тест, с помощью которого была найдена ошибка. Попробовать воспроизвести ошибку каким-нибудь другим способом. Протестировать последствия исправлений. Возможно, что внесенные исправления привнесли ошибку (наведенную ошибку) в код, который до этого исправно работал.
- Проверить и утвердить исправление ошибки. Для этого необходимо выполнить указанный в отчете тест, с помощью которого была найдена ошибка.
- Попробовать воспроизвести ошибку каким-нибудь другим способом.
- Протестировать последствия исправлений. Возможно, что внесенные исправления привнесли ошибку (наведенную ошибку) в код, который до этого исправно работал.
Комбинирование уровней тестирования
- В каждом конкретном проекте должны быть определены задачи, ресурсы и технологии для каждого уровня тестирования.
- Задача тестировщиков и менеджеров - оптимально распределить ресурсы между тремя уровнями тестирования так, чтобы каждый из возможных типов дефектов был «адресован» (в наборе тестов должны иметься тесты, направленные на выявление дефектов этого типа).
- Например, перенесение усилий на поиск фиксированного типа дефектов из области системного в область модульного тестирования может существенно снизить сложность и стоимость всего процесса тестирования.
Модульное
Типы дефектов
Интеграционное
Локальные дефекты
Необходимость в системе тестирования
Системное
Интерфейсные дефекты
Цена разработки системы тестирования
Да
Цена процесса тестирования
Отсутствующая функциональность, ошибки совместимости, документации, переносимости, проблемы производительности, инсталляции и т.п.
Да
Низкая
Низкая до умеренной
Низкая
Нет *
Умеренная до высокой или неприемлемой
Низкая
Высокая
прямой необходимости в системе тестирования нет, но цена процесса системного тестирования часто настолько высока, что требует использования систем автоматизации, несмотря на возможно высокую их стоимость.
Приемочное тестирование
Acceptance
Testing
Приемочное тестирование ( Acceptance testing ) - тестирование готового продукта конечными пользователями в реальном окружении. Приемочные тесты разрабатываются пользователями (обычно в виде сценариев).
System
Testing
Integration
Testing
Unit
Testing
Классы тестов
- Классом можно назвать группу значений, которые программа обрабатывает одним и тем же способом. Граничные значения класса – те входные данные, на которых программа меняет свое поведение
- Не всегда программа меняет свое поведение там, где предполагается
- Границу нужно протестировать с двух сторон
Виды тестов
- Базовый тест -- smoke test
(простой тестовый пример)
- (простой тестовый пример)
(определить различные категории данных и создать тесты для каждого элемента категории)
- (определить различные категории данных и создать тесты для каждого элемента категории)
(скомбинировать различные входные данные)
- (скомбинировать различные входные данные)
(оценить поведение программы при граничных значениях данных)
- (оценить поведение программы при граничных значениях данных)
(оценить отклик системы на ввод неправильных данных)
- (оценить отклик системы на ввод неправильных данных)
- Нагрузочные тесты, создание напряжений
(попытаться вывести систему из строя)
- (попытаться вывести систему из строя)
Функциональное тестирование, error - guess testing , тестирование границ, тестирование производительности ( performance testing ), нагрузочное тестирование, usability