[파이썬] pytest 테스트 파라미터화 확장하기

pytest는 파이썬 기반의 테스트 프레임워크로, 간단하고 유연한 테스트 작성을 위한 많은 기능을 제공합니다. pytest의 중요한 기능 중 하나는 테스트 파라미터화입니다. 이 기능을 사용하면 하나의 테스트 케이스를 여러 다른 입력 값과 함께 반복해서 실행할 수 있습니다.

테스트 파라미터화를 사용하면 반복적인 테스트 작성을 줄일 수 있고, 다양한 입력 값에 대한 테스트를 간편하게 작성할 수 있습니다. 이제 이 기능을 더욱 확장해보도록 하겠습니다.

@pytest.mark.parametrize

pytest에서 테스트 파라미터화를 하기 위해 사용하는 데코레이터는 @pytest.mark.parametrize입니다. 예를 들어, 아래와 같이 간단한 덧셈 테스트를 작성해보겠습니다.

import pytest

def add(a, b):
    return a + b

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (2, 3, 5),
    (10, -5, 5)
])
def test_add(a, b, expected):
    assert add(a, b) == expected

위의 예제에서는 @pytest.mark.parametrize 데코레이터를 사용하여 a, b, expected라는 세 가지 파라미터를 정의하고, 이 파라미터들에 대한 여러 개의 입력 값을 리스트로 전달합니다. 테스트 함수 test_add는 이 파라미터들을 입력으로 받아 테스트를 수행하고, 각각의 입력 값에 대해서 예상되는 결과와 일치하는지 확인합니다.

테스트 파라미터 동적 생성

테스트 파라미터를 리스트로 정의하는 것 외에도, pytest는 파라미터를 동적으로 생성할 수 있는 기능도 제공합니다. 이를 활용하면 테스트 파라미터를 더 유연하게 생성할 수 있습니다.

import pytest

def get_test_parameters():
    return [(1, 2, 3), (2, 3, 5), (10, -5, 5)]

@pytest.mark.parametrize("a, b, expected", get_test_parameters())
def test_add(a, b, expected):
    assert add(a, b) == expected

위의 예제에서는 get_test_parameters라는 함수를 통해 테스트 파라미터를 동적으로 생성합니다. 이를 @pytest.mark.parametrize의 호출 인자로 전달하여 사용합니다. 이렇게 하면 테스트 파라미터를 동적으로 관리할 수 있으며, 필요에 따라 파라미터를 추가하거나 수정할 수 있습니다.

커스텀 픽스처와 테스트 파라미터

pytest의 다른 기능 중 하나는 커스텀 픽스처입니다. 픽스처는 테스트 함수가 실행되기 전에 필요한 리소스를 설정하거나 테스트 후에 정리하는 등의 작업을 수행하는 함수입니다. 이와 테스트 파라미터화를 결합하여 효율적인 테스트 작성을 할 수 있습니다.

import pytest

def setup_db():
    # 데이터베이스 연결 설정
    ...

def teardown_db():
    # 데이터베이스 연결 종료
    ...

@pytest.fixture(scope="module")
def db():
    setup_db()
    yield
    teardown_db()

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (2, 3, 5),
    (10, -5, 5)
])
def test_add(db, a, b, expected):
    assert add(a, b) == expected

위의 예제에서는 db라는 커스텀 픽스처를 정의하여 데이터베이스 연결 설정 및 종료를 처리합니다. 이 픽스처를 test_add 테스트 함수에 적용하고, 테스트 파라미터와 함께 사용합니다. 이렇게 함으로써 각 테스트 파라미터마다 데이터베이스를 설정하고 정리할 수 있으며, 테스트 중에 필요한 리소스를 효율적으로 관리할 수 있습니다.

결론

pytest에서 테스트 파라미터화 기능을 활용하면 다양한 입력 값에 대한 테스트를 쉽게 작성할 수 있습니다. 이를 확장하여 테스트 파라미터를 동적으로 생성하거나 커스텀 픽스처와 함께 사용하는 등의 방법으로 테스트 작성의 유연성과 효율성을 높일 수 있습니다. 이러한 pytest의 기능을 적극 활용하여 테스트 코드의 품질을 향상시키고, 개발 프로세스의 효율성을 높이는데 도움이 될 것입니다.

더 많은 pytest 기능에 대해 알고 싶다면 공식 문서를 참조해주세요.