[파이썬] pytest 의존성 주입을 활용한 테스트

pytest는 파이썬으로 작성된 테스트 프레임워크로써, 테스트 케이스를 작성하고 실행하는 데 매우 유용합니다. 이번 글에서는 pytest의 의존성 주입(Dependency Injection)을 활용한 테스트에 대해 알아보겠습니다.

의존성 주입은 객체지향 프로그래밍에서 클래스가 다른 클래스의 인스턴스를 생성하거나 사용할 때, 그 의존성을 변경 또는 대체할 수 있도록 하는 디자인 패턴입니다. pytest에서 의존성 주입을 사용하면 테스트 케이스에서 테스트에 필요한 객체를 대체하거나 모의 객체(Mock)를 주입하여 테스트를 더 유연하고 견고하게 만들 수 있습니다.

pytest에서 의존성 주입의 이점

pytest의 의존성 주입은 테스트의 유연성과 견고성을 높여줍니다.

테스트 케이스 간의 의존성 제거

일반적으로 테스트 케이스는 다른 모듈이나 클래스에 의존합니다. 만약 이러한 의존성이 테스트 케이스에 하드코딩되어 있다면, 특정 모듈이나 클래스를 변경할 때마다 테스트 케이스도 함께 수정해야 할 수도 있습니다. 하지만 pytest의 의존성 주입을 사용하면 테스트 케이스의 의존성을 별도의 객체로 주입하므로, 테스트 케이스가 다른 모듈이나 클래스의 변경에 영향받지 않고 독립적으로 실행될 수 있습니다.

모의 객체(Mock)를 사용한 테스트

pytest의 의존성 주입은 모의 객체(Mock)를 사용한 테스트에도 매우 유용합니다. 모의 객체는 실제 객체의 동작을 모방한 가짜 객체로써, 원하는 결과를 강제로 반환하거나 메소드의 호출 여부를 확인할 수 있습니다. 이를 통해 외부 의존성(네트워크 호출, 데이터베이스 연결 등)이 필요한 테스트를 격리하여 더 빠르고 신뢰할 수 있는 테스트를 작성할 수 있습니다.

pytest에서 의존성 주입 사용하기

pytest에서 의존성 주입을 사용하기 위해서는 pytest.fixture 데코레이터를 사용하여 의존성을 주입할 객체를 정의해야 합니다. 이 객체는 일반적으로 테스트 케이스에서 필요한 기능을 제공하는 모듈이나 클래스입니다. 예를 들어, 다음과 같이 my_module이라는 모듈에 의존하는 테스트 케이스를 작성한다고 가정해보겠습니다.

import pytest
import my_module

@pytest.fixture
def my_module_fixture():
    return my_module

위의 예제에서 my_module_fixture 함수는 my_module을 반환하는 fixture입니다. 이 fixture를 테스트 케이스의 인자로 넘기면, 테스트 케이스에서 my_module에 접근할 수 있게 됩니다.

def test_my_module(my_module_fixture):
    # my_module_fixture을 사용하여 테스트 수행
    assert my_module.some_function() == expected_result

pytest 커맨드로 테스트를 실행하는 경우, pytest는 의존성 주입을 통해 필요한 객체를 자동으로 인스턴스화하고 테스트 케이스로 주입합니다. 따라서 테스트 코드에서는 생성한 객체를 직접 사용하기만 하면 됩니다.

결론

pytest의 의존성 주입을 활용하면 테스트 케이스 간의 의존성을 줄일 수 있으며, 모의 객체(Mock)를 사용하여 외부 의존성을 격리한 테스트를 작성할 수 있습니다. 이를 통해 테스트의 유연성과 견고성을 높여 효율적인 테스트를 작성할 수 있습니다.