[파이썬] pytest 커스텀 플러그인 작성하기

테스트 코드를 작성하다보면, pytest의 기본 기능으로는 해결할 수 없는 상황이 발생하기도 합니다. 이럴 때는 pytest의 확장성을 사용하여 커스텀 플러그인을 작성할 수 있습니다. 커스텀 플러그인을 작성하면 pytest를 필요에 맞게 확장하여 테스트를 보다 효율적으로 작성할 수 있습니다.

커스텀 플러그인 작성하기

pytest 커스텀 플러그인을 작성하기 위해 다음과 같은 단계를 따르세요.

  1. 필요한 패키지를 설치합니다. (pytestpytest-hook 패키지가 필요합니다.)

     pip install pytest
     pip install pytest-hook
    
  2. pytest 플러그인을 작성할 파일을 생성합니다. 일반적으로 파일 이름은 “test_*.py” 형식을 따릅니다.

  3. 작성한 파일에 pytest의 플러그인 인터페이스를 구현합니다.

    import pytest
    
    @pytest.hookimpl(tryfirst=True)
    def pytest_collection_modifyitems(config, items):
        # Test collection 전에 실행될 로직을 작성합니다.
        pass
    
    @pytest.hookimpl(tryfirst=True)
    def pytest_runtest_protocol(item, nextitem):
        # 테스트 실행 전후에 실행될 로직을 작성합니다.
        pass
    

    이외에도 다양한 플러그인 훅이 존재하며, 필요에 따라 추가로 구현할 수도 있습니다.

  4. 작성한 커스텀 플러그인을 실행해봅니다.

    pytest
    

위의 단계를 따라 진행하면 pytest 커스텀 플러그인을 작성할 수 있습니다. 작성한 플러그인을 사용하는 경우, pytest 명령어를 실행할 때 자동으로 플러그인이 동작하게 됩니다.

커스텀 플러그인 예시

아래는 pytest 커스텀 플러그인의 간단한 예시입니다.

import pytest

def pytest_collection_modifyitems(config, items):
    # 모든 테스트를 상위 그룹으로 묶어 실행되게 설정
    top_group = pytest.Module("tests", parent=None)
    top_group.addchildren(items)
    items[:] = [top_group]

def pytest_runtest_protocol(item, nextitem):
    # 테스트 실행 전에 메세지를 출력하도록 설정
    print(f"Running test: {item.name}")

위의 예시는 테스트를 모두 상위 그룹으로 묶어서 실행되도록 설정하고, 테스트 실행 전에 해당 테스트의 이름을 출력하는 기능을 추가한 커스텀 플러그인입니다.

마무리

pytest 커스텀 플러그인을 작성하면 테스트 코드의 확장성과 유지보수성을 향상시킬 수 있습니다. 이 문서에서는 pytest 커스텀 플러그인을 작성하는 단계와 예시를 살펴보았습니다. 본인의 테스트 환경에 맞게 플러그인을 작성해보세요.

Happy coding!