Раскрытие различий между контрактным тестированием и тестированием API: подробное руководство

В мире разработки программного обеспечения и обеспечения качества тестирование является важнейшим аспектом обеспечения надежности и функциональности приложений. В этой области часто встречаются два термина: «Контрактное тестирование» и «Тестирование API». Хотя на первый взгляд они могут показаться похожими, они служат разным целям и используют разные методологии. В этой статье блога мы раскроем тайну этих двух подходов к тестированию, предоставим примеры кода и обсудим различные методы, связанные с каждым из них. Итак, пристегнитесь и приступим!

Понимание тестирования API.
Тестирование API (интерфейса прикладного программирования) — это широко известный метод, используемый для проверки поведения и функциональности API. Он включает отправку запросов к конечным точкам API и проверку ответов на предмет соответствия ожидаемым критериям. Тестирование API обычно выполняется следующими методами:

  1. Модульное тестирование. Этот метод фокусируется на изолированном тестировании отдельных компонентов API, таких как функции или методы. Он проверяет правильность кода на детальном уровне.

Пример (Python):

def test_get_user():
    response = requests.get('https://api.example.com/users/1')
    assert response.status_code == 200
    assert response.json()['id'] == 1
  1. Интеграционное тестирование. Интеграционные тесты проверяют взаимодействие между различными компонентами API, обеспечивая их слаженную работу. Он проверяет, правильно ли работают несколько API при интеграции.

Пример (JavaScript – использование платформы Jest):

test('POST /users creates a new user', async () => {
  const response = await axios.post('https://api.example.com/users', { name: 'John Doe' });
  expect(response.status).toBe(201);
  expect(response.data.name).toBe('John Doe');
});

Понимание тестирования контракта.
С другой стороны, тестирование контракта фокусируется на тестировании контракта или соглашения между двумя взаимодействующими сторонами, обычно между поставщиком услуг (производителем API) и потребителем услуги (потребителем API). Он проверяет соблюдение обеими сторонами согласованного контракта. Вот несколько методов, связанных с тестированием контрактов:

  1. Тестирование контрактов, управляемое потребителем. В этом подходе потребитель API определяет ожидаемый контракт, включая форматы запросов и ответов, и передает его поставщику для проверки. Это гарантирует согласие обеих сторон.

Пример (Ruby – использование платформы Pact):

# Consumer-side test
pact = Pact::Consumer::Pact.new(consumer: 'Consumer', provider: 'Provider')
pact.given('a user exists')
  .upon_receiving('a request to get a user')
  .with(method: :get, path: '/users/1')
  .will_respond_with(status: 200, body: { id: 1 })
# Provider-side verification
pact.verify(provider: 'Provider')
  1. Тестирование контракта на стороне поставщика. В этом методе поставщик API определяет контракт, а потребитель проверяет, соответствуют ли его запросы и ответы указанному контракту.

Пример (Java – использование Spring Cloud Contract):

// Provider-side contract
Contract.make {
    request {
        method 'GET'
        url '/users/1'
    }
    response {
        status 200
        body(
            id: 1
        )
    }
}
// Consumer-side verification
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureStubRunner(ids = "com.example:provider:1.0.0:stubs", stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class UserApiClientTest {
    // Test code goes here
}