테스트 코드를 작성할 때, 독립성은 매우 중요한 요소입니다. 독립성은 각각의 테스트가 서로에게 영향을 주지 않고 독립적으로 실행될 수 있는지를 의미합니다. 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를 사용하여 테스트 간의 의존성을 관리하고, 매개변수화된 테스트를 통해 독립적인 테스트 클래스를 분리할 수 있습니다. 이를 통해 테스트 코드를 더욱 견고하고 유지보수하기 쉽게 작성할 수 있습니다.