파이썬에서 모의와 패치의 차이점
코드 개발은 테스트 병렬 개발(TPD)에서 가장 먼저 이루어집니다. 그래도 개발된 테스트를 작성하고 실행하여 코드의 정확성을 확인합니다(코드를 직접 실행하거나 콘솔을 사용하는 대신).
Python에는 단위 테스트라는 프로세스가 있으며 그 안에 mock
및 patch
기능이 있습니다. 이 문서에서는 두 역할의 용도와 차이점에 대해 설명합니다.
Python에서 Mock
과 Patch
개체 라이브러리의 사용 및 차이점
이 기사에서는 전체적으로 단위 테스트를 다루지 않고 mock
및 patch
기능에 더 중점을 둘 것입니다.
우리는 mock
Python 패키지를 사용하여 테스트 중인 시스템의 특정 구성 요소를 mock
객체로 대체하고 해당 사용법에 대해 주장합니다. Python 표준 라이브러리의 구성 요소이며 Python 3.3부터 unittest.mock
으로 액세스할 수 있습니다.
unittest.mock
클래스를 사용하면 테스트 스위트 전체에서 여러 스텁이 필요하지 않습니다. 특정 작업을 수행한 후 메서드/속성 및 이를 호출한 인수를 사용한 어설션을 설정할 수 있습니다.
반환 값을 지정하고 필요한 기능을 선택할 수 있습니다.
MagicDock은 Mock
의 하위 클래스인 Magic
개체를 처리할 수 있습니다. Mock
및 MagicMock
개체는 우리가 사용할 때 특성과 메서드를 자발적으로 생성하고 사용 정보를 기록합니다.
Mocks는 많은 mocking에서 사용되는 record -> replay
패턴 대신 action -> assertion
(즉, 먼저 mock
을 사용한 다음 수신된 호출에 대해 어설션을 수행함) 패턴을 기반으로 합니다. 프레임워크. 또한 mock
모듈은 테스트 컨텍스트 내에서 패치 클래스 및 모듈 수준 특성을 관리하는 patch()
라는 데코레이터와 고유한 인스턴스를 생성하기 위한 센티널을 제공합니다.
예제 코드:
from unittest.mock import patch
@patch("sample_module.sample_object")
def test_function(mock_object):
print(mock_object)
출력:
<MagicMock name='sample_object' id='1870192341512'>
위의 코드 스니펫은 아래 스니펫과 동일합니다.
def test_function():
with patch("sample_module.sample_module") as mock_object:
print(mock_object)
이 함수를 사용하면 객체를 mock
객체로 대체하여 생산 코드 호출을 피하고 원래 객체가 호출되는 방식을 확인할 수 있습니다(객체가 함수인 경우). 다른 테스트나 프로그램이 영향을 받지 않도록 테스트 후(또는 두 번째 경우 컨텍스트 관리자 범위 이후) 패치가 되돌려지도록 patch
(또는 유사한 방법)를 사용하는 것이 좋습니다.
결론
의사 결정에 도움이 되도록 다음 사항을 참고할 수 있습니다.
- 객체를
모의
객체(또는 다른 객체)로 편리하게 대체하고 완료 후 이전 상태로 복원하거나 예외의 경우패치
데코레이터/컨텍스트 관리자 기능을 사용합니다. mock.patch
는 수동으로 생성할 수 있는mock
또는 파생 개체를 생성합니다. 수동 빌드는 재설정이 필요하지 않은 로컬 함수 또는 기타 모의 객체를 복구하는 데만 사용됩니다.
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn