Обработка изменений схемы Pydantic в модульных тестах FastAPIPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Обработка изменений схемы Pydantic в модульных тестах FastAPI

Сообщение Anonymous »

Я разрабатываю производственное приложение с использованием FastAPI, где схемы ответов API часто меняются из-за требований заинтересованных сторон. Приложение близится к выпуску, и у нас есть комплексные модульные тесты.
Наша среда тестирования состоит из:
  • Модульные тесты с использованием pytest
  • Два статических файла:

    Код: Выделить всё

    expected_outputs.json
    : содержит ожидаемые ответы API.
  • Код: Выделить всё

    mock_inputs.json
    : Содержит входные данные теста.
[*]Тесты, которые сравнивают имитируемые ответы клиента FastAPI с ожидаемыми результатами.

Проблема в том, что заинтересованные стороны регулярно запрашивают добавление новых полей в наши ответы API, наши модульные тесты продолжают давать сбои, поскольку ответы JSON больше не соответствуют ожидаемым результатам, определенным в наши тестовые файлы. Хотя мы можем удалить устаревшие схемы, я сомневаюсь, стоит ли поддерживать эти модульные тесты, учитывая постоянно развивающуюся схему.
Вот упрощенная версия нашего текущего подхода к тестированию:

Код: Выделить всё

from pydantic import BaseModel
from fastapi import FastAPI
from typing import Optional

class UserCreate(BaseModel):
username: str
email: str

class User(UserCreate):
id: int

app = FastAPI()

@app.post("/users/", response_model=User)
async def create_user(user: UserCreate):
# Simplified example
return User(id=1, **user.model_dump())

# Original test
def test_create_user(client):
## In our real code we are referring to the objects in the mock_inputs.json
response = client.post("/users/", json={
"username": "john_doe",
"email": "[email protected]"
})
assert response.status_code == 200
## In our real code we are asserting to the objects in the expected_outputs.json
assert response.json() == {
"id": 1,
"username": "john_doe",
"email": "[email protected]"
}
assert response.json()['id'] == 1
...
assert response.json()['email'] == "[email protected]"

Затем добавляется новое поле, например полное_имя, тест тоже придется модифицировать:

Код: Выделить всё

class UserCreate(BaseModel):
username: str
email: str
full_name: Optional[str] = None
phone: Optional[str] = None

# Original test
def test_create_user(client):
## In our real code we are referring to the objects in the mock_inputs.json
response = client.post("/users/", json={
"username": "john_doe",
"email": "[email protected]"
})
assert response.status_code == 200
## In our real code we are asserting to the objects in the expected_outputs.json
assert response.json() == {
"id": 1,
"username": "john_doe",
"email": "[email protected]"
"full_name": "John Locke"
}
assert response.json()['id'] == 1
...
assert response.json()['full_name'] == "John Locke" ## Added new test for some key

Сейчас мы добавляем новые поля (а иногда и удаляем старые поля, если они требуют от нас этого) к ожидаемым выходным данным и макетным входным данным, но это сложно поддерживать, поскольку мы придется добавить эти ожидаемые выходные данные и макетировать входные данные для довольно большого количества конечных точек, поскольку бывают случаи, когда добавляются десятки новых полей.
Также полезно упомянуть схемы в Вопрос также заключается в том, что в среднем на каждую схему приходится довольно большое поле (25++), и мы хотели бы протестировать несколько сценариев, например, когда значения имеют значение null (при условии, что поле может быть опционально None), а затем также разные типы данных.

Подробнее здесь: https://stackoverflow.com/questions/791 ... unit-tests
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Ошибка утверждения при модульных тестах
    Гость » » в форуме C++
    0 Ответы
    47 Просмотры
    Последнее сообщение Гость
  • Миграция Flyway в модульных тестах выдает ошибку
    Anonymous » » в форуме JAVA
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • Как я могу использовать пакеты JDK в модульных тестах в проекте Android?
    Гость » » в форуме JAVA
    0 Ответы
    39 Просмотры
    Последнее сообщение Гость
  • Как я могу использовать пакеты JDK в модульных тестах в проекте Android?
    Гость » » в форуме Android
    0 Ответы
    33 Просмотры
    Последнее сообщение Гость
  • Как я могу использовать пакеты JDK в модульных тестах в проекте Android?
    Гость » » в форуме JAVA
    0 Ответы
    31 Просмотры
    Последнее сообщение Гость

Вернуться в «Python»