[python] 단위 테스트에서의 외부 리소스(Mock Object, Stub 등) 활용 방법

단위 테스트(unit test)를 작성할 때 외부 리소스(external resources)를 테스트하는 것은 까다로운 문제입니다. 예를 들어, 네트워크 호출, 데이터베이스 액세스 또는 외부 서비스와의 통합과 같은 외부 리소스를 테스트하는 것은 일반적으로 부정적인 영향을 미치거나 불안정성을 초래할 수 있습니다. 하지만 단위 테스트는 소프트웨어의 일부를 격리하고 특정 기능이 올바르게 동작하는지 확인하기 위한 것입니다.

따라서 모의 객체(Mock Object)스텁(Stub)과 같은 테스트 대상 코드와 외부 리소스 간의 의존성을 해결할 수 있는 방법이 필요합니다. 이러한 방법을 활용하여 단위 테스트를 더욱 견고하고 신뢰성 있게 만들 수 있습니다.

모의 객체(Mock Object) 활용하기

모의 객체는 테스트 대상 객체와의 상호작용을 대신하여 제어할 수 있는 가짜 객체입니다. 단위 테스트에서 외부 리소스와의 상호작용을 테스트하는 것을 방지하거나 제어할 수 있게 됩니다. Python에서는 unittest.mock 모듈을 사용하여 모의 객체를 쉽게 생성하고 사용할 수 있습니다.

아래는 모의 객체를 사용하여 외부 리소스와의 상호작용을 제어하는 간단한 예제입니다.

from unittest.mock import Mock

# 모의 객체 생성
mock_database = Mock()

def get_data_from_database():
    # 외부 리소스 대신 모의 객체의 동작을 수행
    return mock_database.query("SELECT * FROM table")
    
# 테스트 케이스
def test_get_data_from_database():
    # 모의 객체의 동작 지정
    mock_database.query.return_value = "Mocked data"
    
    # 테스트 대상 함수 호출
    result = get_data_from_database()
    
    # 검증
    assert result == "Mocked data"

스텁(Stub) 활용하기

스텁은 실제 동작을 대신하여 특정한 값을 반환하는 객체입니다. 외부 리소스의 동작을 제어하거나 특정 값을 반환하여 단위 테스트를 수행할 수 있게 해줍니다.

다음은 스텁을 사용하여 외부 API 호출을 대체하여 단위 테스트를 하는 예제입니다.

from unittest.mock import MagicMock

# 외부 API 호출을 대체하는 스텁
class APIServiceStub:
    def get_data(self, url):
        return {
            "key1": "value1",
            "key2": "value2"
        }

# 테스트 대상 함수
def process_api_data(api_service):
    data = api_service.get_data("http://example.com/api")
    
    # 데이터 처리 로직
    return data["key1"]

# 테스트 케이스
def test_process_api_data():
    # 스텁 생성
    api_stub = APIServiceStub()
    
    # 테스트 대상 함수 호출
    result = process_api_data(api_stub)
    
    # 검증
    assert result == "value1"

모의 객체와 스텁을 통해 외부 리소스를 제어하고 테스트하는 것은 단위 테스트의 견고성을 높이고 외부 의존성을 최소화하는데 도움이 됩니다.

이러한 기법들을 사용하여 단위 테스트를 작성하면 소프트웨어의 품질을 향상시키고 변경에 대해 더욱 안정적으로 대응할 수 있습니다.

결론

외부 리소스를 테스트하는 것은 테스트를 복잡하게 만들고 불안정하게 할 수 있습니다. 하지만 모의 객체와 스텁과 같은 기술을 활용하여 외부 리소스와의 의존성을 관리하고 테스트를 견고하게 만들 수 있습니다. 모의 객체와 스텁은 단위 테스트를 더욱 효과적으로 수행하고 소프트웨어의 품질을 향상시키는 데 중요한 역할을 합니다.

이러한 기술을 적극적으로 활용하여 안정적이고 신뢰성 있는 단위 테스트를 작성하는 것이 중요합니다.


참고 자료: