[파이썬] pytest 픽스처(Fixture) 기본 개념

pytest는 Python에서 테스트를 작성하기 위한 강력한 도구입니다. 픽스처(Fixture)는 pytest의 핵심 기능 중 하나로, 테스트에 필요한 초기화 작업을 수행하는 코드 조각입니다. 이번 블로그 포스트에서는 pytest 픽스처의 기본 개념과 사용법에 대해 알아보겠습니다.

픽스처란 무엇인가요?

픽스처는 테스트 코드에서 사용되는 공통된 설정이나 리소스를 정의하고 관리하기 위한 코드 조각입니다. 예를 들어, 데이터베이스 연결, 네트워크 연결, 파일 시스템 액세스 등과 같은 초기화 작업을 픽스처로 정의할 수 있습니다. 이를 통해 각 테스트가 독립적이고 예측 가능한 환경에서 실행될 수 있습니다.

pytest 픽스처의 사용법

pytest에서 픽스처를 정의하려면 @pytest.fixture 데코레이터를 사용합니다. 이 데코레이터를 함수 위에 추가하면 해당 함수를 픽스처로 사용할 수 있습니다. 픽스처 함수에서는 해당 테스트에 필요한 초기화 작업을 수행하고 초기화된 리소스를 반환해야 합니다.

import pytest

@pytest.fixture
def database():
    # 데이터베이스 초기화 작업 수행
    # 초기화된 데이터베이스 리소스 반환
    yield database_resource
    # 테스트 후에 정리 작업 수행

def test_database_connect(database):
    # database 픽스처를 인자로 받아 사용
    # 테스트 코드 작성

def test_database_query(database):
    # database 픽스처를 인자로 받아 사용
    # 테스트 코드 작성

픽스처 함수는 테스트 함수의 인자로 사용될 수 있습니다. pytest는 테스트에 필요한 픽스처를 자동으로 찾아서 제공해 줍니다. 위 예제에서는 test_database_connecttest_database_query 테스트 함수에서 database 픽스처를 인자로 받아서 사용하고 있습니다.

픽스처의 범위

pytest에서 픽스처는 크게 함수 수준(fixture per test), 클래스 수준(fixture per class), 모듈 수준(fixture per module) 및 세션이 수준(fixture per session)으로 분류됩니다. 기본적으로 각 테스트 함수마다 픽스처가 실행되며, 테스트 함수와 같은 클래스에 속한 테스트들은 같은 픽스처에서 실행됩니다. 모듈 수준과 세션 수준의 픽스처는 모든 테스트 함수에 대해 동일한 설정이 필요한 경우에 사용됩니다.

픽스처의 범위를 지정하기 위해 @pytest.fixture 데코레이터에 scope 매개변수를 사용할 수 있습니다.

@pytest.fixture(scope="module")
def database():
    # 모듈 수준의 픽스처로 사용될 경우 초기화 작업
    yield database_resource
    # 모듈 수준의 픽스처로 사용될 경우 정리 작업

@pytest.fixture(scope="session")
def config():
    # 세션 수준의 픽스처로 사용될 경우 초기화 작업
    yield config_resource
    # 세션 수준의 픽스처로 사용될 경우 정리 작업

위 예제에서 database 픽스처는 모듈 수준으로 지정되었으므로, 해당 모듈에 있는 모든 테스트 함수에서 동일한 database_resource를 사용하게 됩니다. 마찬가지로 config 픽스처는 세션 수준으로 설정되었으므로 모든 테스트 모듈에서 동일한 config_resource를 사용하게 됩니다.

결론

pytest의 픽스처를 사용하면 코드를 재사용하고 테스트의 가독성과 유지 보수성을 향상시킬 수 있습니다. 픽스처는 초기화 및 정리 작업을 쉽게 관리하고, 테스트의 독립성과 신뢰성을 보장합니다. pytest의 강력한 픽스처 기능을 활용하여 효과적인 테스트 코드를 작성해 보세요.

참고: pytest 공식 문서 - https://docs.pytest.org/en/latest/fixture.html