Какие особенности тестирования монолита и микросервисов, их преимущества и недостатки
Что проверяют
Понимаете ли вы, что пирамида тестов смещается, и знаете ли про контрактное тестирование.
Как отвечать
Монолит. Всё в одном приложении и обычно в одной базе.
Плюсы для тестирования: стенд поднимается целиком одной командой, сквозной сценарий проверяется без заглушек, транзакции настоящие, отладка простая, потому что стек вызовов один.
Минусы: любое изменение потенциально задевает всё, поэтому регрессия долгая, а прогон полного набора занимает часы. Выкатка идёт целиком, значит и проверять надо целиком.
Микросервисы. Каждый сервис со своей базой и своим циклом выпуска.
Плюсы: сервис тестируется и выкатывается независимо, обратная связь быстрая, отказ одного не обязательно ломает остальные, и это отдельно проверяемое свойство.
Минусы, и их больше:
- сквозной сценарий проходит через несколько сервисов. Поднять их все дорого, а поддерживать такой стенд ещё дороже. Отсюда правило: сквозных тестов должно быть мало, только критичные пути;
- согласованность в конечном счёте: результат появляется не сразу, и тест не может просто проверить состояние сразу после действия. Нужны ожидания с условием, а это источник нестабильности;
- тестовые данные размазаны по нескольким базам, подготовка усложняется;
- отладка требует распределённой трассировки, иначе непонятно, на каком участке потерялся запрос.
Ключевой ответ на эти минусы это контрактное тестирование: потребитель описывает свои ожидания к API, поставщик проверяет их у себя на сборке. Так совместимость проверяется без поднятия обеих систем сразу, и большая часть интеграционных сквозных тестов становится не нужна.
Плюс появляются проверки, которых в монолите не было: поведение при недоступности соседа, идемпотентность обработчиков, обратная совместимость версий API.
Где спотыкаются
Переносят подход монолита и строят гору сквозных тестов.
Не знают про контрактное тестирование.
Проверяют результат сразу после действия при асинхронной обработке.
Не тестируют поведение при отказе зависимости.