TL;DR

  • API тестирование: Тестирование интерфейсов приложения напрямую, без UI
  • Почему важно: Быстрее, ловит баги раньше, тестирует бизнес-логику напрямую
  • Типы: Функциональное, performance, security, contract тестирование
  • Популярные инструменты: Postman, REST Assured, SuperTest, k6
  • Лучшая практика: Тестируй API до создания UI
  • ROI: API тесты работают в 10-100x быстрее UI тестов

Время чтения: 12 минут

API тестирование необходимо для современной разработки. С микросервисной архитектурой и API-first подходами, тестирование на уровне API ловит баги быстрее и надёжнее чем только UI тестирование.

Что такое API Тестирование?

API тестирование проверяет что программные интерфейсы (API) работают корректно. Вместо тестирования через UI, ты отправляешь запросы напрямую к endpoints и проверяешь ответы.

Традиционное UI тестирование:
Браузер → Клики по кнопкам → Ожидание страниц → Проверка UI

API тестирование:
HTTP запрос → Endpoint → Ответ → Проверка данных

API тестирование быстрее, стабильнее и ловит проблемы на уровне бизнес-логики.

Почему API Тестирование Важно

1. Тестируй Раньше

API готовы до UI. Начинай тестировать сразу.

Таймлайн разработки:
Неделя 1: Backend API готовы ← Начни API тестирование
Неделя 3: Frontend разработка
Неделя 5: UI тестирование возможно

2. Быстрее Выполнение

API тесты работают значительно быстрее:

Тип тестаВремя выполнения
UI тест5-30 секунд
API тест50-500 миллисекунд
Преимуществов 10-100x быстрее

3. Надёжнее

Нет браузерных несоответствий, нет проблем с рендерингом UI, нет проблем тайминга с анимациями.

4. Лучше Покрытие

Тестируй edge cases, которые сложно достичь через UI:

  • Error responses
  • Граничные условия
  • Обработка невалидных данных

Типы API Тестирования

Функциональное Тестирование

Проверь что API делает то что должен:

// Тест: GET /users возвращает список пользователей
const response = await fetch('/api/users');
const users = await response.json();

expect(response.status).toBe(200);
expect(users).toBeArray();
expect(users[0]).toHaveProperty('id');
expect(users[0]).toHaveProperty('name');

Тестирование Валидации

Проверь что валидация данных работает:

// Тест: POST /users отклоняет невалидный email
const response = await fetch('/api/users', {
  method: 'POST',
  body: JSON.stringify({ email: 'invalid-email' })
});

expect(response.status).toBe(400);
expect(await response.json()).toHaveProperty('error');

Performance Тестирование

Проверь что API выдерживает нагрузку:

// k6 load test
import http from 'k6/http';

export const options = {
  vus: 100,  // 100 виртуальных пользователей
  duration: '30s',
};

export default function () {
  http.get('https://api.example.com/users');
}

Security Тестирование

Проверь аутентификацию и авторизацию:

// Тест: Защищённый endpoint требует auth
const response = await fetch('/api/admin/users');
expect(response.status).toBe(401);

// Тест: Валидный токен даёт доступ
const authResponse = await fetch('/api/admin/users', {
  headers: { 'Authorization': 'Bearer valid-token' }
});
expect(authResponse.status).toBe(200);

Contract Тестирование

Проверь что API соответствует спецификации:

# OpenAPI контракт
/users:
  get:
    responses:
      200:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/User'

HTTP Методы и Тестирование

GET Запросы

// Получение данных
const response = await fetch('/api/users/123');

// Проверки
expect(response.status).toBe(200);
expect(response.headers.get('content-type')).toContain('application/json');

POST Запросы

// Создание данных
const response = await fetch('/api/users', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    name: 'John Doe',
    email: 'john@example.com'
  })
});

expect(response.status).toBe(201);
expect(await response.json()).toHaveProperty('id');

PUT/PATCH Запросы

// Обновление данных
const response = await fetch('/api/users/123', {
  method: 'PUT',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: 'Jane Doe' })
});

expect(response.status).toBe(200);

DELETE Запросы

// Удаление данных
const response = await fetch('/api/users/123', {
  method: 'DELETE'
});

expect(response.status).toBe(204);

Что Тестировать

Коды Ответов

КодЗначениеСценарий
200OKУспешный GET/PUT
201CreatedУспешный POST
204No ContentУспешный DELETE
400Bad RequestНевалидный ввод
401UnauthorizedОтсутствует/невалидный auth
403ForbiddenНедостаточно прав
404Not FoundРесурс не существует
500Server ErrorВнутренние ошибки

Заголовки Ответа

expect(response.headers.get('content-type')).toBe('application/json');
expect(response.headers.get('cache-control')).toBeDefined();

Тело Ответа

const data = await response.json();

// Структура
expect(data).toHaveProperty('id');
expect(data).toHaveProperty('createdAt');

// Типы данных
expect(typeof data.id).toBe('number');
expect(typeof data.name).toBe('string');

// Значения
expect(data.status).toBe('active');

Время Ответа

const start = Date.now();
await fetch('/api/users');
const duration = Date.now() - start;

expect(duration).toBeLessThan(500); // Менее 500мс

Инструменты API Тестирования

Ручное Тестирование

Postman

  • GUI-based API клиент
  • Организация коллекций
  • Environment переменные
  • Pre-request скрипты

Insomnia

  • Чистый интерфейс
  • Поддержка GraphQL
  • Система плагинов

Автоматизированное Тестирование

REST Assured (Java)

given()
    .contentType("application/json")
    .body(user)
.when()
    .post("/api/users")
.then()
    .statusCode(201)
    .body("id", notNullValue());

SuperTest (JavaScript)

const request = require('supertest');
const app = require('./app');

describe('Users API', () => {
  it('creates user', async () => {
    const response = await request(app)
      .post('/api/users')
      .send({ name: 'John' })
      .expect(201);

    expect(response.body.id).toBeDefined();
  });
});

Pytest + Requests (Python)

import requests

def test_create_user():
    response = requests.post(
        'http://api.example.com/users',
        json={'name': 'John'}
    )
    assert response.status_code == 201
    assert 'id' in response.json()

Лучшие Практики

1. Независимость Тестов

Каждый тест должен быть независимым:

// Хорошо: Самодостаточный тест
it('deletes user', async () => {
  // Создание тестовых данных
  const user = await createUser({ name: 'Test' });

  // Тест удаления
  await request(app)
    .delete(`/api/users/${user.id}`)
    .expect(204);

  // Проверка удаления
  await request(app)
    .get(`/api/users/${user.id}`)
    .expect(404);
});

2. Используй Test Data Factories

const createTestUser = (overrides = {}) => ({
  name: 'Test User',
  email: `test-${Date.now()}@example.com`,
  ...overrides
});

3. Тестируй Error Сценарии

describe('Error handling', () => {
  it('returns 404 for non-existent user', async () => {
    await request(app)
      .get('/api/users/99999')
      .expect(404);
  });

  it('returns 400 for invalid input', async () => {
    await request(app)
      .post('/api/users')
      .send({ email: 'invalid' })
      .expect(400);
  });
});

FAQ

Что такое API тестирование?

API тестирование проверяет что программные интерфейсы работают корректно. Вместо тестирования через UI, ты отправляешь HTTP запросы напрямую к endpoints и проверяешь ответы. Это тестирует функциональность, валидацию данных, обработку ошибок, производительность и безопасность на уровне API, независимо от frontend.

Почему API тестирование важно?

API тестирование ловит баги раньше в разработке (API готовы до UI), работает в 10-100x быстрее чем UI тесты, даёт более надёжные результаты (нет браузерных несоответствий) и предлагает лучшее покрытие бизнес-логики. С микросервисной архитектурой, API тестирование необходимо для валидации взаимодействий сервисов.

Какие инструменты используются для API тестирования?

Для ручного тестирования: Postman, Insomnia. Для автоматизации: REST Assured (Java), SuperTest (JavaScript), Pytest с Requests (Python). Для performance: k6, JMeter, Gatling. Для contract тестирования: Pact, Dredd. Выбирай исходя из tech stack и потребностей тестирования.

В чём разница между API и unit тестированием?

Unit тестирование тестирует отдельные функции/методы в изоляции, часто с замоканными зависимостями. API тестирование тестирует полные endpoints, включая роутинг, middleware, валидацию, работу с БД и форматирование ответа. Unit тесты меньше и быстрее; API тесты валидируют полный цикл запрос-ответ.

Смотрите также