Pytest Reference
Pytest 테스트 프레임워크 레퍼런스
Pytest Reference 소개
Pytest 레퍼런스는 pytest 테스트 프레임워크를 위한 체계적이고 검색 가능한 치트 시트입니다. 기본, 픽스처, 마커, 파라미터화, 모킹, 플러그인, 설정, CLI 등 8개 카테고리로 구성되어 있으며, 각 항목에는 간결한 설명과 실제 코드 예제가 포함되어 있어 문서 탭을 전환하지 않고도 빠르게 테스트를 작성하고 디버깅할 수 있습니다.
pytest는 Python 프로젝트의 사실상 표준 테스트 프레임워크로, 웹 애플리케이션, 데이터 파이프라인, CLI 도구, 라이브러리를 개발하는 팀에서 널리 사용됩니다. 픽스처 시스템은 설정·해제 로직을 한 번 선언하고 function, module, session 스코프로 테스트 전반에 재사용할 수 있게 합니다. parametrize 데코레이터는 하나의 테스트 함수로 수십 가지 입력/출력 조합을 테스트하는 데이터 기반 테스트를 가능하게 합니다.
이 레퍼런스는 모킹 도구도 다룹니다. 속성·환경변수·파일시스템 경로를 패치하는 내장 `monkeypatch` 픽스처, 모크 객체를 생성하는 `unittest.mock.patch`와 `MagicMock`, 편리한 래퍼를 제공하는 `pytest-mock` 플러그인이 포함됩니다. 플러그인 섹션에는 코드 커버리지를 위한 `pytest-cov`, 병렬 실행을 위한 `pytest-xdist`, 비동기 테스트를 위한 `pytest-asyncio`, Django 테스트를 위한 `pytest-django`가 수록되어 있습니다.
주요 기능
- 기본·픽스처·마커·파라미터화·모킹·플러그인·설정·CLI 8개 카테고리 수록
- 픽스처 스코프: function(기본), module, session — yield 기반 설정/해제 예제 포함
- 파라미터화 패턴: 기본, 다중 조합, 커스텀 ID, 간접(indirect) 파라미터화
- 모킹: monkeypatch.setattr/setenv, unittest.mock.patch, MagicMock, mock.call_count
- 플러그인: pytest-cov, pytest-xdist(-n auto), pytest-asyncio, pytest-mock, pytest-django
- 설정 파일: pytest.ini, pyproject.toml, setup.cfg, conftest.py 훅, filterwarnings
- CLI 플래그: -v, -k, -x, --lf, -m, --tb=short, -s, --durations 사용 예제
- 100% 클라이언트 사이드 처리 — 회원가입 불필요, 데이터 서버 전송 없음
자주 묻는 질문
pytest 픽스처란 무엇이고 언제 사용해야 하나요?
pytest 픽스처는 `@pytest.fixture` 데코레이터가 붙은 함수로, 테스트 함수에 설정 데이터나 리소스를 제공합니다. 픽스처는 재사용을 촉진합니다. 데이터베이스 연결, 테스트 클라이언트, 샘플 데이터 등 공유 로직을 한 번 정의하고 테스트 함수의 매개변수 이름으로 주입할 수 있습니다. 여러 테스트가 같은 설정 코드를 공유한다면 픽스처를 사용하세요. 정리 로직이 필요하면 픽스처 안에서 `yield`를 사용합니다.
픽스처 스코프의 차이는 무엇인가요?
픽스처 스코프는 픽스처가 생성·소멸되는 빈도를 제어합니다. 기본 스코프는 "function"으로 각 테스트마다 새 인스턴스를 생성합니다. "module" 스코프는 모듈의 모든 테스트가 하나의 인스턴스를 공유합니다. "session" 스코프는 전체 테스트 실행 동안 하나의 인스턴스를 공유합니다. 데이터베이스 연결처럼 비용이 큰 리소스에는 넓은 스코프를, 테스트 간 격리가 필요한 경우에는 function 스코프를 사용하세요.
@pytest.mark.parametrize는 어떻게 동작하나요?
`@pytest.mark.parametrize`는 같은 테스트 함수를 여러 입력값으로 실행할 수 있게 합니다. 인자 이름을 쉼표로 구분된 문자열로 지정하고, 값 튜플 목록을 제공합니다: `@pytest.mark.parametrize("x,y,expected", [(1, 2, 3), (5, 5, 10)])`. pytest는 각 튜플에 대해 별도의 테스트 케이스를 생성합니다. 여러 `@parametrize` 데코레이터를 쌓으면 모든 조합의 카테시안 곱을 얻을 수 있습니다.
monkeypatch와 unittest.mock의 차이는 무엇인가요?
`monkeypatch`는 pytest 내장 픽스처로, 테스트 동안만 속성, 환경변수, 딕셔너리 항목, 파일시스템 경로를 임시로 교체하고 테스트 후 자동으로 원본을 복원합니다. 단순한 속성 교체에는 더 간편합니다. `unittest.mock.patch`와 `MagicMock`은 반환값, 호출 추적, 부수 효과를 가진 완전한 모크 객체를 만드는 데 더 강력합니다. `pytest-mock`은 `mocker` 픽스처를 제공해 pytest 스타일로 `unittest.mock`을 사용할 수 있게 합니다.
pytest로 코드 커버리지를 측정하려면 어떻게 하나요?
`pytest-cov` 플러그인을 설치(`pip install pytest-cov`)하고 `pytest --cov=myapp --cov-report=html tests/`로 실행합니다. 이렇게 하면 어떤 줄이 테스트로 커버되는지 보여주는 HTML 커버리지 리포트가 생성됩니다. `--cov-report=term-missing`을 사용하면 커버되지 않는 줄 번호를 터미널에서 확인할 수 있습니다.
테스트를 건너뛰거나 예상 실패로 표시하려면 어떻게 하나요?
`@pytest.mark.skip(reason="...")`은 테스트를 무조건 건너뜁니다. `@pytest.mark.skipif(조건, reason="...")`은 런타임 조건(OS 플랫폼, 선택 의존성 누락 등)에 따라 건너뜁니다. `@pytest.mark.xfail(reason="...")`은 예상 실패로 표시합니다. 실패 시 "xfailed"(예상대로), 통과 시 "xpassed"(예상 외 통과)로 보고되며, 설정에서 `xfail_strict = true`로 설정하면 "xpassed"를 오류로 처리할 수 있습니다.
마지막으로 실패한 테스트만 실행하려면 어떻게 하나요?
`pytest --lf`(또는 `--last-failed`)를 사용하면 이전 실행에서 실패한 테스트만 실행합니다. pytest는 결과를 `.pytest_cache` 디렉토리에 저장합니다. 이전에 실패한 테스트가 없으면 전체 테스트 스위트로 폴백합니다. `pytest --lf -x`처럼 `-x`와 결합하면 실패하는 테스트를 빠르게 반복 수정할 수 있습니다.
pytest 프로젝트 설정은 어떻게 하나요?
pytest는 `pytest.ini`, `pyproject.toml`(의 `[tool.pytest.ini_options]` 섹션), 또는 `setup.cfg`(의 `[tool:pytest]` 섹션)에서 설정할 수 있습니다. 주요 설정 항목으로는 테스트 경로를 지정하는 `testpaths`, 기본 CLI 플래그를 설정하는 `addopts`(예: `-v --tb=short`), 커스텀 마커를 등록하는 `markers`, 특정 경고를 오류로 처리하거나 무시하는 `filterwarnings` 등이 있습니다.