Интеграционное и системное тестирование

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

Время чтения: 5 мин

Юнит-тесты, как правило, занимают наибольший объём тестов в проекте. Ограничение же юнит-тестов в том, что они не проверяют, как модули работают в связи друг с другом.

Для решения этой проблемы разработчики используют интеграционное и системное тестирование.

Кратко

Секция статьи "Кратко"

Интеграционное тестирование проверяет работу нескольких модулей в группе. Системное тестирование проверяет программную систему полностью.

Они решают проблему, которая остаётся после покрытия кода юнит-тестами — проверяют, как модули работают в связи друг с другом. Системное тестирование более обширно и само делится на несколько видов тестов по их типу и назначению.

Системные и интеграционные тесты тоже можно автоматизировать и встроить в CI/CD проекта.

Интеграционное тестирование

Секция статьи "Интеграционное тестирование"

Интеграционные тесты проверяют, как два или несколько модулей взаимодействуют друг с другом. Мы, как правило, всё ещё не поднимаем весь проект полностью, а проверяем работу отдельных фич.

Например, проверка одного из сценариев регистрации на бэкенде может быть описана в виде интеграционного теста. Такая проверка затронет и API-эндпоинты, и контроллеры, и общение с базой данных.

Когда использовать

Секция статьи "Когда использовать"

Когда мы хотим проверить работу нескольких модулей, но не всего проекта в целом.

Какие есть инструменты

Секция статьи "Какие есть инструменты"

Среди самых популярных инструментов можно назвать:

Рекомендации к тестам

Секция статьи "Рекомендации к тестам"

Выбрать подход

Есть два подхода к интеграции модулей для тестирования: «большой взрыв» и «инкрементальная интеграция». В первом подходе мы объединяем все модули, а затем проверяем сценарии.

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

Определить критические фичи

Стоит приоритизировать все фичи и выбрать те, которые в первую очередь должны быть проверены и работать безотказно. Обычно это модули, связанные с главной логикой приложения.

Подготовить тестовые данные

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

Подготовить заглушки и драйверы

Заглушки и драйверы похожи на стабы и моки. Заглушка вызывается тестируемой группой модулей — проверяет «выход» группы; а драйвер вызывает тестируемую группу — подаёт сигнал на «вход».

Системное тестирование

Секция статьи "Системное тестирование"

Системное тестирование — это целый класс тестов. Их объединяет общий признак: они тестируют программную систему полностью.

Их много, но мы выделим самые часто используемые:

  • End-to-end тесты;
  • скриншотные тесты;
  • тесты безопасности;
  • тесты производительности.

E2E-тестирование

Секция статьи "E2E-тестирование"

End-to-end (E2E) тесты — помогают нам имитировать, как пользователи будут работать с нашей программой.

Обычно такие тесты описывают сценарий для теста в терминах действий пользователя, например, в браузере:

  • зайти на такую-то страницу;
  • нажать такую-то кнопку;
  • увидеть такой-то текст.

Когда использовать

Секция статьи "Когда использовать"

Когда мы хотим проверить, как ведёт себя вся программа полностью при различных действиях пользователей.

Инструменты

Секция статьи "Инструменты"

Для описания таких сценариев у нас тоже богатый набор инструментов:

Можно также адаптировать и инструменты для интеграционного тестирования под E2E нужды.

Скриншотное тестирование

Секция статьи "Скриншотное тестирование"

Скриншотным тестированием мы проверяем регрессии пользовательского интерфейса. Сперва мы делаем скриншот-эталон, с которым потом сравниваем интерфейс после изменений.

Если скриншоты совпадают, значит UI остался тем же, и никаких ошибок при изменении кода мы не допустили. Если же скриншоты отличаются, мы что-то упустили из виду.

Когда использовать

Секция статьи "Когда использовать"

Когда мы хотим проверить, что UI остался неизменным после изменения кода.

Инструменты

Секция статьи "Инструменты"

Некоторые из E2E-инструментов содержат и функциональность для скриншотного тестирования:

Тестирование производительности

Секция статьи "Тестирование производительности"

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

Мы также сперва делаем эталонные замеры, с которыми затем сравниваем показатели после изменений кода.

Когда использовать

Секция статьи "Когда использовать"

Когда нам важно, чтобы производительность оставалась на установленном уровне.

Инструменты

Секция статьи "Инструменты"

Мы можем использовать как встроенные в браузер инструменты, так и отдельные сервисы:

Тестирование безопасности

Секция статьи "Тестирование безопасности"

Это больше относится к бэкенду, но иногда такие тесты пишут и для фронтенд-кода тоже. Чаще всего во фронтенде проверяют экранирование пользовательского ввода, защищённость куки и запросы к API.