[파이썬] 모의 객체(Mocking)와 스텁(Stub)

Image

모의 객체(Mocking)스텁(Stub)은 소프트웨어 테스트 중에 실제 의존성을 대체하는 기술입니다. 이들은 개발자가 코드를 테스트하고, 외부 의존성과의 상호작용을 제어하며, 미리 정의한 동작을 가로챌 수 있게 해줍니다.

모의 객체(Mocking)

모의 객체는 테스트 중에 실제 객체를 대체하는 것을 의미합니다. 이를 통해 외부 서비스, 데이터베이스, 네트워크 등과의 상호작용을 테스트 중에 제어할 수 있습니다.

Python에서는 unittest 라이브러리의 mock 모듈을 사용하여 모의 객체를 생성하고 동작을 정의할 수 있습니다. 다음은 모의 객체를 사용하는 간단한 예제입니다.

import unittest
from unittest import mock

def get_data_from_api(url):
    # 외부 API로부터 데이터 가져오는 로직
    pass

class MyTest(unittest.TestCase):
    def test_get_data_from_api_success(self):
        with mock.patch('__main__.get_data_from_api') as mock_api:
            mock_api.return_value = "Mocked Data"
            
            result = get_data_from_api("http://example.com")
            
            self.assertEqual(result, "Mocked Data")
            
    def test_get_data_from_api_failure(self):
        with mock.patch('__main__.get_data_from_api') as mock_api:
            mock_api.side_effect = Exception("API Error")
            
            with self.assertRaises(Exception):
                get_data_from_api("http://example.com")

모의 객체는 mock.patch 데코레이터 또는 컨텍스트 매니저를 사용하여 생성됩니다. return_value로 원하는 값을 반환하거나 side_effect를 활용하여 예외를 일으킬 수 있습니다. 이를 통해 테스트 시나리오에 따라 다양한 동작을 설정할 수 있습니다.

스텁(Stub)

스텁은 테스트 중에 특정한 입력에 대해 미리 정의된 출력을 반환하는 가짜 함수 또는 객체입니다. 실제 로직을 실행하지 않고도 의존성 처리를 완료할 수 있습니다.

스텁을 사용하는 예제를 살펴보겠습니다.

class Calculator:
    def add(self, a, b):
        # 복잡한 계산 로직
        pass

class MyTest(unittest.TestCase):
    def test_calculator_add(self):
        calculator = Calculator()
        calculator.add = mock.MagicMock(return_value=10)
        
        result = calculator.add(2, 3)
        
        self.assertEqual(result, 10)

위 예제에서는 Calculator 클래스의 add 메소드를 스텁으로 대체하고 있습니다. 이를 통해 테스트 중에 실제 계산 로직을 실행하지 않고도 원하는 값을 반환할 수 있습니다.

스텁을 사용하면 테스트 코드 작성이 간편해지고, 의도한 대로 객체가 동작하는지 확인할 수 있습니다.


이러한 모의 객체(Mocking)와 스텁(Stub)은 테스트 주도 개발(TDD) 등의 개발 방법론에서 중요한 역할을 합니다. 개발자는 테스트를 작성하고, 원하는 동작을 가진 모의 객체와 스텁을 활용하여 코드의 동작을 검증할 수 있습니다. 이를 통해 안정적이고 견고한 소프트웨어를 개발할 수 있습니다.