В проектах, связанных с разработкой микросервисной архитектуры, CI/CD переходит из разряда приятной возможности в категорию острой необходимости. Автоматическое тестирование является неотъемлемой частью непрерывной интеграции, грамотный подход к которой способен подарить команде множество приятных вечеров с семьёй и друзьями. В противном же случае, проект рискует быть никогда не завершенным.
Можно покрыть весь код микросервиса юнит-тестами с мок-объектами, но это лишь частично решает задачу и оставляет множество вопросов и сложностей, особенно при тестировании работы с данными. Как всегда, наиболее острые – тестирование консистентности данных в реляционной БД, тестирование работы с облачными сервисами и неверные предположения при написании мок-объектов.
Все это и немного больше решается тестированием целого микросервиса в Docker-контейнере. Несомненным преимуществом для обеспечения валидности тестов является то, что тестам подвергаются те же самые Docker-образы, что идут в продакшен.
Автоматизация такого подхода представляет ряд проблем, решение которых будет описано чуть ниже:
- конфликты параллельных задач в одном докер-хосте;
- конфликты идентификаторов в БД при итерациях теста;
- ожидание готовности микросервисов;
- объединение и вывод логов во внешние системы;
- тестирование исходящих HTTP-запросов;
- тестирование веб-сокетов (с помощью SignalR);
- тестирование аутентификации и авторизации OAuth.
Это статья по мотивам моего выступления на SECR 2019. Так что для тех, кому лень читать, вот запись выступления.
