Python/FastAPI

Pytest 기본 사용법

gudaeng 2025. 3. 2. 22:52

Pytest 기본 사용법

1. 테스트 실행 기본 명령어

기본 실행

pytest tests

상세 출력 옵션

pytest -v                  # 상세한 테스트 결과 출력
pytest -s                  # print 문 출력 보기
pytest -sv                 # 상세 결과 + print 문 출력
pytest -k "test_name"     # 특정 이름을 포함한 테스트만 실행

2. 테스트 순서 관리 (pytest-order)

설치

pip install pytest-order

사용법

import pytest

@pytest.mark.order(1)        # 첫 번째로 실행
def test_first():
    pass

@pytest.mark.order(-1)   # 마지막으로 실행
def test_last():
    pass

3. 비동기 테스트 (pytest-asyncio)

설치

pip install pytest-asyncio

사용법

import pytest

# 방법 1: 개별 테스트에 데코레이터 추가
@pytest.mark.asyncio
async def test_async_function():
    result = await some_async_function()
    assert result == expected_value

자동 모드 설정

# pytest.ini
[pytest]
asyncio_mode = auto

4. Mocking

기본적인 Mock 사용법

from unittest.mock import patch, Mock

# 함수/메서드 모킹
@patch('package.module.function')
def test_something(mock_function):
    mock_function.return_value = 'mocked_result'

# 클래스 모킹
@patch('package.module.ClassName')
def test_with_class(MockClass):
    MockClass.return_value.some_method.return_value = 'mocked'

비동기 함수 모킹

@patch("module.async_function")
async def test_async(mock_function):
    mock_function.return_value = "mocked_result"
    # 또는
    mock_function.return_value = asyncio.Future()
    mock_function.return_value.set_result("mocked_result")

5. Fixture 사용

기본 Fixture

import pytest

@pytest.fixture
def sample_data():
    return {"key": "value"}

def test_using_fixture(sample_data):
    assert sample_data["key"] == "value"
  1. 테스트 실행 시 이벤트 루프 충돌 방지

    • pytest-asyncio는 기본적으로 function 스코프의 이벤트 루프를 사용.
    • 각 테스트 함수마다 새로운 이벤트 루프가 생성되고 닫히는데, 이는 문제를 일으킬 수 있음.
  2. 리소스 관리의 일관성

    • 테스트 함수와 fixture는 동일한 이벤트 루프를 사용해야 함.
    • 서로 다른 스코프의 이벤트 루프를 사용하면 MultipleEventLoopsRequestedError가 발생할 수 있음.
  3. 비동기 리소스의 수명 주기 관리

    • 데이터베이스 연결과 같은 비동기 리소스들은 앱 라이프사이클에 맞춰 하나의 이벤트 루프만 바라봐야 함.
    • 이벤트 루프가 닫히고 새로운 루프가 생성되면 기존 비동기 리소스들이 오류를 일으킬 수 있음.

따라서, 테스트의 안정성과 리소스 관리를 위해 적절한 이벤트 루프 스코프를 지정 필요.

'Python > FastAPI' 카테고리의 다른 글

FastAPI 문제 해결 - BaseModel  (0) 2025.03.02