
소프트웨어 개발
pytest Advancedpytest 심화 (픽스처, 마커)
pytest는 Python 표준 테스팅 프레임워크로, 픽스처(fixture), 마커(marker), 파라미터화, 플러그인 생태계로 대규모 테스트 스위트를 효율적으로 관리할 수 있다.
픽스처 (Fixture)
python
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
@pytest.fixture(scope="session")
def db_engine():
"""세션 전체에서 한 번만 생성되는 DB 엔진"""
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
yield engine
engine.dispose()
@pytest.fixture(scope="function")
def db_session(db_engine):
"""각 테스트마다 새 트랜잭션"""
with Session(db_engine) as session:
session.begin()
yield session
session.rollback()
def test_create_user(db_session):
user = User(name="Alice", email="alice@example.com")
db_session.add(user)
db_session.flush()
assert user.id is not None파라미터화
python
import pytest
@pytest.mark.parametrize("input,expected", [
("hello", 5),
("world!", 6),
("", 0),
("한글", 2),
])
def test_string_length(input, expected):
assert len(input) == expected
# 여러 파라미터 조합
@pytest.mark.parametrize("a,b,result", [
(1, 2, 3),
(-1, 1, 0),
(0, 0, 0),
])
def test_add(a, b, result):
assert add(a, b) == result커스텀 마커
python
# pytest.ini
[pytest]
markers =
slow: 느린 테스트 (네트워크, DB)
smoke: 스모크 테스트 (빠른 핵심 기능 검증)
integration: 통합 테스트
# 사용
@pytest.mark.slow
@pytest.mark.integration
def test_database_connection():
...
# 실행: 특정 마커만
# pytest -m "not slow"
# pytest -m "smoke"conftest.py 패턴
python
# conftest.py (공유 픽스처)
import pytest
from fastapi.testclient import TestClient
from app.main import app
@pytest.fixture(scope="module")
def client():
return TestClient(app)
@pytest.fixture
def auth_headers(client):
response = client.post("/auth/login", json={"email": "test@test.com", "password": "pass"})
token = response.json()["access_token"]
return {"Authorization": f"Bearer {token}"}