liminfo

Pytest Reference

Pytest 테스트 프레임워크 레퍼런스

50개 결과

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` 등이 있습니다.