Наша среда тестирования состоит из:
- Модульные тесты с использованием pytest
- Два статических файла:
: содержит ожидаемые ответы API.Код: Выделить всё
expected_outputs.json
- : Содержит входные данные теста.
Код: Выделить всё
mock_inputs.json
Проблема в том, что заинтересованные стороны регулярно запрашивают добавление новых полей в наши ответы 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