[파이썬] unittest mock 객체와 가짜 객체의 차이

테스트 작성은 소프트웨어 개발 과정에서 매우 중요합니다. 테스트가 없거나 부족하다면 버그가 발생할 가능성이 높아지고, 코드의 신뢰성이 떨어질 수 있습니다. Python에서 unittest 모듈은 테스트 작성을 도와주는 강력한 도구입니다.

Unittest Mock 객체가짜 객체는 테스트 중에 다른 객체를 대체하는데 사용되는 기능입니다. 하지만 두 가지 개념은 서로 다른 용도와 동작 방식을 가지고 있습니다. 이번 글에서는 unittest Mock 객체와 가짜 객체의 차이에 대해 알아보겠습니다.

Unittest Mock 객체

Unittest 모듈의 Mock 객체는 테스트 중 다른 객체를 대체하는데 사용됩니다. Mock은 테스트할 때 목적에 맞게 객체를 만들어내는 동작을 흉내내는 것입니다.

예를 들어, 다음과 같이 Mock 객체를 생성하고 메서드를 호출할 수 있습니다.

from unittest.mock import Mock

# Mock 객체 생성
mock_obj = Mock()

# 메서드 호출
mock_obj.some_method()

Mock 객체는 실제 객체와 비슷하지만, 테스트 할 때 용도에 맞게 행동을 변경할 수 있습니다. 예를 들어, 호출된 메서드의 반환값을 정의하거나, 호출된 횟수를 세어볼 수도 있습니다. 이를 통해 원하는 대로 테스트 환경을 조작할 수 있습니다.

# 호출된 메서드의 반환값 정의
mock_obj.some_method.return_value = 100

# 메서드 호출
result = mock_obj.some_method()
print(result)  # 출력: 100

# 메서드가 얼마나 호출되었는지 확인
print(mock_obj.some_method.called)  # 출력: True
print(mock_obj.some_method.call_count)  # 출력: 1

Unittest의 Mock 객체는 테스트 케이스 작성 시 실제 객체를 Mock으로 대체하여 원하는 동작을 흉내내게 해줍니다. 이를 활용하여 의존성 객체를 대체해 테스트를 수행하거나, 특정 상황에서 발생할 수 있는 오류를 재현하는 등의 작업을 수행할 수 있습니다.

가짜 객체

가짜 객체는 테스트 중에 사용되는 가짜 클래스입니다. 실제로 존재하지 않는 클래스지만, 테스트를 위해 필요한 동작을 정의하거나 재현할 수 있습니다. 가짜 객체는 실제 객체와 유사한 방식으로 동작하며, 특정 메서드를 호출하거나 속성에 접근할 때 원하는 결과를 반환할 수 있습니다.

예를 들어, 다음과 같이 가짜 객체를 생성하고 메서드의 동작을 정의할 수 있습니다.

class FakeObject:
    def some_method(self):
        return 100

# 가짜 객체 인스턴스 생성
fake_obj = FakeObject()

# 메서드 호출
result = fake_obj.some_method()
print(result)  # 출력: 100

가짜 객체는 주로 특정 테스트 시나리오를 재현하기 위해 사용됩니다. 예를 들어, 네트워크 요청을 테스트한다고 가정해보겠습니다. 실제로 네트워크 요청을 보내는 것은 테스트에 부적합하고, 시간이 오래 걸릴 수 있습니다. 이 경우 가짜 객체를 사용하여 네트워크 요청을 흉내내고, 원하는 응답을 반환할 수 있습니다.

결론

Unittest의 Mock 객체와 가짜 객체는 테스트를 위해 다른 객체를 대체하는데 사용되는 기능이지만, 서로 다른 용도와 동작 방식을 가지고 있습니다.

Unittest Mock 객체는 실제 객체를 대체하여 원하는 동작을 흉내내는데 사용되며, 테스트 케이스 작성 시 의존성 객체를 대체하거나 특정 상황을 재현하는 데 유용합니다.

가짜 객체는 실제로 존재하지 않지만, 실제 객체와 유사한 방식으로 동작하며 테스트를 위해 필요한 동작을 정의할 수 있습니다. 가짜 객체는 특정 시나리오를 재현하거나, 테스트하기 어려운 환경을 모의할 때 유용합니다.

테스트 작성시에는 각각의 특징과 용도에 맞게 Unittest의 Mock 객체와 가짜 객체를 활용하여 효율적이고 신뢰성 높은 테스트를 작성할 수 있습니다.