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