sleep
, HTTP 요청 같은 작업이 실제 실행 시 시간이 오래 걸림.from unittest.mock import patch
@patch('time.sleep', return_value=None) # 즉시 반환
def test_function(mock_sleep):
time.sleep(10) # 실제로 sleep하지 않음
@patch('__main__.a', return_value="Mock A")
def test_b(mock_a):
result = b()
assert result == "Mock A and I'm B"
time.sleep()
을 Mock 처리해 지연 없이 테스트.patch()
또는 MagicMock()
으로 종속성 Mock 처리.MagicMock
MagicMock
은 Mock
의 확장 버전으로, 특별한 매직 메서드(__getitem__
, __setitem__
등)를 자동으로 처리하는 기능을 포함합니다.
from unittest.mock import MagicMock
mock = MagicMock()
mock[0] = "value"
assert mock[0] == "value"
Mock 객체는 메서드나 속성 호출을 대체할 수 있습니다. 이는 테스트 시 실제 객체를 호출하지 않도록 하고, 원하는 동작을 정의할 수 있습니다.
mock = Mock()
# 메서드 호출 시 원하는 값을 반환하도록 설정
mock.method.return_value = "mocked result"
assert mock.method() == "mocked result"
테스트 중 특정 상황에서 예외를 발생시키고 싶은 경우 side_effect
속성을 사용할 수 있습니다.
mock = Mock()
mock.method.side_effect = ValueError("Invalid value")
try:
mock.method()
except ValueError as e:
assert str(e) == "Invalid value"
Mock 객체는 호출 기록을 자동으로 저장하므로, 테스트 중 어떤 메서드가 호출되었는지, 몇 번 호출되었는지 검증할 수 있습니다.
mock = Mock()
mock.method(1, 2, 3)
# 메서드가 호출된 적이 있는지 확인
mock.method.assert_called()
# 호출 시 특정 인자로 호출되었는지 확인
mock.method.assert_called_with(1, 2, 3)
# 호출 횟수 확인
assert mock.method.call_count == 1
return_value
: Mock된 함수나 메서드가 호출되었을 때 반환되는 값을 설정합니다.side_effect
: 함수 호출 시 예외를 발생시키거나 호출된 값에 따라 다른 동작을 정의할 수 있습니다.call_count
: Mock된 함수가 호출된 횟수를 반환합니다.assert_called_with()
: 특정 인자로 호출되었는지 확인할 수 있습니다.assert_not_called()
: 호출되지 않았는지 확인할 수 있습니다.patch
의 추가 활용patch()
는 컨텍스트 관리자로 사용할 수 있어, 특정 블록 내에서만 Mock 처리를 적용할 수 있습니다.
from unittest.mock import patch
def some_function():
return time.time()
# 특정 함수에서만 time.time()을 Mock 처리
with patch('time.time', return_value=12345):
assert some_function() == 12345
# 블록 밖에서는 다시 원래 함수가 동작
assert some_function() != 12345
클래스 내부의 특정 메서드를 Mock 처리하는 것도 가능합니다.
class MyClass:
def method(self):
return "original result"
with patch.object(MyClass, 'method', return_value="mocked result"):
obj = MyClass()
assert obj.method() == "mocked result"