[파이썬] pytest 확장과 플러그인 작성

pytest는 Python으로 작성된 테스트 프레임워크로, 개발자들이 손쉽게 테스트를 작성하고 실행할 수 있도록 도와줍니다. pytest는 풍부한 기능과 유연성을 제공하며, 확장 및 플러그인 작성을 통해 더욱 강력하게 만들 수 있습니다. 이번 포스트에서는 pytest의 확장과 플러그인 작성에 대해 알아보겠습니다.

확장 작성하기

pytest의 확장은 pytest 훅(hook)을 통해 이루어집니다. 훅은 pytest 프레임워크가 제공하는 특정한 시점에 실행되는 콜백 함수로, 개발자들은 원하는 기능을 추가하거나 커스터마이즈할 수 있습니다.

확장을 작성하기 위해서는 pytest 패키지의 pytest_hookspec 모듈을 import해야 합니다. 예를 들어, 간단한 확장으로 모든 테스트 케이스의 실행 시간을 출력하는 기능을 추가해보겠습니다.

import time
import pytest
from pytest import hookimpl

@hookimpl(tryfirst=True)
def pytest_runtest_protocol(item, nextitem):
    start_time = time.time()
    outcome = yield
    end_time = time.time()
    duration = end_time - start_time
    print(f"Test {item.nodeid} took {duration:.2f} seconds")
    yield outcome

위의 예제에서는 pytest_runtest_protocol 훅을 사용하여 테스트 케이스의 실행 시간을 측정하고 출력합니다. yield를 이용하여 기존의 훅을 호출한 후, 원하는 동작을 추가로 수행합니다.

플러그인 작성하기

pytest 확장의 또 다른 형태인 플러그인은 확장의 모음으로, pytest를 더욱 강력하게 만들어줍니다. 일반적으로 여러 개의 모듈로 구성되며, 특정한 기능을 구현하기 위해 필요한 확장들을 함께 제공합니다. 플러그인을 작성하려면 pytest 패키지에서 제공하는 pytest_plugin 모듈을 import해야 합니다.

예를 들어, 사용자 정의 마커를 통해 테스트를 그룹화하는 플러그인을 작성해보겠습니다.

import pytest
from pytest import plugin

def pytest_configure(config):
    config.addinivalue_line("markers", "smoke: mark tests as smoke tests")

@plugin.hookimpl(tryfirst=True)
def pytest_collection_modifyitems(config, items):
    for item in items:
        if "smoke" in item.keywords:
            item.add_marker(pytest.mark.smoke)

위의 예제에서는 pytest_configure 함수를 사용하여 사용자 정의 마커인 smoke를 추가합니다. 이후, pytest_collection_modifyitems 훅을 사용하여 마커가 smoke인 테스트에 pytest.mark.smoke 마커를 추가합니다.

플러그인 활성화하기

확장 및 플러그인 작성이 완료되면, pytest에서 이를 활성화해야 합니다. 일반적으로 setup.cfg 파일 또는 pyproject.toml 파일을 사용하여 플러그인을 등록합니다.

setup.cfg를 통한 활성화 예시:

[tool:pytest]
plugins =
    myplugin

위의 예제에서 myplugin은 작성한 플러그인의 패키지 이름입니다.

pyproject.toml을 통한 활성화 예시:

[build-system]
requires = [
    "pytest",
    "myplugin"
]

위의 예제에서 myplugin은 작성한 플러그인의 패키지 이름입니다.

결론

pytest의 확장과 플러그인 작성을 통해 개발자들은 테스트 프레임워크를 더욱 강력하게 만들 수 있습니다. 확장을 통해 원하는 기능을 추가하거나 커스터마이즈할 수 있고, 플러그인을 통해 여러 개의 확장을 함께 제공할 수 있습니다. pytest의 확장과 플러그인 작성을 통해 테스트 작성과 실행을 더욱 효율적으로 수행할 수 있습니다.