pytest의 개념과 활용
개념
테스트
테스트란 소프트웨어 프로그램이 요구 사항에 맞게 동작하는지 확인하는 과정이다. 버그를 발견하고, 코드 변경이 기존 기능에 영향을 주는지 검증하는 역할을 한다.
- 단위 테스트 (Unit Test) : 개별 함수나 메서드를 테스트
- 기능 테스트 (Function Test) : 특정 기능이 올바르게 동작하는지 검증
- 통합 테스트 (Integration Test) : 여러 모듈이 함께 동작하는지 테스트
- E2E 테스트 (End To End Test) : 전체 시스템을 사용자 관점에서 테스트
- 회귀 테스트 (Regression Test) : 기존 기능이 변경 없이 유지되는지 확인
- 단위/통합/E2E 테스트에 대해 자세히 확인하고 싶다면, 링크 참고
pytest
pytest는 Python의 대표적인 오픈소스 테스트 프레임워크 중 하나로 FastAPI를 포함한 애플리케이션에서 테스트를 작성하는 데 사용된다. assert를 활용해 직관적인 테스트 코드 작성이 가능하며, 비동기 테스트도 지원하여 FastAPI에서도 사용이 가능하다. 또한 Fixture를 지원하여 반복되는 테스트 데이터를 쉽게 재사용이 가능하다.
- 파일명 : test_*.py 또는 *_test.py (3.8 ↑)
- 클래스명 : class Test*
- 메서드/함수명 : def test_*
- 해당 test 디렉터리에는 __init__.py 파일이 존재해야 함
- 기능 및 사용법에 대해 자세히 확인하고 싶다면, 링크 참고 (ex. Fixture)
# test_with_pytest.py
def test_always_passes():
assert True
def test_always_fails():
assert False
pytest를 활용한 테스트 (FastAPI)
FastAPI는 비동기(Async) 기반 웹 프레임워크이며, pytest는 비동기 테스트를 지원하기 때문에 쉽게 사용이 가능하다.
기본 API 예제 (main.py)
from fastapi import FastAPI, Depends
app = FastAPI()
def get_message():
return "Hello, pytest!"
@app.get("/message")
async def read_message(message: str = Depends(get_message)):
return {"message": message}
단위 테스트
- main.py의 get_message 메서드가 정상적으로 작동하는지 테스트
from main import get_message
def test_get_message():
assert get_message() == "Hello, pytest!"
기능 테스트
- FastAPI의 TestClient를 사용해 API Endpoint 테스트
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_read_message():
response = client.get("/message")
assert response.status_code == 200
assert response.json() == {"message": "Hello, pytest!"}
pytest 고급 기능
dependency_overrides
- dependency_overrides를 사용해 특정 테스트에서만 의존성을 교체할 수 있음
- Test DB Session을 생성하고 dependency_overrides를 사용하면, Test DB를 독립적으로 사용 가능
def override_get_message():
return "Overridden message!"
app.dependency_overrides[get_message] = override_get_message
def test_read_message_override(client):
response = client.get("/message")
assert response.json() == {"message": "Overridden message!"}
pytest.mark.asyncio
- 비동기 기반의 API 테스트도 가능
import pytest
from httpx import AsyncClient
from main import app
@pytest.mark.asyncio
async def test_async_message():
async with AsyncClient(app=app, base_url="http://test") as client:
response = await client.get("/message")
assert response.status_code == 200
assert response.json() == {"message": "Hello, pytest!"}
Reference
https://dev-jacob.tistory.com/entry/Pytest-vs-Unittest
https://sangjuncha-dev.github.io/posts/programming/python/2022-02-08-python-pytest-guide/
'Web' 카테고리의 다른 글
[FastAPI] OAuth2와 JWT를 활용한 인증 구현 (0) | 2025.02.22 |
---|---|
[FastAPI] DB Migration을 위한 alembic 개념과 활용 (0) | 2025.02.17 |
[FastAPI] 의존성 주입 (Dependency Injection) 개념과 활용 (0) | 2025.02.02 |
[FastAPI] 데이터베이스 Session 생성을 위한 get_db() 이해 (0) | 2025.02.01 |
[Web] 웹 크롤링을 위한 Fiddler와 Postman 설치 및 사용법 (1) | 2024.09.25 |