Каков ваш подход к тестированию веб-сервиса (API)?

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

Ответ

Тестирование веб-сервисов строится по многоуровневой стратегии:

1. Контрактное тестирование (Contract Testing):

// Пример с использованием Pact
const provider = new Pact({
  consumer: 'FrontendApp',
  provider: 'UserService',
});

await provider.addInteraction({
  state: 'user exists',
  uponReceiving: 'request for user',
  withRequest: {
    method: 'GET',
    path: '/users/123',
  },
  willRespondWith: {
    status: 200,
    headers: { 'Content-Type': 'application/json' },
    body: {
      id: Matchers.integer(123),
      name: Matchers.string('John'),
    },
  },
});

2. Функциональное тестирование API:

import pytest
import requests
from jsonschema import validate

# JSON Schema для валидации ответов
USER_SCHEMA = {
    "type": "object",
    "properties": {
        "id": {"type": "integer"},
        "email": {"type": "string", "format": "email"},
        "created_at": {"type": "string", "format": "date-time"}
    },
    "required": ["id", "email"]
}

def test_user_api():
    # Позитивный сценарий
    response = requests.get(f"{BASE_URL}/users/1")
    assert response.status_code == 200

    # Валидация схемы
    data = response.json()
    validate(instance=data, schema=USER_SCHEMA)

    # Негативный сценарий
    response = requests.get(f"{BASE_URL}/users/99999")
    assert response.status_code == 404

3. Тестирование граничных значений и ошибок:

  • Rate limiting – проверка ограничений на количество запросов
  • Валидация входных данных – неверные типы, отсутствующие поля
  • Пагинация – корректность работы limit/offset
  • Сортировка и фильтрация – complex query parameters

4. Тестирование безопасности:

  • Authentication/Authorization – JWT, OAuth2 токены
  • SQL/NoSQL injection – попытки инъекций в параметры
  • Mass Assignment – защита от перезаписи полей
  • CORS – корректная настройка cross-origin запросов

5. Нагрузочное тестирование:

# Пример с k6
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 50 },   // Наращивание нагрузки
    { duration: '1m', target: 100 },   // Пиковая нагрузка
    { duration: '30s', target: 0 },    // Снижение
  ],
};

export default function () {
  const res = http.get('https://api.example.com/users');
  check(res, {
    'status is 200': (r) => r.status === 200,
    'response time < 500ms': (r) => r.timings.duration < 500,
  });
  sleep(1);
}

6. Мониторинг в production:

  • Метрики latency, error rate, throughput
  • Алерт при деградации 95-го перцентиля
  • Tracing распределенных транзакций