Гид по технологиям

Тестирование API на JavaScript и Python

6 min read Тестирование Обновлено 13 Dec 2025
Тестирование API: примеры на JS и Python
Тестирование API: примеры на JS и Python

Редактор кода с блоками кода

API — мост между приложениями. Правильная оценка API до того, как вы начнёте строить на нём продукт, экономит время и снижает риски. В этой статье мы переведём общие понятия тестирования API в практику: как проверять доступность, корректность ответов, работу CRUD‑операций и основные аспекты безопасности с примерами кода.

Важно: примеры используют публичную демонстрационную службу Fake Store API (https://fakestoreapi.com) и служат для обучения. В реальном проекте уточняйте спецификацию и требования безопасности у владельца API.

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

API‑тестирование — это проверка интерфейса: функциональности, корректности входных/выходных данных, статусов ответа, производительности, безопасности и поведения при ошибках. Ключевая идея — убедиться, что при разных типах запросов API отвечает ожидаемо и надёжно.

Краткое определение: API‑тест проверяет отдельные вызовы (эндпойнты) и их ответы по статусам, структуре и содержимому.

Что обычно проверяют:

  • Наличие и корректность HTTP‑статусов (200, 201, 400, 401, 403, 404, 500 и т. д.).
  • Структура и схема тела ответа (JSON, XML, multipart).
  • Валидация полей: типы, обязательные поля, границы значений.
  • Авторизация и права доступа (токены, роли).
  • Ограничения по скорости и лимиты (rate limiting).
  • Устойчивость к ошибочным/злонамеренным данным.

Однострочное объяснение термина: REST API — это набор URL/методов, по которым клиент отправляет HTTP‑запросы и получает ответы в стандартах HTTP.

Универсальная методика тестирования API (мини‑методология)

  1. Изучите спецификацию (OpenAPI/Swagger, README, документацию).
  2. Составьте контрольный список эндпойнтов (операции CRUD, параметры query/path/body).
  3. Напишите базовые жизненно важные тесты: статус, схема, позитивные/негативные сценарии.
  4. Добавьте тесты безопасности: авторизация, проверка прав доступа.
  5. Проверьте нагрузочные и граничные сценарии (по потребности).
  6. Интегрируйте тесты в CI, оформите отчётность и критерии приёмки.

Форматы полезных ответов

  • JSON — наиболее распространённый.
  • XML — иногда используется; требует парсинга.
  • multipart/form-data — для файлов.
  • text/html — редко для API, чаще для страниц.

Теперь — практические примеры для CRUD‑операций.

Как тестировать API с помощью JavaScript (fetch)

Примеры ниже используют fetch в среде Node.js или браузере. Для Node.js может потребоваться полифил (node‑fetch) или использовать Axios.

Проверка GET‑эндоинта (JavaScript)

Простейшая проверка статуса ответа:

fetch('https://fakestoreapi.com/products')
  .then(res => {
    console.log(res)
  })
  .catch(err => console.log(err))

Проверка и получение тела ответа JSON:

fetch('https://fakestoreapi.com/products')
  .then(res => {
    if (res.ok) {
      return res.json()
    }
    throw new Error('Bad response: ' + res.status)
  })
  .then(response => {
    console.log(response)
  })
  .catch(err => console.log(err))

Скриншот ответа fetch при GET-запросе

Извлечение конкретных полей (например, всех цен):

fetch('https://fakestoreapi.com/products')
  .then(res => {
    if (res.ok) return res.json()
    throw new Error(res.status)
  })
  .then(response => {
    response.map(item => {
      console.log(item.price)
    })
  })
  .catch(err => console.log(err))

Скриншот с выводом цен продуктов (JavaScript)

POST (создание ресурса) в JavaScript

POST‑запрос содержит тело (payload). Обязательно указывайте Content‑Type и сериализуйте JSON:

// Указываем payload
let payload = {
  title: 'new product',
  price: 13.5,
  description: 'test description',
  image: '',
  category: 'electronic'
}

fetch('https://fakestoreapi.com/products', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(payload)
})
  .then(res => {
    if (res.ok) {
      console.log(res.status)
      return res.json()
    }
    throw new Error('Bad status: ' + res.status)
  })
  .then(response => console.log(response))
  .catch(err => console.log(err))

Ответ сервера даст код статуса и объект созданного ресурса. В реальной API 201 Created — ожидаемый код для создания.

PUT (обновление) и DELETE (удаление) в JavaScript

Обновление:

let payload = {
  title: 'new product',
  price: 13.5,
  description: 'test description',
  image: '',
  category: 'electronic'
}

fetch('https://fakestoreapi.com/products/19', {
  method: 'PUT',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(payload)
})
  .then(res => {
    if (res.ok) return res.json()
    throw new Error(res.status)
  })
  .then(response => console.log(response))
  .catch(err => console.log(err))

Удаление:

fetch('https://fakestoreapi.com/products/19', {
  method: 'DELETE',
  headers: { 'Content-Type': 'application/json' }
})
  .then(res => {
    if (res.ok) return res.json()
    throw new Error(res.status)
  })
  .then(response => console.log(response))
  .catch(err => console.log(err))

Как тестировать API с помощью Python (requests)

Библиотека requests проста и удобна для скриптов. Ниже — те же операции, что и в JavaScript.

GET в Python

import requests

data = requests.get('https://fakestoreapi.com/products')
print(data.status_code)

Получение JSON:

import requests

data = requests.get('https://fakestoreapi.com/products')
myData = data.json()
print(myData)

Скриншот с ответом API в Python

Извлечение цен в цикле:

import requests

data = requests.get('https://fakestoreapi.com/products')
myData = data.json()
for item in myData:
    print(item["price"])

Скриншот с выводом цен продуктов (Python)

POST в Python

import requests

payload = {
  'title': 'new product',
  'price': 13.5,
  'description': 'test description',
  'image': '',
  'category': 'electronic'
}

posted = requests.post('https://fakestoreapi.com/products', data=payload)
print(posted.status_code)
print(posted.json())

Примечание: некоторые API ожидают JSON в теле; в requests это можно передать через json=payload вместо data=payload.

PUT и DELETE в Python

Обновление:

import requests

payload = {
  'title': 'new product',
  'price': 13.5,
  'description': 'test description',
  'image': '',
  'category': 'electronic'
}

resp = requests.put('https://fakestoreapi.com/products/19', data=payload)
print(resp.status_code)
print(resp.json())

Удаление:

import requests

resp = requests.delete('https://fakestoreapi.com/products/19')
print(resp.status_code)
print(resp.json())

Чек‑лист качества API (быстрый)

  • Документация: эндпойнты, методы, параметры, примеры ответов.
  • Статусы: соответствие стандартам HTTP для каждого действия.
  • Схема: проверка типов и обязательных полей (JSON Schema).
  • Ошибки: понятные сообщения и коды ошибок.
  • Авторизация: токены, роли, ограничения доступа.
  • Производительность: ответ в приемлемом времени, пиковые тесты.
  • Лимиты: поведение при превышении rate limit.
  • Безопасность: HTTPS, CORS, защита от SQL/NoSQL инъекций и т. п.

Критерии приёмки

  • Базовый набор CRUD‑эндпойнтов отвечает корректными HTTP‑статусами и возвращает ожидаемую структуру в теле.
  • Негативные сценарии возвращают предсказуемые коды ошибок и понятные сообщения.
  • В API реализована авторизация для защищённых ресурсов; без токена доступ запрещён.
  • Логика версии API не ломает существующие клиенты (если применяется versioning).

Примеры тестовых сценариев (приёмоиспытания)

  1. GET /products — ожидается HTTP 200 и массив объектов с полями id, title, price.
  2. GET /products/99999 — ожидается 404 Not Found и тело с ошибкой.
  3. POST /products с корректным payload — ожидается 201 и возвращённый объект с новым id.
  4. POST /products с отсутствующим обязательным полем — 400 Bad Request.
  5. PUT /products/:id с валидными данными — 200 и обновлённый объект.
  6. DELETE /products/:id — 200 или 204 в зависимости от спецификации и отсутствие ресурса при повторном запросе.

Критерии приёмки для каждого сценария: статус, соответствие JSON Schema и время отклика < допустимого SLA.

Роли и обязанности (короткий чек‑лист)

  • Разработчик API: предоставляет документацию, поддерживает совместимость версий.
  • QA инженер: пишет автоматические тесты, сценарии негативного ввода, интеграционные тесты.
  • DevOps/CI: запускает тесты в пайплайне, обеспечивает окружения для тестирования.
  • Безопасник: проверяет авторизацию, токен‑менеджмент, уязвимости.

Когда описанные методы не подходят (контрпримеры)

  • SOAP‑сервисы с wsdl требуют других инструментов (например, Zeep для Python).
  • Асинхронные очереди и событие‑ориентированные интерфейсы тестируются иначе (Kafka, WebSocket).
  • Для сложных сценариев с несколькими шагами (транзакции) нужно писать интеграционные тесты, а не единичные вызовы.

Альтернативные инструменты

  • Postman / Insomnia — удобны для ручного тестирования и автоматизации коллекций.
  • curl — быстрые проверки из терминала.
  • Newman — запуск коллекций Postman в CI.
  • JMeter / k6 — нагрузочное тестирование.
  • Pact — контрактное тестирование для микросервисов.

Безопасность и приватность — базовые рекомендации

  • Всегда используйте HTTPS для передачи данных и токенов.
  • Храните токены и секреты в защищённых хранилищах (Vault, секреты CI).
  • Проверяйте права доступа: роль не должна иметь больше привилегий, чем нужно.
  • Ограничьте логирование чувствительных данных (пароли, номера карт).
  • Обрабатывайте и валидируйте входные данные на стороне сервера.

Важно: если API обрабатывает персональные данные пользователей (PII), проверьте требования локального законодательства и GDPR‑соответствие, например сроки хранения и доступы.

Примерную схему выбора инструмента для тестирования (decision tree)

flowchart TD
  A[Нужны ручные проверки?] -->|Да| B[Postman/Insomnia]
  A -->|Нет, автоматизация| C[CI + скрипты]
  C --> D{Нагрузочные тесты?}
  D -->|Да| E[k6/JMeter]
  D -->|Нет| F[unit/integration tests на Python/JS]
  B --> G[Экспорт коллекции -> Newman в CI]
  F --> H[requests / fetch / axios + assertion lib]

Отказоустойчивость и граничные случаи

  • Тестируйте поведение при плохом соединении (таймауты).
  • Имейте сценарии повторных запросов (retries) с экспоненциальной задержкой.
  • Проверьте атомарность обновлений, если API поддерживает транзакции.

Шаблон простого теста в pytest (пример)

import requests

BASE = 'https://fakestoreapi.com'

def test_get_products_status():
    r = requests.get(f"{BASE}/products")
    assert r.status_code == 200
    data = r.json()
    assert isinstance(data, list)
    if data:
        assert 'price' in data[0]

Короткое руководство по внедрению тестов в CI

  1. Инкапсулируйте тестовые данные и окружение (docker-compose/staging).
  2. Запускайте базовые smoke‑тесты при каждом pull request.
  3. Запускайте полный стек тестов (интеграционные, нагрузочные) в nightly/рейте.
  4. Публикуйте отчёты и метрики (покрытие, время ответа, процент ошибок).

Резюме

  • API‑тестирование — обязательный этап перед интеграцией внешнего сервиса.
  • Базовые проверки: статусы, схема ответа, позитивные/негативные сценарии, авторизация.
  • Примеры на JavaScript (fetch) и Python (requests) показывают стандартные CRUD‑операции.
  • Включите тесты в CI и не забывайте про безопасность и лимиты.

Ключевые шаги: изучите документацию, запишите тестовые сценарии, автоматизируйте и мониторьте поведение API в рабочем окружении.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство