FastAPI/테스트 코드

PyTest란?

hyunai 2026. 7. 1. 13:32

테스트 코드 작성을 위한 Python 라이브러리

vs. Unittest

  • 간결한 문법
    • assert 문
    • 함수 단위 테스트 지원
  • fixture 지원
    • 테스트 데이터 관리

라이브러리 설치

pip install pytest

테스트를 하는 라이브러리

pip install httpx

FastAPI에서 테스트 client라는 기능을 사용하기 위해 내부적으로 사용하는 라이브러리

Python Package 만들기

  • 이전까지는 기존 directory를 추가했었는데 지금은 반드시 python package를 추가를 해야된다.
    • 둘의 차이로는 python package는 기본적으로 __init__.py가 생성된다.
      • 새로운 python package 폴더 아래에 반드시 있어야 정상적으로 탐색할 수 있게 된다.
    • python package는 python이 경로를 찾을 때 반드시 이 python 모듈인 경우에만 경로를 찾을 수 있어서 새로 생성하는 tests 패키지 아래에 테스트 파일들을 테스트로 인지하고 테스트 코드를 실행하게 된다.

  • 사진과 같이 test_main.py로 짓는다.
    • 테스트하는 파일들의 이름도 test_ 이렇게 네이밍 컨벤션을 맞춰줘야 pytest가 이 파일을 찾아서 정상적으로 테스트를 동작시킬 수 있다.

test_main.py

# main.py
...
app = FastAPI()
...


# test_main.py
# testclient import
from fastapi.testclient import TestClient

# main.py에서 app import
from main import app

# 이 client 객체를 이용해서 여기에 어떤 API 요청을 보내보는 형태
client = TestClient(app=app)

def test_health_check():
    # get 요청의 응답을 response라는 변수로 할당
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"ping" : "pong"}

assert란?

한 문장으로 표현하면:

"이 조건이 True가 아니면 테스트 실패로 처리해줘" 라고 pytest한테 말하는 것


assert가 뭔지

assert 기본 문법

assert 조건식

# 조건식이 True  → 통과, 아무 일도 안 일어남
# 조건식이 False → AssertionError 발생, 테스트 실패

지금 코드 분해하기

assert 코드 완전 분해

response = client.get("/")
# "/" 엔드포인트에 GET 요청을 보내고 응답을 받음

assert response.status_code == 200
#      ↑                     ↑
#  응답의 상태코드가         200이어야 한다
#  (HTTP 상태코드)          (성공 코드)

assert response.json() == {"ping": "pong"}
#      ↑                   ↑
#  응답의 JSON 바디가       이 값이어야 한다

어떻게 동작하는지

assert 동작 흐름

client.get("/") 요청
        ↓
응답 받음
        ↓
assert response.status_code == 200
        ↓
    200 맞음?
   ↙         ↘
True          False
  ↓             ↓
통과         테스트 실패 
              AssertionError

성공 vs 실패 예시

assert 성공 vs 실패 케이스

# 성공 케이스
# 실제 응답: status_code=200, json={"ping": "pong"}
assert response.status_code == 200      # True → 통과
assert response.json() == {"ping": "pong"}  # True → 통과

# 실패 케이스
# 실제 응답: status_code=404
assert response.status_code == 200
# False → AssertionError!
# FAILED tests/test_main.py::test_health_check

assert를 왜 2번 쓰냐면

각 assert가 검증하는 것

assert  검증 내용 의미
assert response.status_code == 200 HTTP 상태코드 요청이 성공했는지
assert response.json() == {"ping": "pong"} 응답 바디 올바른 데이터가 왔는지

둘 다 통과해야 테스트가 성공. 하나라도 실패하면 테스트 전체가 실패


💡 핵심 요약:
assert 조건 = "이 조건이 True가 아니면 테스트 실패"
테스트 코드에서 "내가 기대하는 값""실제 응답값" 을 비교하는 용도


pytest 실행

pytest
  • 터미널에 pytest라고 입력 후 실행
    • pytest가 src 안에서 테스트 코드를 쭉 검색을 하게 된다.
    • 여기서 test_main.py가 테스트 코드라는 걸 알게 되고 그 안에서 테스트로 시작한 함수를 테스트 코드로 해서 동작을 시키게 된다.

  • 그럼 위의 사진과 같이 test_main.py가 실행됐다는 걸 알 수 있다.
  • 하나의 테스트 코드가 정상적으로 통과했다는 것을 알 수 있게 된다.

굳이 터미널에 입력하지 않고 왼쪽의 화살표를 눌러 Run 버튼을 눌러도 된다.

'FastAPI > 테스트 코드' 카테고리의 다른 글

GET 단일 조회 API  (0) 2026.07.07
PyTest Fixture  (0) 2026.07.07
PyTest Mocking  (0) 2026.07.07
GET 전체 조회 API  (0) 2026.07.06
테스트 코드란?  (0) 2026.07.01