백엔드 기초집: Python FastAPILESSON 25
테스트 기초와 API 테스트
난이도초급
예상 시간35분
선수지식이전 강의
25강. 테스트 기초와 API 테스트
1. 이번 강의에서 해결할 문제
수동 요청만으로는 수정할 때마다 인증, 검증, 권한의 모든 경로를 반복 확인하기 어렵습니다. 빠르게 재실행되는 회귀 테스트를 만듭니다.
2. 학습 목표
3. 핵심 개념
FastAPI TestClient는 HTTPX 기반이며 일반 def pytest 함수에서 앱을 호출할 수 있습니다. 테스트는 운영 DB를 사용하지 않고 별도 SQLite DB와 Session을 주입해야 합니다. 상태 코드만이 아니라 응답 body와 DB 부작용도 검증합니다.
4. 단계별 코드 예시
파일 경로: game-ranking-api/tests/conftest.py
tests/conftest.py
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
from sqlalchemy.pool import StaticPool
from app.database import Base, get_db
from app.main import app
import app.models
test_engine = create_engine(
"sqlite://",
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
TestingSession = sessionmaker(bind=test_engine, expire_on_commit=False)
@pytest.fixture()
def client():
Base.metadata.create_all(test_engine)
def override_get_db():
with TestingSession() as session:
yield session
app.dependency_overrides[get_db] = override_get_db
with TestClient(app) as test_client:
yield test_client
app.dependency_overrides.clear()
Base.metadata.drop_all(test_engine)
파일 경로: game-ranking-api/tests/test_auth_records.py
tests/test_auth_records.py
def register_and_login(client):
credentials = {"username": "tester", "password": "correct-horse-battery"}
assert client.post("/auth/register", json=credentials).status_code == 201
response = client.post("/auth/token", data=credentials)
assert response.status_code == 200
return response.json()["access_token"]
def test_authenticated_user_creates_record(client):
token = register_and_login(client)
response = client.post(
"/records",
headers={"Authorization": f"Bearer {token}"},
json={"game_name": "Rule Break", "score": 1200},
)
assert response.status_code == 201
assert response.json()["score"] == 1200
def test_negative_score_is_rejected(client):
token = register_and_login(client)
response = client.post(
"/records",
headers={"Authorization": f"Bearer {token}"},
json={"game_name": "Rule Break", "score": -1},
)
assert response.status_code == 422
실행 위치: game-ranking-api/
python -m pytest -q
python -m pytest tests/test_auth_records.py -vv
5. 코드가 동작하는 이유
dependency_overrides가 앱의 get_db를 테스트 Session으로 교체합니다. StaticPool이 메모리 SQLite 연결을 테스트 동안 유지합니다. fixture가 각 테스트 전후 테이블과 override를 정리하므로 실행 순서에 의존하지 않습니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
MINI QUIZ
0 / 2테스트 기초와 API 테스트 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
25강. 테스트 기초와 API 테스트 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.