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"
테스트 실행 시 이벤트 루프 충돌 방지
- pytest-asyncio는 기본적으로 function 스코프의 이벤트 루프를 사용.
- 각 테스트 함수마다 새로운 이벤트 루프가 생성되고 닫히는데, 이는 문제를 일으킬 수 있음.
리소스 관리의 일관성
- 테스트 함수와 fixture는 동일한 이벤트 루프를 사용해야 함.
- 서로 다른 스코프의 이벤트 루프를 사용하면 MultipleEventLoopsRequestedError가 발생할 수 있음.
비동기 리소스의 수명 주기 관리
- 데이터베이스 연결과 같은 비동기 리소스들은 앱 라이프사이클에 맞춰 하나의 이벤트 루프만 바라봐야 함.
- 이벤트 루프가 닫히고 새로운 루프가 생성되면 기존 비동기 리소스들이 오류를 일으킬 수 있음.
따라서, 테스트의 안정성과 리소스 관리를 위해 적절한 이벤트 루프 스코프를 지정 필요.
'Python > FastAPI' 카테고리의 다른 글
| FastAPI 문제 해결 - BaseModel (0) | 2025.03.02 |
|---|