파이테스트 프레임워크 - 피처 심층 가이드

파이테스트 프레임워크 - 피처(Fixture)

파이테스트의 피처는 테스트 함수에 필요한 리소스나 컨텍스트를 제공하는 강력한 메커니즘입니다. 테스트 환경 설정, 데이터 준비 등에 활용할 수 있습니다. 피처의 핵심 개념과 사용 사례는 다음과 같습니다.
  • 예제 1: 피처 어노테이션이 없는 메서드 호출
def setup_environment():
 print("환경 설정 메서드 실행")
def test_database_connection():
 setup_environment()
 print("데이터베이스 연결 테스트")
collected 1 item

test_sample.py::test_database_connection 환경 설정 메서드 실행
데이터베이스 연결 테스트
PASSED
  • 피처 어노테이션이 적용된 메서드 호출
import pytest
@pytest.fixture
def setup_environment():
 print("환경 설정 메서드 실행")
def test_database_connection(setup_environment):
 print("데이터베이스 연결 테스트")
collected 1 item

test_sample.py::test_database_connection 환경 설정 메서드 실행
데이터베이스 연결 테스트
PASSED
  • 피처 어노테이션이 없는 메서드 호출과 피처 어노테이션이 적용된 메서드 호출은 완전히 다릅니다. 전자는 메서드 내에서 직접 호출해야 하지만, 후자는 함수명을 파라미터로 전달하여 호출할 수 있습니다.
  • 예제 2: API 테스트 전 인증 처리
import pytest
@pytest.fixture
def authenticate_user():
 print("---사용자 인증 수행---")
def test_get_user_info(authenticate_user):
 print("---사용자 정보 API 테스트---")
def test_update_profile(authenticate_user):
 print("---프로필 업데이트 API 테스트---")
  • 실행 결과:
  • @pytest.fixture 데코레이터를 사용하여 특정 함수가 피처임을 파이테스트에 알립니다. 실행 결과에서 볼 수 있듯이, API 테스트가 실행되기 전에 항상 authenticate_user 메서드가 먼저 실행됩니다.

피처 중첩

import pytest
 
@pytest.fixture
def initial_data():
 return "test_data"
 
@pytest.fixture
def test_data_set(initial_data):
 return [initial_data]
def test_data_manipulation(test_data_set):
 test_data_set.append("additional_data") 
 assert test_data_set == ["test_data", "additional_data"]
  • 테스트는 단일 피처로 제한되지 않으며, 원하는 수만큼의 피처에 의존할 수 있고, 피처도 다른 피처를 사용할 수 있습니다.

여러 피처 요청

import pytest
class DatabaseConnection:
 def __init__(self, connection_string):
 self.connection_string = connection_string
 def __eq__(self, other):
 return self.connection_string == other.connection_string
@pytest.fixture
def db_connection():
 return DatabaseConnection("localhost:5432")
@pytest.fixture
def test_environment(db_connection):
 return [DatabaseConnection("test_db"), db_connection]
def test_database_operations(db_connection, test_environment):
 assert db_connection in test_environment
  • 테스트와 피처는 단일 피처 요청으로 제한되지 않으며, 필요한 만큼의 피처를 요청할 수 있습니다.

yield 피처

  • 테스트를 실행할 때, 다른 테스트를 방해하지 않도록(그리고 시스템을 팽창시키는 대량의 테스트 데이터를 남기지 않도록) 자체적으로 정리할 수 있도록 보장하고 싶습니다. 파이테스트의 피처는 각 피처에 대한 구체적인 정리 단계를 정의할 수 있는 매우 유용한 체계를 제공합니다.
  • "Yield" 피처는 return 대신 yield를 사용합니다. 이러한 피처로 일부 코드를 실행하고 다른 피처/테스트에 객체를 반환할 수 있습니다. 유일한 차이점은 다음과 같습니다:
  • return이 yield로 대체됩니다.
  • 피처의 모든 정리 코드는 yield 문 뒤에 배치됩니다.
  • pytest가 피처의 선형 순서를 결정하면, 각 피처가 반환하거나 yield할 때까지 실행하고, 목록의 다음 피처로 계속 진행합니다. 테스트가 완료되면, pytest는 피처 목록을 역순으로 탐색하고, 각 yield된 피처에 대해 yield 문 뒤의 코드를 실행합니다.
  • 예제:
import pytest

@pytest.fixture
def resource_setup():
 print("자원 초기화 중...")
 yield
 print("자원 정리 중...")
def test_api_call(resource_setup):
 print("API 호출 테스트 진행")

매개변수가 있는 피처

pytest.fixture(scope='', params='', autouse='', ids='', name='')
  • scope 매개변수는 피처의 적용 범위를 제어하여 피처의 생명 주기를 결정합니다. 사용 가능한 값은 다음과 같습니다:
  • function (기본값): 각 테스트 함수마다 피처를 한 번 호출합니다.
  • class: 동일한 테스트 클래스 내에서 이 피처를 공유합니다.
  • module: 동일한 테스트 모듈 내에서 이 피처를 공유합니다. (하나의 파일 내)
  • session: 전체 테스트 세션에서 이 피처를 공유합니다.
  • autouse 매개변수는 기본적으로 False입니다. True로 설정하면 각 테스트 함수가 이 피처를 명시적으로 전달하지 않아도 자동으로 호출됩니다.
  • params 매개변수는 피처를 매개변수화하며, 목록 전달을 지원합니다. 각 매개변수 값은 피처를 한 번 실행하며, for 루프와 유사합니다.
@pytest.fixture(params=["admin", "user", "guest"])
def test_user(request):  # request 내장 피처를 사용하여 매개변수 가져오기
    return request.param
  • 효과: 테스트 케이스가 3번 실행되며, 각각 3개의 이름이 전달됩니다.
  • ids 매개변수는 params와 함께 사용하여 각 매개변수화 인스턴스에 읽을 수 있는 식별자를 지정합니다(매개변수에 이름 지정).
@pytest.fixture(params=["admin", "user"], ids=["권한관리자", "일반사용자"])
def test_user(request):
    return request.param
  • 효과: 실행 시 test_user[권한관리자], test_user[일반사용자]로 표시됩니다.
  • name 매개변수는 피처에 명시적으로 이름을 설정합니다. name을 사용하면 테스트 함수에서 이 이름을 사용하여 피처를 참조해야 합니다(피처에 이름 지정).
@pytest.fixture(name="env_setup")  # 별명 env_setup
def prepare_test_environment():
    print("테스트 환경 설정 실행")

def test_system(env_setup):  # 별명 사용
    print("시스템 테스트 실행")

태그: 파이테스트 자동화 테스트 테스트 프레임워크 파이썬 테스팅 테스트 피처

7월 3일 05:57에 게시됨