Что такое контрактное тестирование в микросервисной архитектуре?

«Что такое контрактное тестирование в микросервисной архитектуре?» — вопрос из категории API тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Контрактное тестирование — это метод проверки взаимодействия между двумя сервисами (потребителем и поставщиком) на основе формального соглашения («контракта») о формате запросов и ответов.

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

Как это работает:

  1. Потребитель (Consumer) определяет ожидаемые запросы к провайдеру и ответы от него. Это формирует «контракт».
  2. Провайдер (Provider) проверяет, что его реальный API соответствует всем контрактам, на которые он подписан.

Пример с использованием фреймворка Pact (JavaScript):

// ТЕСТ ПОТРЕБИТЕЛЯ (Consumer Test) - создает контракт
const { Pact } = require('@pact-foundation/pact');

const provider = new Pact({
  consumer: 'UserService',
  provider: 'AuthService',
});

describe('Auth Service Contract', () => {
  beforeAll(() => provider.setup());

  it('ожидает успешный ответ при запросе токена', async () => {
    await provider.addInteraction({
      state: 'пользователь существует',
      uponReceiving: 'запрос на аутентификацию',
      withRequest: {
        method: 'POST',
        path: '/api/token',
        body: { login: 'test', password: 'pass' },
      },
      willRespondWith: {
        status: 200,
        body: { token: 'jwt-token-123' },
      },
    });
    // Здесь выполняется реальный вызов клиента AuthService
    // и проверяется соответствие контракту
  });

  afterAll(() => provider.finalize());
});

Преимущества:

  • Раннее обнаружение проблем: Интеграционные ошибки выявляются на этапе CI/CD, а не в продакшене.
  • Независимость команд: Команды могут разрабатывать и тестировать свои сервисы автономно.
  • Надежная документация: Контракты служат актуальным источником истины об API.
  • Замена интеграционных тестов: Позволяет отказаться от хрупких сквозных (E2E) тестов для проверки взаимодействия сервисов.