Что такое контрактное тестирование (Contract Testing)?

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

Ответ

Контрактное тестирование (Contract Testing) — это методология тестирования на уровне интеграции, которая проверяет, что взаимодействие между двумя системами (например, клиентом и сервером, потребителем и поставщиком) соответствует совместно определённому «контракту». Цель — выявить breaking changes в API до развёртывания, особенно в микросервисной архитектуре.

Ключевые концепции:

  • Потребитель (Consumer): Сервис, который вызывает API другого сервиса.
  • Поставщик (Provider): Сервис, который предоставляет API.
  • Контракт (Contract): Машиночитаемая спецификация ожидаемых запросов и ответов (формат, заголовки, статус-коды, схема тела).

Как это работает (на примере Pact):

  1. Потребитель определяет ожидания: В своих тестах потребитель описывает, какие запросы он будет отправлять и какие ответы ожидать.
    // Пример контракта в Pact (JavaScript)
    await provider.addInteraction({
    state: 'a product with ID 10 exists',
    uponReceiving: 'a request to get product by ID',
    withRequest: {
    method: 'GET',
    path: '/products/10'
    },
    willRespondWith: {
    status: 200,
    headers: { 'Content-Type': 'application/json' },
    body: {
      id: 10,
      name: 'Laptop',
      price: 999.99
    }
    }
    });
    // Тест потребителя выполняется против mock-сервера Pact
  2. Генерация и публикация контракта: Pact генерирует файл контракта (JSON) и публикует его в брокере.
  3. Провайдер проверяет контракт: Поставщик загружает контракт и проверяет, что его реальный API удовлетворяет всем ожиданиям потребителя.

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

  • Раннее обнаружение проблем: Несовместимости обнаруживаются на этапе CI/CD, а не в production.
  • Независимость команд: Команды потребителя и поставщика могут работать независимо, сверяясь с контрактом.
  • Быстрые и надёжные тесты: Заменяют хрупкие интеграционные тесты, зависящие от развёрнутых сред.