Первый тест API через TestClient
Уроки курсаПервый тест API через TestClient
Проверка карточки переговорной
Добавьте автоматические проверки готового просмотра карточки комнаты в Roomly. Для существующей комнаты проверяйте ожидаемую карточку целиком, для отсутствующей — ответ об отсутствии.
Успешного статуса без правильных данных недостаточно. Проверки должны замечать нарушение каждого ожидания. Само приложение не меняйте: этот пример только читает заранее заданные сведения.
Что уже дано
В этой браузерной лабе один редактор содержит только ваши тесты. Перед ними уже выполнен следующий готовый код читающего приложения без базы. app и настоящий TestClient доступны на верхнем уровне; импортировать несуществующий main.py или demo_api.py не нужно. В локальном примере теории приложение и тесты остаются двумя отдельными файлами.
from fastapi import FastAPI, HTTPException
from fastapi.testclient import TestClient
app = FastAPI()
rooms = {1: {"id": 1, "name": "Альфа", "capacity": 6}}
@app.get("/api/rooms/{room_id}")
def read_room(room_id: int):
room = rooms.get(room_id)
if room is None:
raise HTTPException(status_code=404, detail="Room not found")
return room
Служебный runner создаёт собственную временную папку с test_submission.py, которая предоставляет pytest именно ваши определённые функции. Затем он запускает настоящий pytest: обнаружение, setup, вызов теста и teardown. Он не вызывает тестовые функции вручную и не дописывает assertions за вас. Для проверки чувствительности runner по очереди меняет HTTP-статус или JSON одного ответа в собственной копии поведения и восстанавливает исходное. Скрытая проверка получает только JSON-отчёт pytest и наблюдения реальных запросов. Файлы runner и управление ресурсами писать не нужно.
Что нужно сделать
Напишите два обнаруживаемых pytest теста: один для GET /api/rooms/1, второй для GET /api/rooms/999. Имена могут отличаться от стартовых, но должны начинаться с test_. В каждом используйте with TestClient(app) as client. Первый проверяет статус200 и точную карточку {"id":1,"name":"Альфа","capacity":6}, включая отсутствие лишних полей. Второй проверяет статус404 и ровно {"detail":"Room not found"}. Используйте обычные assert.
На исправном приложении оба теста должны пройти. Изменение статуса, значения, удаление или добавление поля в проверяемом JSON должно вызвать AssertionError соответствующего теста; ошибка импорта, отсутствие собранных тестов или ошибка setup не считается проверкой контракта. Не изменяйте приложение, каталог или runner и не скрывайте провал через skip/xfail. Дополнительные сценарии, база и сервер здесь не нужны.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно. После вашего кода проверка собирает верхнеуровневые тестовые функции настоящим pytest. Ввод через stdin не используется; print/stdout не требуется. Запускать Uvicorn, subprocess или pytest.main самостоятельно не нужно — runner сделает это после определения ваших тестов.
Для готового приложения pytest собирает два теста, оба проходят. Если ответ существующей комнаты сохраняет200, но capacity становится7, тест этой карточки должен упасть на assert; тест отсутствующей комнаты остаётся успешным.
