Что такое интеграционное тестирование?

В реальности под капотом множество взаимодействий между системами
В реальности под капотом множество взаимодействий между системами

Интеграционное тестирование - это процесс проверки взаимодействия и совместной работы различных компонентов или модулей системы для проверки их корректной интеграции и функционирования вместе.

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

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

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

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

Как тестировать интеграции?

Шаги при тестировании интеграций:

  1. Определение сценариев интеграции: Начните с определения различных сценариев интеграции, которые требуется протестировать. Разбейте интеграции на отдельные компоненты и определите, как они должны взаимодействовать друг с другом.

  2. Разработка тестовых данных: Создайте тестовые данные, которые позволят вам проверить различные аспекты интеграций. Включите различные комбинации данных, типичные и крайние случаи, а также ошибочные данные, чтобы убедиться в правильной обработке и валидации.

  3. Тестирование API: Если ваши интеграции основаны на взаимодействии через API, используйте инструменты для отправки запросов и проверки ответов. Проверьте, что запросы правильно передаются и обрабатываются, а ответы соответствуют ожидаемым результатам.

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

  5. Тестирование E2E: Выполните тестирование интеграций на уровне E2E, чтобы проверить, что система в целом работает правильно. Здесь вы будете моделировать полное взаимодействие между всеми компонентами и проверять конечные результаты.

    Один из возможных сценариев E2E
    Один из возможных сценариев E2E

Зачем тестировать интеграции?

  1. Обнаружение проблем взаимодействия: При интеграции различных компонентов системы могут возникать проблемы совместной работы, несовместимость интерфейсов, неправильная передача данных и другие проблемы. Тестирование интеграций позволяет обнаружить такие проблемы и устранить их еще на ранних стадиях разработки, что способствует созданию более надежной и стабильной системы.

  2. Гарантирование правильного функционирования системы: Интеграционные тесты проверяют, что различные компоненты системы правильно взаимодействуют друг с другом и выполняют свои функции в соответствии с требованиями. Это помогает гарантировать, что система работает корректно и производит ожидаемые результаты.

  3. Уменьшение риска при изменениях: При внесении изменений в систему, таких как обновление компонентов или добавление нового функционала, тестирование интеграций помогает убедиться, что изменения не приводят к непредвиденным проблемам взаимодействия. Это позволяет снизить риск возникновения ошибок и сбоев в работе системы после внесения изменений.

Сложности интеграционного тестировании

  1. Несколько зависимостей: В больших системах с множеством компонентов интеграционное тестирование может стать сложным из-за большого количества зависимостей между компонентами. Изменение одного компонента может потребовать изменений в других компонентах, что усложняет процесс тестирования и требует тщательного планирования и координации.

  2. Необходимость доступа к внешним системам: Если система взаимодействует с внешними сервисами или системами, тестирование интеграций может столкнуться с проблемой доступа к этим внешним системам во время тестирования. Например, тестовая среда может не иметь доступа к системам, что требует имитации или использования тестовых окружений для внешних систем.

  3. Поведение в реальных условиях: Интеграционное тестирование должно быть выполнено в условиях, максимально приближенных к реальным. Однако, создание и поддержка таких условий может быть сложной задачей. Например, для тестирования интеграции с внешними системами может потребоваться настройка тестовых окружений, баз данных, сетевых подключений и других компонентов.

  4. Сложность отладки: Если возникают проблемы взаимодействия между компонентами, их отладка может быть сложной задачей. Ошибка может быть вызвана проблемами с конфигурацией, синхронизацией данных, передачей сообщений и т. д. Определение и изоляция причины ошибки может требовать дополнительного времени и ресурсов.

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

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

Решение проблемы интеграционного тестирования

Частичное решение проблем интеграционного тестирования является использование изоляционного тестирования.

Изоляционное тестирование (Isolation testing) - это вид тестирования, в котором компонент или модуль системы тестируется в изоляции от остальных компонентов. Основная цель изоляционного тестирования состоит в проверке функциональности, корректности и надежности отдельных компонентов системы, независимо от их взаимодействия с другими компонентами.

В отличие от интеграционного тестирования, где проверяется совместная работа компонентов, изоляционное тестирование фокусируется на тестировании компонента в изоляции от внешних зависимостей. Для этого используются моки (mocks) или заглушки (stubs), которые эмулируют поведение внешних компонентов, чтобы сосредоточиться на функциональности и корректности самого компонента.

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

Разбиваем нашу систему и тестируем по отдельности
Разбиваем нашу систему и тестируем по отдельности

Что такое моки?

Моки (mocks) - это объекты, создаваемые во время тестирования, которые имитируют поведение реальных объектов или компонентов системы. Они используются для эмуляции взаимодействия с зависимостями компонента, которые необходимы для проведения тестирования в изоляции.

Моки создаются с целью контролировать и проверять, как компонент взаимодействует с внешними зависимостями. При использовании моков можно установить ожидаемое поведение этих зависимостей и проверить, что компонент правильно взаимодействует с ними в рамках тестируемого сценария.

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

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

Важно отметить, что моки не являются полноценными реализациями зависимостей, а лишь эмулируют их поведение в контролируемой среде тестирования.

Средства тестирования при помощи моков

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

  1. Java

    1. WireMock - https://github.com/wiremock/wiremock

    2. Citrus Framework - https://github.com/citrusframework/citrus

    3. Сastlemock - https://github.com/castlemock/castlemock

    4. Mockserver -https://github.com/mock-server/mockserver

  2. Python

    1. HTTPretty - https://github.com/gabrielfalcao/HTTPretty

    2. Mockintosh - https://github.com/up9inc/mockintosh

    3. Responses- https://github.com/getsentry/responses

  3. JavaScript

    1. Json-server - https://github.com/typicode/json-server

В следующих статья мы более подробнее разберем каждый инструмент. Следите за статьями и делитесь вашим опытом!

Комментарии (4)


  1. KuzCode
    24.05.2023 05:03

    В ходе статьи было изобретено модульное тестирование


    1. akuz0 Автор
      24.05.2023 05:03

      На мой взгляд модульное тестирование - относится более к "белому ящику" на уровне unittest, т.е тестирование одного "модуля" в сервисе (системе).
      Изоляция же позволяет тестировать полностью сервис (не модуль с системе) как "черный ящик".
      В целом терминология очень близка, но применяется для разного


  1. BigLY
    24.05.2023 05:03

    При написании тестов на Python в библиотеке unittest есть реализация mock-объекта, разработчик может создать mock-объект для условного requests.get, это позволит не поднимать сторонние сервисы, уменьшит время на поддержание актуального состояния mock-сервиса и даст возможность писать реализацию в коде)


    1. akuz0 Автор
      24.05.2023 05:03

      Спасибо за комментарий, это действительно так :)
      В следующей статье постараюсь раскрыть пользу разных подходов. У нас разработчики использую mockito, но знаю команды и компании в которых использую реализацию на уровне отдельного сервиса и это не с проста