Введение

Разработка через тестирование (TDD) — это методология разработки программного обеспечения, при которой тесты пишутся до основного кода. Такой подход позволяет сохранить стабильность и работоспособность основного кода при внесении функциональных изменений и рефакторинге, вынуждает разработчика писать более модульный код и упрощает воспроизведение ошибок.

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

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

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

В статье предлагается подход Integration Test Driven Development (ITDD), когда интеграционные тесты нужно писать до основного кода, сразу после того, как будет готова функциональная спецификация.

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

Но если программное обеспечение постоянно развивается, усилия по разработке интеграционных тестов многократно окупаются.

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

Преимущества интеграции через тестирование

Преимущества ITDD примерно такие же, как у TDD.

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

Пример реализации ITDD

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

Основные случаи для тестирования:

  • Корректный ввод данных пользователем: успешная регистрация.
  • Аккаунт с таким логином уже существует: ошибка регистрации.
  • Нарушение политики паролей: ошибка регистрации.
  • Неверный формат учетных данных: ошибка регистрации.

Реакция системы во всех случаях должна быть в спецификации. В противном случае спецификация возвращается аналитику или владельцу продукта. В некоторых случаях реализация зависит от разработчиков.

Организации, участвующие в тестировании:

  • Сервис пользовательского интерфейса
  • Сервис бизнес-логики
  • Реляционная или NoSQL база данных для хранения пользовательских данных
  • Кэшировать базу данных, если требуется
  • Очередь сообщений
  • и т. д.

В качестве примера возьмем первый случай:

Скрипт открывает браузер и проверяет правильность отображения всех элементов. Затем тестовый код вводит тестовые значения в поля пользовательского интерфейса и отправляет данные в службу. Должно появиться сообщение об успешной регистрации.

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

Инструменты для разработки интеграционного теста в таком случае:

  • Докер с тестконтейнерами для тестовой инфраструктуры
  • Selenium для взаимодействия с браузером
  • Драйверы базы данных
  • Клиент очереди сообщений для проверки сообщения
  • и т. д.