Вернуться к статьям

Автоматизация тестирования REST API с помощью Python и pytest: пошаговый гид

Программирование 14.02.2026 5 просмотров

Ключевые слова

python pytest автотесты тестирование REST API автоматизация requests API-тесты практики CI/CD фикстуры тестовые данные
Автоматизация тестирования REST API с помощью Python и pytest: пошаговый гид

В разработке современных приложений REST API — это связующее звено между клиентскими и серверными компонентами. Надёжность и предсказуемость API-контрактов становится критически важной: поломка одного из методов может нарушить работу целого продукта. Автоматизированное тестирование API позволяет быстро выявлять ошибки и быть уверенным в качестве ПО. В этой статье рассмотрим, как организовать эффективное тестирование REST API с помощью Python и pytest, начиная с нуля.

Старт: Подготовка окружения и структуры проекта

Первый шаг — подготовить всё для написания тестов. Используем минимальный набор инструментов:

  • Python 3.7+
  • pytest — популярный фреймворк для автотестов
  • requests — для работы с HTTP-запросами

Установка зависимостей

pip install pytest requests

Рекомендовано вести тесты в отдельной директории, например, tests/. Для конфигурации часто создают файл conftest.py с общими фикстурами.

Пишем простейшие тесты: GET, POST и обработка ответов

Тестирование начинается с ручного запроса к API. Пусть у нас есть эндпоинт GET /users и POST /users для получения и создания пользователей. Пример простого теста на pytest:

import requests

def test_get_users():
    response = requests.get('https://api.example.com/users')
    assert response.status_code == 200
    data = response.json()
    assert isinstance(data, list)

Что важно проверять:

  • Статус-код ответа (200, 201, 404 и т. д.)
  • Тип и структуру данных
  • Ключевые поля json ответа

Пример теста на создание пользователя (POST):

def test_create_user():
    payload = {"name": "Alice", "email": "alice@example.com"}
    response = requests.post('https://api.example.com/users', json=payload)
    assert response.status_code == 201
    user = response.json()
    assert user["name"] == "Alice"
    assert "id" in user

Фикстуры pytest: организация чистоты, переиспользование, подготовка данных

Фикстуры — мощный механизм pytest, который позволяет вынести подготовку, очистку или инициализацию данных в отдельные функции, переиспользовать их в разных тестах.

Пример фикстуры для базового URL:

import pytest

@pytest.fixture
def api_url():
    return "https://api.example.com"

Фикстуры можно использовать как аргументы тестовых функций:

def test_get_users(api_url):
    response = requests.get(f"{api_url}/users")
    assert response.status_code == 200

Фикстуры для подготовки тестовых данных:

@pytest.fixture
def new_user(api_url):
    payload = {"name": "Bob", "email": "bob@example.com"}
    response = requests.post(f"{api_url}/users", json=payload)
    data = response.json()
    yield data
    # Чистим данные после теста
    requests.delete(f"{api_url}/users/{data['id']}")

Теперь в тесте можно создавать пользователя один раз и быть уверенным в чистоте окружения.

Параметризация и сложные проверки

Часто нужно проверить несколько вариантов входных данных. Для этого используем @pytest.mark.parametrize.

import pytest

@pytest.mark.parametrize("name,email", [
    ("Alice", "alice@example.com"),
    ("Bob", "bob@example.com")
])
def test_create_user_param(api_url, name, email):
    payload = {"name": name, "email": email}
    response = requests.post(f"{api_url}/users", json=payload)
    assert response.status_code == 201

Полезно валидировать не только структуру, но и данные, например, что email действительно записан.

Проверки ошибок и негативных сценариев

  • Тестируем отправку невалидных данных (например, пустой email).
  • Проверяем реакцию API на попытку запроса несуществующего ресурса.
def test_create_user_invalid_email(api_url):
    payload = {"name": "Eve", "email": "not-an-email"}
    response = requests.post(f"{api_url}/users", json=payload)
    assert response.status_code == 400
    data = response.json()
    assert "error" in data

Запуск, отчёты, интеграция в CI/CD

Запустить тесты просто:

pytest tests/

Для получения отчётов используйте опцию -v (подробный вывод) или подключите плагин pytest-html для генерации отчётов в виде HTML:

pip install pytest-html
pytest --html=report.html

Рекомендуется интегрировать запуск тестов в CI/CD (например, через GitHub Actions или GitLab CI) — это позволит ловить ошибки ещё до деплоя на продакшн.

Заключение

Автоматизация тестирования REST API с помощью Python и pytest — простой и результативный способ повысить надёжность вашего приложения. Используйте фикстуры для чистоты и переиспользуемости, параметризацию для проверки разных сценариев и не забывайте интегрировать тесты в процессы CI/CD. Чем раньше вы внедрите автотесты — тем проще будет масштабировать и поддерживать ваш продукт.