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의 확장과 플러그인 작성을 통해 테스트 작성과 실행을 더욱 효율적으로 수행할 수 있습니다.