본문으로 건너뛰기
백엔드 기초집: 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

테스트 기초와 API 테스트 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“테스트 기초와 API 테스트” 실습을 안전하게 진행하기 위한 판단으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2“테스트 기초와 API 테스트”에서 ‘성공 상태 코드만 확인합니다.’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

25강. 테스트 기초와 API 테스트 미완료 상태