[파이썬] pytest 테스트 코드 리팩토링 전략

테스트 코드는 개발 과정에서 매우 중요한 역할을 합니다. 테스트 코드를 통해 소프트웨어의 기능 및 동작을 확인하고 버그를 식별할 수 있습니다. 하지만 테스트 코드도 시간이 지남에 따라 유지보수가 필요할 때가 있습니다. 이번 글에서는 pytest를 사용한 테스트 코드의 리팩토링 전략에 대해 알아보겠습니다.

1. 기능별로 모듈화하기

한 테스트 파일에 많은 테스트 케이스가 포함되어 있으면 가독성이 떨어지고 테스트를 찾기 어렵습니다. 따라서 각각의 기능 별로 테스트 모듈을 만들어 경로에 맞게 구성하는 것이 좋습니다. 예를 들어, 사용자 관리 기능과 상품 관리 기능이 있는 경우, test_users.pytest_products.py와 같이 모듈을 구성하는 것입니다.

2. 각 테스트 케이스마다 주석 작성하기

테스트 케이스가 복잡하거나 특정 시나리오를 테스트하는 경우, 주석을 추가하여 목적과 예상 결과를 설명하는 것이 좋습니다. 이는 테스트의 이해도와 유지보수성을 높이는 데 도움이 됩니다. 예를 들어, 아래와 같이 테스트 케이스에 주석을 추가할 수 있습니다:

def test_user_creation():
    """
    Test user creation functionality.
    Verify that a new user can be created successfully.
    """
    # Setup
    ...

    # Action
    ...

    # Assertion
    ...

3. 픽스쳐(fixture) 사용하기

pytest는 테스트를 진행하기 전에 실행되는 픽스쳐(fixture)를 지원합니다. 이를 활용하면 테스트 간의 의존성을 줄이고, 테스트 실행 속도를 높일 수 있습니다. 테스트 케이스에 필요한 초기 설정이나 객체를 생성하는 작업을 픽스쳐로 분리하여 재사용할 수 있습니다.

@pytest.fixture
def user():
    user = User(name="John Doe", age=25)
    return user

def test_user_creation(user):
    """
    Test user creation functionality.
    Verify that a new user can be created successfully.
    """
    # Action
    response = create_user(user)

    # Assertion
    assert response.status_code == 200

4. 테스트 케이스를 파라미터화하기

유사한 동작을 하는 여러 테스트 케이스를 작성해야 할 때, pytest의 pytest.mark.parametrize 데코레이터를 사용하면 효율적으로 테스트 케이스를 작성할 수 있습니다. 이를 통해 테스트 데이터를 파라미터로 전달하고 한 번에 여러 데이터 조합을 테스트할 수 있습니다.

import pytest

@pytest.mark.parametrize("name, age", [
    ("John Doe", 25),
    ("Jane Smith", 30),
])
def test_user_creation(name, age):
    """
    Test user creation functionality.
    Verify that a new user can be created successfully.
    """
    user = User(name=name, age=age)

    # Action
    response = create_user(user)

    # Assertion
    assert response.status_code == 200

5. 가독성을 높이는 Assertion 사용하기

pytest에서는 많은 Assertion 메소드를 제공하고 있습니다. 대신 assert 키워드를 사용해 간결하게 테스트 결과를 확인할 수 있습니다. 다음은 일부 Assertion 메소드에 대한 예제입니다:

def test_addition():
    assert 1 + 2 == 3  # Equality assertion
    assert 2 + 2 != 5  # Inequality assertion
    assert 10 > 5  # Greater than assertion
    assert 5 < 10  # Less than assertion
    assert 10 >= 5  # Greater than or equal assertion
    assert 5 <= 10  # Less than or equal assertion
    assert 2 in [1, 2, 3]  # Membership assertion

pytest는 여러 Assertion 메소드를 지원하므로 사용 가능한 메소드를 적절히 선택하여 가독성을 높일 수 있습니다.

이러한 pytest의 리팩토링 전략은 테스트 코드의 가독성과 유지보수성을 높여줍니다. 개발 과정의 효율성을 높이고 버그를 신속하게 파악하기 위해 테스트 코드에 충분한 시간과 노력을 투자하는 것은 중요합니다.