Python 테스트 모범 사례

젊었을 때 파이톤을 전문적으로 사용해 왔던 사람으로서 저는 테스트와 프로젝트 설정에 대한 최선의 실천이 저에게 좋은 것 같습니다.오늘은 여러분과 나누고 싶습니다.
TL;DR: 데모 코드가 포함된 재구매 프로토콜: Maddosaurus/pytest-practice.

프로젝트 설정


프로젝트 설정은 Kenneth ReitzHitchhiker's Guide To Python를 기반으로 합니다.그것은 단독 모듈의 이념을 따르고 같은 등급의 테스트와 지원 정보를 덧붙인다. 즉 모듈 자체에 포함되지 않는다.이것은 모듈을 간소화시켰다.
# Module containing the code
pytdemo/pytdemo.py
pytdemo/util.py
# Testsuite
tests/conftest.py
tests/test_pytdemo.py
tests/test_util.py
# Supporting information
.gitignore
LICENSE
README.md
requirements.txt
setup.py
보시다시피 모듈 자체는 기본 요소만 포함한다.테스트 세트의 조직은 대체적으로 서브 모듈을 맞추기 위한 것이지만, 이것은 내가 비교적 작은 모듈에만 쓸 생각이다.만약 하위 모듈이 더 크고 복잡해진다면, 나는 행위나 논리 그룹에 따라 테스트를 그룹으로 나누는 경향이 있다.

테스트 설정


개인적으로 저는 pytest, unittest.mock.MagicMockrequests-mock의 혼합체를 사용합니다. 모듈이 직접 requests와 REST API가 상호작용할 때만 마지막 것을 사용합니다.
일반적인 건의로서, 당신은 테스트 범위율을 감시해야 합니다.이를 위해 저는 pytest-cov을 즐겨 사용합니다. 이것은 기능이 강한 도구로 --cov-report html 옵션을 통해 예쁜 보고서를 생성할 수 있습니다.
알림: 목표가 100% 범위인 것은 좋은 일이지만 강제 집행을 시도하지 마십시오.이것은 매우 지루할 수도 있고, 때로는 불가능할 수도 있다.반대로 프로젝트의 모든 기능에서 중요한 부분을 덮어쓰는 것에 동의하는 현명한 목표를 찾아보자.

테스트 파일


폴더에 conftest.py 가 있다는 것을 알아차렸을 수도 있습니다. tests이 파일은 모든 테스트 파일에 사용할 수 있는 공유pytest fixtures를 저장하는 데 사용됩니다.특히 도움말 함수와 데이터 원본에 대해서는 이렇게 하는 것을 강력히 권장합니다.
예시 코드에서,fixture를 찾을 것입니다. 이것은 주 모듈의 사용자 정의 실례를 만들었고,localhost를 가리키는 URL을 포함합니다.이것은 당신의 아날로그 단점이 모든 호출을 포착하지 않아도 당신이 가장 먼저 알 수 있도록 하기 위해서입니다. (또한, 우리는 테스트를 기반으로 하는 요청으로 진정한 서비스를 공격하는 것을 피하고 있습니다.)

헝<unk>을 깁는 원숭이


테스트를 작성할 때 문제가 있습니다. 가능한 한 작고 부작용이 없기를 바랍니다.이것은 테스트 대상(SUT)이 호출 중인 다른 함수에 대한 모든 호출을 시뮬레이션할 수 있습니다.Pytest는 다양한 메커니즘을 제공함으로써 이 점을 실현했다. 그 중에서 monkeypatch 는 내가 가장 좋아하는 것이다. 왜냐하면 이것은 가독성과 명확성 사이에 균형을 이루기 때문이다.
예를 들면 다음과 같습니다.
def test_get_all_URL(crt_mock, monkeypatch):
    # Set up a mock that will replace the requests module in CrtSh and use it
    # The MagicMock class comes in handy as it does a lot in the background for us.
    requests_mock = MagicMock()
    monkeypatch.setattr(pytdemo.requests, "get", requests_mock)

    crt_mock.get_all("testhost.domain")

    # Check it the requests module was called with the correct URL
    requests_mock.assert_called_once_with(
        "https://test.local/",
        params={"Identity": "testhost.domain", "output": "json"}
    )
이 예에서 requests 의 get 함수는 사용자 정의 MagicMock 대상에 의해 대체되며, 이 대상은 호출할 때마다 저장됩니다.
보시다시피 테스트는 세 부분으로 나뉜다.
  • 일정 관리 - 필요한 모든 변수, 데이터 및 시뮬레이션 설정
  • Act-Call SUT
  • 단언-검사결과의 정확성
  • 이런 삼중 구조는 가독성을 높인다. 관례는 통상적으로 팀 업무를 간소화하는 데 도움이 된다.실제로 이것은 모두가 알고 있는 모델입니다. AAA - Arrange, Act, Assert 라고 합니다. 더 좋은 단원 테스트를 작성하는 것에 관심이 있다면, 그것에 관한 내용을 많이 읽어 주십시오.
    보시다시피 서로 다른 Python 도구를 결합하여 테스트를 진행하면 테스트를 신속하고 쉽게 구축할 수 있는 강력한 설정을 만들 수 있습니다.

    마지막 생각


    나의 이 문장은 단지 평범하게 이야기할 뿐이다.시간의 흐름에 따라 저는 여러분과 더 많은 모듈과 최선의 실천을 공유하여 당신의 파이톤 개발 생활을 더욱 가볍게 하고 싶습니다.
    지금, 테스트는 속도를 느리게 느끼게 할 수도 있지만, 실제로는 현재의 속도를 유지할 수 있다는 것을 명심하세요.좋은 단원 테스트를 작성하면 모듈의 모든 부분이 예상대로 작동하고 예상된 작업 상태를 유지할 수 있습니다. 코드를 변경하고 재구성할 때도 마찬가지입니다.이것 또한 테스트를 자주 실행해야 한다는 것을 의미하므로 가능한 한 빨리 실행할 수 있도록 하십시오.
    마지막으로 작성할 가장 중요한 테스트는 오류 통지서의 컨텍스트에서 작성된 테스트일 수 있습니다.
    오류를 복구하기 전에 단원 테스트를 통해 오류를 재현해 보십시오.이러한 조작 순서에 따라 버그가 복구되었는지 확인하고 다음 단계에 다시 나타나지 않을 수 있으니 테스트를 진행하세요!

    좋은 웹페이지 즐겨찾기