pytest 플러그인 설치하고 사용하기

pytest 플러그인 설치하고 사용하기

pytest는 커버리지, 분산 실행, Django 통합 같은 기능 대부분을 플러그인으로 제공해요. 필요한 플러그인을 설치하기만 하면 pytest가 자동으로 찾아서 통합하므로, 활성화하려고 별도 설정을 건드릴 필요가 없어요. 여기서는 플러그인을 설치·해제하는 방법부터, 어떤 플러그인이 활성화되어 있는지 확인하고 필요 없는 플러그인을 끄는 방법까지 살펴볼게요.

출처: pytest 공식 문서 - How to install and use plugins

pip로 플러그인 설치하기

서드파티 플러그인 설치는 pip install로 끝나요. 설치하면 pytest가 플러그인을 자동으로 발견하고 통합하므로 따로 활성화할 필요가 없어요.

pip install pytest-NAME
pip uninstall pytest-NAME

많이 쓰는 플러그인 안내

문서에 소개된 주요 플러그인을 몇 개 정리하면 이렇습니다.

  • pytest-django — pytest 통합으로 Django 앱 테스트 작성
  • pytest-twisted — Twisted 앱 테스트. 리액터를 시작하고 테스트 함수의 deferred를 처리
  • pytest-cov — 분산 테스트와 호환되는 커버리지 리포트
  • pytest-xdist — 테스트를 CPU·원격 호스트로 분산 실행, 세그폴트에서도 pytest가 살아남는 boxed 모드, 실패 테스트를 자동 재실행하는 looponfailing 모드 제공
  • pytest-instafail — 테스트 실행 중에 실패를 바로 보고
  • pytest-bdd — BDD(행위 주도 개발) 스타일로 테스트 작성
  • pytest-timeout — 함수 마커나 전역 설정 기반으로 테스트 타임아웃 처리
  • pytest-skip-slow@pytest.mark.slow 붙은 테스트를 기본으로 스킵하고 --slow로 실행
  • pytest-pep8--pep8 옵션으로 PEP8 준수 검사
  • allure-pytest — allure-framework로 테스트 결과 리포트

전체 목록과 각 플러그인의 최신 테스트 상태는 Pytest Plugin List에서 확인할 수 있어요. pypi.org에서 pytest- 검색으로도 더 많은 플러그인을 찾을 수 있어요.

테스트 모듈·conftest에서 플러그인 요청하기

pytest_plugins 변수로 테스트 모듈이나 conftest 파일에서 플러그인을 요청할 수 있어요. 해당 모듈이 로드될 때 지정한 플러그인도 함께 로드돼요.

pytest_plugins = ("myapp.testsupport.myplugin",)

다만 루트가 아닌 conftest.py에서 pytest_plugins로 플러그인을 요청하는 건 권장하지 않아요(플러그인 작성 섹션에서 자세히 설명). 또 pytest_plugins라는 이름은 예약어라서 커스텀 플러그인 모듈 이름으로 쓰면 안 돼요.

어떤 플러그인이 활성화되어 있는지 확인하기

다음 명령을 실행하면 확장된 테스트 헤더에서 활성 플러그인과 그 이름을 볼 수 있어요. 로드된 로컬 플러그인(conftest.py 파일)도 함께 출력돼요.

pytest --trace-config

플러그인 비활성화하기

특정 플러그인을 로드하지 않으려면 -p no:NAME을 쓰면 돼요. 이후 그 이름으로 다시 활성화하려 해도 동작하지 않아요.

pytest -p no:NAME

프로젝트 전체에서 무조건 끄고 싶다면 설정 파일에 옵션을 추가할 수 있어요.

[pytest]
addopts = ["-p", "no:NAME"]
[pytest]
addopts = -p no:NAME

CI 같은 특정 환경에서만 끄고 싶다면 PYTEST_ADDOPTS 환경변수에 -p no:NAME을 넣어도 돼요.

자동 로딩 자체를 끄기

플러그인 자동 로드가 싫고 원하는 플러그인만 명시적으로 지정하고 싶다면 --disable-plugin-autoload 옵션 또는 PYTEST_DISABLE_PLUGIN_AUTOLOAD 환경변수를 쓸 수 있어요.

export PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
export PYTEST_PLUGINS=NAME,NAME2
pytest
pytest --disable-plugin-autoload -p NAME -p NAME2

-pPYTEST_PLUGINS는 둘 다 어떤 플러그인을 로드할지 명시하는 방법이지만 용도가 조금 달라요. -p는 특정 pytest 실행에 대해 이름이나 엔트리포인트로 플러그인을 로드(또는 -p no:<name>으로 비활성화)하고 시작 초기에 처리돼요. 반면 PYTEST_PLUGINS는 시작 시 로드·등록할 플러그인 모듈의 쉼표 구분 목록이에요. 자동 로드를 끄고 플러그인을 직접 제어할 때는 같은 플러그인을 여러 방법으로 중복 등록하지 않도록 주의해야 해요. 중복 등록하면 플러그인 등록 과정에서 오류가 날 수 있어요.

더 알아보기 (Learn more)