"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Pytest Monkeypatch 마스터 링 : 테스트를 단순화하십시오

Pytest Monkeypatch 마스터 링 : 테스트를 단순화하십시오

2025-02-09에 게시되었습니다
검색:408

Mastering Pytest Monkeypatch: Simplify Your Testing

파이썬으로 테스트 할 때 신뢰할 수 있고 고립 된 테스트가 중요합니다. 일반적인 과제 중 하나는 테스트 중에 물체와 기능의 동작을 조롱하거나 수정하는 방법입니다. 이곳은 Pytest Monkeypatch Fixture가 빛나는 곳입니다. 테스트 중에 코드의 일부를 동적으로 교체하는 유연한 방법을 제공합니다.

이 블로그에서는 MonkeyPatch의 힘, 유용한 이유 및 깨끗하고 효과적인 테스트를 작성하는 방법을 탐색 할 것입니다.

monkeypatch 란 무엇입니까?

Pytest의 Monkeypatch 비품을 사용하면 다음을 수정하거나 교체 할 수 있습니다.
  • 함수 또는 방법
  • 객체의 속성
  • 환경 변수

이 동적 수정은 일시적이며 테스트 범위에만 적용되므로 테스트가 끝나면 원래 동작이 복원되도록합니다. 이렇게하면 MonkeYpatch가 영구적으로 변경되지 않고 특정 조건에서 조롱, 의존성을 재정의하거나 테스트 코드에 특히 유용합니다.

원숭이를 사용하는 이유는 무엇입니까?

MonkeyPatch가 테스트를 단순화 할 수있는 몇 가지 주요 시나리오가 있습니다.
  1. 조롱 종속성
  2. : 외부 종속성을 모의 개체 또는 기능으로 교체하여 격리 된 장치를 테스트합니다.
  3. 테스트 가장자리 케이스
  4. : 예외 또는 특정 반환 값과 같은 에지 케이스 동작을 시뮬레이션합니다.
  5. 임시 환경 변경
  6. : 구성 별 논리 테스트를위한 환경 변수 수정.
  7. 메소드 교체
  8. : 클래스 또는 모듈의 메소드를 일시적으로 무시합니다.

monkeypatch 사용의 예

1. 함수 조롱


외부 API에 의존하는 함수가 있다고 가정합니다 :

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
# my_app.py def fetch_data () : # API 호출을 시뮬레이션합니다 "실제 API 응답"반환


실제로 API를 호출하지 않고 논리를 테스트하려면 fetch_data를 조롱 할 수 있습니다 :

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
# test_my_app.py my_app import에서 fetch_data에서 def test_fetch_data (monkeypatch) : def mock_fetch_data () : "조롱 된 응답"반환 monkeypatch.setattr ( "my_app.fetch_data", mock_fetch_data) assert fetch_data () == "조롱 된 응답"

2. 환경 변수를 우선합니다


환경 변수에 의존하는 함수를 테스트하고 있다고 상상해보십시오 :

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
# config.py OS 가져 오기 def get_database_url () : return os.getenv ( "database_url", "default_url")


monkeypatch를 사용하여 다른 환경을 시뮬레이션 할 수 있습니다.

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
# test_config.py config import get_database_url에서 def test_get_database_url (monkeypatch) : monkeypatch.setenv ( "database_url", "mocked_url") Assert get_database_url () == "mocked_url"

3. 클래스에서 메소드 조롱


클래스 내에서 메소드를 일시적으로 교체 해야하는 경우 :

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
# my_class.py 수업 계산기 : def add (self, a, b) : a b


조롱 된 방법으로 동작을 테스트하십시오 :

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
# test_my_class.py my_class 가져 오기 계산기에서 def test_calculator_add (monkeypatch) : def mock_add (self, a, b) : 반환 42 monkeypatch.setattr (계산기, "add", mock_add) calc = calculator () calc.add (1, 2) == 42를 주장하십시오

4. 내장 기능 조롱


특정 시나리오를 위해 내장 기능을 조롱 할 수도 있습니다.

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
# my_module.py def is_file_openable (filename) : 노력하다: Open (filename, "r")을 사용하여 : 진실을 반환하십시오 ioerror를 제외하고 : 거짓을 반환하십시오


다른 행동을 시뮬레이션하기 위해 오픈 오픈 :

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
# test_my_module.py my_module에서 import is_file_openable def test_is_file_openable (monkeypatch) : def mock_open (파일 이름, 모드) : Ioerror를 올리십시오 ( "mocked ioerror") monkeypatch.setattr ( "buildins.open", mock_open) is_file_openable ( "test.txt")

monkeypatch와 함께 모범 사례
  1. scope
  2. : 부작용을 피하기 위해 테스트 범위 내에서만 monkeypatch를 사용하십시오.
  3. 과용을 피하십시오
  4. : 의존성 주입 또는 기타 디자인 패턴이 실현할 수없는 시나리오에 대한 원숭이를 예약하십시오.
  5. 명시 적 경로 사용
  6. : 속성을 설정할 때 우발적 인 수정을 방지하기 위해 명시 적 모듈과 객체 경로를 제공하십시오.
  7. 기본값 복원
  8. : monkeypatch는 원래 상태를 자동으로 복원하지만 테스트를 단순하게 유지하기 위해 체인 또는 둥지를 피하십시오.

결론

Pytest의 MonkeyPatch는 고립되고 신뢰할 수 있으며 깨끗한 테스트를 작성하는 강력한 도구입니다. 함수를 조롱하거나 환경 변수를 우선적이든 테스트 모서리 케이스에 관계없이 MonkeyPatch는 테스트 워크 플로를 크게 단순화 할 수 있습니다.

여기에 설명 된 예제와 모범 사례를 통합하여 테스트 스위트를 강력하고 유지 관리 할 수 ​​있습니다. 공식 Pytest 문서를 탐색하여 자세한 내용을 배우고 Pytest의 잠재력을 최대한 활용하십시오!

행복한 테스트!

릴리스 선언문 이 기사는 https://dev.to/mohamedabdelwahab/mas
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3