JavaRush /Курсы /Модуль 4: FastAPI /Тестирование POST-запросов: проверка отправки данных

Тестирование POST-запросов: проверка отправки данных

Модуль 4: FastAPI
5 уровень , 3 лекция
Открыта

Сложно представить современное веб-приложение без POST-запросов. Создание пользователей, отправка форм, добавление товаров в корзину — всё это завязано на POST-запросах. Поэтому убедиться, что POST-запросы вашего API работают корректно, — важнейшая задача. Сегодня мы поговорим о том, как протестировать эту функциональность в FastAPI с использованием Pytest.

POST-запросы в большинстве случаев связаны с созданием новых объектов. Поэтому важно убедиться, что:

  • Данные, переданные в теле запроса, корректны и проходят валидацию.
  • API возвращает правильный код статуса и ожидаемые данные.
  • Некорректные или отсутствующие данные вызывают ошибки (например, статус 422 или 400).
  • Данные действительно сохраняются (в случае интеграции с базой данных).

Протестируем всё это на примере простого API для управления пользователями. Ваша задача — убедиться, что пользователь создаётся корректно, а при ошибках возвращаются соответствующие HTTP-ответы.


Подготовка данных для POST-запросов

Перед тем как приступить к тестированию, создадим простой эндпоинт для добавления пользователей. Если вы следовали предыдущим лекциям, у вас уже должен быть шаблон проекта FastAPI. Если вдруг нет, вот вам минимальный пример:


from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

# Определяем модель данных для пользователя
class User(BaseModel):
    id: int
    name: str
    email: str

# Хранилище пользователей
users = []

@app.post("/users/")
async def create_user(user: User):
    # Проверяем, существует ли пользователь с таким email
    if any(u.email == user.email for u in users):
        raise HTTPException(status_code=400, detail="Email already exists")
    
    users.append(user)
    return user

Этот эндпоинт:

  1. Принимает на вход данные пользователя в формате JSON с полями id, name и email.
  2. Проверяет, не существует ли пользователя с таким же email.
  3. Добавляет пользователя в список users и возвращает его.

Теперь, когда у нас есть эндпоинт, перейдём к написанию тестов.


Написание тестов для POST-запросов

Начнём с проверки успешной отправки данных. Для этого мы используем TestClient. Убедитесь, что у вас установлен pytest и ваш тестовый файл называется test_main.py (или аналогично).


from fastapi.testclient import TestClient
from main import app  # Импортируем наше приложение

client = TestClient(app)

def test_create_user():
    # Данные для отправки
    data = {
        "id": 1,
        "name": "John Doe",
        "email": "john.doe@example.com"
    }

    # Тестируем POST-запрос
    response = client.post("/users/", json=data)
    
    # Проверяем, что код ответа 200
    assert response.status_code == 200
    
    # Проверяем, что данные в ответе совпадают с отправленными
    assert response.json() == data

В этом тесте мы:

  1. Создали тестовые данные.
  2. Отправили POST-запрос через client.post.
  3. Убедились, что сервер вернул статус 200.
  4. Сравнили данные в ответе с отправленными.

Проверка успешной отправки данных

Теперь усложним тест, добавив проверку на дублирование email. Наш эндпоинт должен возвращать ошибку 400, если пользователь с таким email уже существует.


def test_create_user_duplicate_email():
    # Данные для отправки
    data = {
        "id": 1,
        "name": "Jane Doe",
        "email": "jane.doe@example.com"
    }

    # Первый успешный запрос
    response = client.post("/users/", json=data)
    assert response.status_code == 200
    
    # Второй запрос с тем же email
    response = client.post("/users/", json=data)
    
    # Проверяем, что сервер вернул ошибку 400
    assert response.status_code == 400
    assert response.json() == {"detail": "Email already exists"}

Этот тест показывает, как мы можем проверить обработку ошибок на нашем сервере. Попробуйте дописать тесты для других сценариев, например, для некорректных данных.


Валидация данных в ответе после успешной отправки

Теперь добавим тест, который проверяет, что данные действительно валидируются. Например, если email не передан или имеет неверный формат, сервер должен ответить ошибкой 422 (Unprocessable Entity).


def test_create_user_invalid_data():
    # Данные с некорректным email
    data = {
        "id": 2,
        "name": "Invalid User",
        "email": "not-an-email"
    }

    # Отправляем запрос
    response = client.post("/users/", json=data)
    
    # Проверяем, что сервер вернул ошибку 422
    assert response.status_code == 422
    
    # Проверяем сообщение об ошибке
    assert "value is not a valid email" in response.text

FastAPI автоматически валидирует данные на основе Pydantic-модели, поэтому такие проверки помогают убедиться, что ваша валидация работает как надо.


Советы по написанию тестов для сложных POST-запросов

  1. Используйте фикстуры: для подготовки данных используйте фикстуры Pytest. Это делает тесты более читаемыми и удобными в поддержке.
    
    import pytest
    
    @pytest.fixture
    def user_data():
        return {
            "id": 3,
            "name": "Fixture User",
            "email": "fixture@example.com"
        }
    
    def test_create_user_with_fixture(user_data):
        response = client.post("/users/", json=user_data)
        assert response.status_code == 200
        assert response.json() == user_data
    
  2. Проверяйте граничные значения. Например, если ваш API принимает только определённую длину строки, протестируйте минимальные/максимальные значения.
  3. Логируйте данные для отладки. Если что-то пошло не так, вы всегда можете вывести response.json() или response.status_code, чтобы понять причину.

Реальное применение

На собеседовании вас могут спросить, как протестировать, что отправленный POST-запрос не только возвращает корректные данные, но и вносит изменения в базу данных. Ответ: вы можете использовать тестовую базу (SQLite или другую) и проверять данные напрямую через ORM или raw-запрос.

На практике тестирование POST-запросов помогает выявлять неожиданные ошибки в логике обработки данных, управлении транзакциями или валидации. Чаще всего такие баги всплывают на продакшене, когда пользователи начинают вводить данные из разряда "O_o". Поэтому тесты — это ваше спасение!


Теперь, когда вы научились тестировать POST-запросы, вы готовы к более сложным сценариям: работать с базой данных, мокировать сервисы и даже тестировать аутентификацию. Вперед к новым тестам!

1
Задача
Модуль 4: FastAPI, 5 уровень, 3 лекция
Недоступна
Создание и тестирование простого POST-запроса
Создание и тестирование простого POST-запроса
1
Задача
Модуль 4: FastAPI, 5 уровень, 3 лекция
Недоступна
Проверка обработки ошибок при POST-запросе
Проверка обработки ошибок при POST-запросе
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ