[파이썬] pytest 테스트 독립성 보장하기

테스트 코드를 작성할 때, 독립성은 매우 중요한 요소입니다. 독립성은 각각의 테스트가 서로에게 영향을 주지 않고 독립적으로 실행될 수 있는지를 의미합니다. pytest는 이러한 독립성을 보장하기 위한 다양한 기능을 제공합니다.

Fixture를 활용한 독립적인 테스트

pytest에서는 fixture를 사용하여 테스트 간의 의존성을 관리할 수 있습니다. fixture는 테스트를 위해 필요한 리소스를 생성하고 제공하는 역할을 합니다. 테스트 함수에서 @pytest.fixture 데코레이터를 사용하여 fixture를 정의할 수 있습니다.

예를 들어, 다음과 같은 fixture를 정의해보겠습니다:

import pytest

@pytest.fixture
def setup_database():
    # 데이터베이스 연결 및 초기화
    connection = connect_to_database()
    initialize_database(connection)
    
    # 데이터베이스 연결 객체를 테스트 함수에 전달
    yield connection
    
    # 테스트가 끝나면 연결 종료
    connection.close()

위의 코드에서 setup_database fixture는 데이터베이스에 연결하고 초기화하는 역할을 합니다. yield문을 통해 연결 객체를 테스트 함수에 전달하며, 테스트가 끝나면 연결을 종료합니다.

이제 fixture를 활용하여 독립적인 테스트를 작성할 수 있습니다. 각 테스트 함수에서 필요한 fixture를 인자로 받아 사용할 수 있습니다.

def test_insert_data(setup_database):
    # 필요한 데이터를 데이터베이스에 삽입하는 테스트
    connection = setup_database
    insert_data(connection, "test123")

    # 검증 로직
    assert check_data_exists(connection, "test123")

def test_delete_data(setup_database):
    # 데이터를 삭제하는 테스트
    connection = setup_database
    delete_data(connection, "test123")

    # 검증 로직
    assert not check_data_exists(connection, "test123")

각 테스트 함수는 setup_database fixture를 인자로 받아 데이터베이스 연결을 받습니다. 이를 통해 각 테스트는 독립적으로 실행될 수 있으며, 서로의 영향을 주지 않습니다.

독립적인 테스트를 위한 Test Class 분리

pytest에서는 pytest.mark.parametrize 데코레이터를 사용하여 매개변수화된 테스트를 작성할 수 있습니다. 이를 통해 동일한 테스트를 다양한 입력 값에 대해서 수행할 수 있습니다. 이 기능을 활용하여 독립적인 테스트 클래스를 분리할 수도 있습니다.

예를 들어, 아래와 같이 테스트 클래스를 분리하여 각 테스트 메소드에 다른 매개변수를 제공할 수 있습니다.

import pytest

class TestCalculation:
    @pytest.mark.parametrize("a, b, expected", [
        (1, 2, 3),
        (4, 5, 9),
        (10, 20, 30)
    ])
    def test_addition(self, a, b, expected):
        assert add(a, b) == expected

    @pytest.mark.parametrize("a, b, expected", [
        (1, 2, -1),
        (4, 5, -1),
        (10, 20, -10)
    ])
    def test_subtraction(self, a, b, expected):
        assert subtract(a, b) == expected

위의 코드에서 TestCalculation 클래스는 덧셈과 뺄셈에 대한 테스트를 담고 있습니다. @pytest.mark.parametrize 데코레이터를 사용하여 각 테스트 메소드에 입력 값과 기대값을 제공합니다.

매개변수화된 테스트를 사용하면, 하나의 테스트 클래스 내에서 여러 버전의 테스트를 작성할 수 있습니다. 이로 인해 테스트 간의 의존성이 줄어들고 독립성이 확보됩니다.

결론

pytest는 테스트의 독립성을 보장하기 위한 다양한 기능을 제공합니다. fixture를 사용하여 테스트 간의 의존성을 관리하고, 매개변수화된 테스트를 통해 독립적인 테스트 클래스를 분리할 수 있습니다. 이를 통해 테스트 코드를 더욱 견고하고 유지보수하기 쉽게 작성할 수 있습니다.