Что проще поддерживать, монолиты или микросервисы?

«Что проще поддерживать, монолиты или микросервисы?» — вопрос из категории Архитектура, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Монолит:

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

Микросервисы:

  • Сложнее в начале: Требуется настройка инфраструктуры (оркестрация, Service Discovery). Для интеграционного тестирования одного сервиса нужно мокать или поднимать все его зависимости (другие сервисы, БД).
  • Гибче при росте: Каждый сервис можно тестировать независимо. Регрессия после изменений затрагивает только один сервис и его контракты (API). Упрощается нагрузочное тестирование конкретных узких мест.

Пример подхода к тестированию микросервиса:

// Пример теста для UserService, который зависит от AuthService
// Используем Mockito для изоляции
@Test
public void getUserProfile_ShouldReturnProfile_WhenUserIsAuthenticated() {
    // 1. Arrange (Подготовка)
    // Мокаем вызов внешнего AuthService
    AuthServiceClient mockAuthClient = Mockito.mock(AuthServiceClient.class);
    Mockito.when(mockAuthClient.validateToken("valid-token")).thenReturn(new UserInfo("user123"));

    // Внедряем мок в тестируемый сервис
    UserService userService = new UserService(mockAuthClient, userRepository);

    // 2. Act (Действие)
    UserProfile profile = userService.getUserProfile("valid-token");

    // 3. Assert (Проверка)
    assertThat(profile.getId()).isEqualTo("user123");
    // Проверяем, что мок был вызван ровно один раз с нужным аргументом
    Mockito.verify(mockAuthClient, times(1)).validateToken("valid-token");
}

Вывод для QA: Выбор архитектуры определяет стратегию тестирования. Для монолита акцент на end-to-end тестах, для микросервисов — на модульных, контрактных и изолированных интеграционных тестах.