[파이썬] 모킹과 스텁을 통한 의존성 제어

의존성을 제어하는 것은 소프트웨어 개발에서 중요한 측면입니다. 의존성이란 한 요소가 다른 요소에 종속되어 있는 관계를 말하며, 이는 코드의 유연성과 테스트 가능성을 결정짓는 핵심적인 요소입니다.

Python에서 의존성을 제어하기 위해 모킹(Mocking)과 스텁(Stub)을 사용할 수 있습니다. 모킹은 실제 객체를 대신하여 원하는 동작을 가진 가짜 객체를 생성하는 것을 의미하며, 스텁은 특정 메서드의 동작을 제어하는 가짜 메서드를 만들어주는 것입니다.

모킹(Mocking)

모킹을 사용하면 코드 내의 외부 의존성을 가지는 객체를 가짜로 대체할 수 있습니다. 이는 특히 테스트 환경에서 외부 리소스에 의존하는 코드를 테스트할 때 유용합니다. 예를 들어, 데이터베이스나 외부 API 호출과 같이 네트워크나 파일 시스템과 관련된 작업을 테스트할 때, 모킹을 통해 실제 의존성을 대체하여 테스트를 수행할 수 있습니다.

모킹 라이브러리 사용하기

Python에서는 unittest.mock 모듈을 통해 모킹을 구현할 수 있습니다. 아래는 간단한 예제입니다.

from unittest.mock import MagicMock

# 모킹할 객체 생성
mock_obj = MagicMock()

# 모킹된 메서드 설정
mock_obj.some_method.return_value = 10

# 모킹된 메서드 사용
result = mock_obj.some_method()
print(result)  # 출력: 10

위 예시에서 MagicMock 클래스를 사용하여 모킹할 객체를 생성합니다. 그리고 return_value를 사용하여 모킹된 메서드의 반환값을 지정할 수 있습니다. 이렇게 모킹된 메서드를 사용할 때에는 실제 동작 대신 설정한 값을 반환하게 됩니다.

스텁(Stub)

스텁은 특정 메서드의 동작을 제어하는 데 사용됩니다. 예를 들어, 외부 의존성이 있는 함수를 테스트할 때, 특정 함수가 호출되었는지 여부를 확인하거나, 특정 매개변수를 받았을 때 원하는 결과를 반환하도록 스텁을 사용할 수 있습니다.

스텁 라이브러리 사용하기

Python에서는 unittest.mock 모듈을 통해 스텁을 구현할 수 있습니다. 아래는 간단한 예제입니다.

from unittest.mock import patch

# 스텁할 함수
def calculate_square(num):
    return num ** 2

# 스텁 설정
@patch('__main__.calculate_square')
def test_calculate_square(mock_calculate_square):
    # 스텁된 함수 설정
    mock_calculate_square.return_value = 25

    # 스텁된 함수 사용
    result = calculate_square(5)
    print(result)  # 출력: 25

# 테스트 수행
test_calculate_square()

위 예시에서 patch 데코레이터를 사용하여 스텁할 함수를 지정합니다. 그리고 return_value를 사용하여 스텁된 함수의 반환값을 설정합니다. 이렇게 설정한 스텁된 함수를 호출하면, 실제 함수 대신 설정한 값을 반환합니다.

결론

Python에서 의존성을 제어하기 위해 모킹과 스텁을 사용할 수 있습니다. 이를 통해 테스트 환경에서 외부 의존성을 대체하거나, 특정 동작을 제어하여 유연하고 효과적인 테스트를 수행할 수 있습니다. 의존성 제어는 코드의 유지보수성을 높이고, 가독성을 향상시킵니다. 적절한 모킹과 스텁을 통해 명확하고 견고한 코드를 작성할 수 있도록 노력해보세요.

참고 자료: Python Mock module documentation