Тестирование API на JavaScript и 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 (мини‑методология)
- Изучите спецификацию (OpenAPI/Swagger, README, документацию).
- Составьте контрольный список эндпойнтов (операции CRUD, параметры query/path/body).
- Напишите базовые жизненно важные тесты: статус, схема, позитивные/негативные сценарии.
- Добавьте тесты безопасности: авторизация, проверка прав доступа.
- Проверьте нагрузочные и граничные сценарии (по потребности).
- Интегрируйте тесты в 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('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))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)Извлечение цен в цикле:
import requests
data = requests.get('https://fakestoreapi.com/products')
myData = data.json()
for item in myData:
print(item["price"])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).
Примеры тестовых сценариев (приёмоиспытания)
- GET /products — ожидается HTTP 200 и массив объектов с полями id, title, price.
- GET /products/99999 — ожидается 404 Not Found и тело с ошибкой.
- POST /products с корректным payload — ожидается 201 и возвращённый объект с новым id.
- POST /products с отсутствующим обязательным полем — 400 Bad Request.
- PUT /products/:id с валидными данными — 200 и обновлённый объект.
- 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
- Инкапсулируйте тестовые данные и окружение (docker-compose/staging).
- Запускайте базовые smoke‑тесты при каждом pull request.
- Запускайте полный стек тестов (интеграционные, нагрузочные) в nightly/рейте.
- Публикуйте отчёты и метрики (покрытие, время ответа, процент ошибок).
Резюме
- API‑тестирование — обязательный этап перед интеграцией внешнего сервиса.
- Базовые проверки: статусы, схема ответа, позитивные/негативные сценарии, авторизация.
- Примеры на JavaScript (fetch) и Python (requests) показывают стандартные CRUD‑операции.
- Включите тесты в CI и не забывайте про безопасность и лимиты.
Ключевые шаги: изучите документацию, запишите тестовые сценарии, автоматизируйте и мониторьте поведение API в рабочем окружении.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone