pytest의 --collect-only 출력 개선

이 에세이에서 저는 this year’s hacktoberfest 에서 열린 pull-request 중 하나에 대해 더 깊이 파고들고 싶습니다. pytest는 특히 pytest-3.6.4 이상에서 볼 수 있는 조명기 섹션에서 몇 가지 문서 개선에 기여한 훌륭한 프로젝트입니다. 나는 pytest에 기여하려고 시도했는데, 나는 몇 년 동안 행복한 사용자였기 때문에 이 프로젝트는 Python의 생태계에서 중요하고 Python 기반 프로젝트를 연습하고 싶습니다. 이제 더 많은 Kotlin 및 전문적으로 이동합니다.

문제의 내용



그 메모에서, 나는 몇 주 전에 pytest 의 문제를 살펴보고 pytest 의 코드베이스에서 내 발을 적시기에 완벽한 문제를 발견했습니다. 문제#7701에서는 pytest--collect-only와 함께 사용하는 출력이 사용자에게 혼란을 주고 수집된 전체 그림을 얻으려면 테스트 실행 시작 부분까지 스크롤해야 한다고 언급했습니다.

왜 이런 일이 발생합니까? 현재 --collect-only , pytest 를 사용할 때 선택 해제된 테스트 수와 선택 해제하는 데 걸린 시간만 출력합니다. 예로서:

# Taken from examples in #7701.

# pytest --collect-only
==== no tests ran in 1.66s ====
# pytest --collect-only -k filter
==== 544 deselected in 1.67s ====


이렇게 하면 발견된 테스트 수 및 수집된 테스트 수와 같은 몇 가지 중요한 정보가 누락됩니다. 게다가 문제를 복잡하게 하기 위해 출력은 테스트를 수집하지 않으면 "실행된 테스트 없음"이라고 표시되는데, 이는 --collect-only 테스트를 실행하지 않아야 하기 때문에 혼란스럽습니다.

솔루션



출력을 덜 혼란스럽게 만들기 위해 기자는 다음과 같이 선택된 테스트의 수를 표시하는 출력이 있어야 한다고 제안합니다.

# Example from #7701.

# pytest --collect-only
==== 123 selected, no tests ran in 1.66s ====
# pytest --collect-only -k filter
==== 123 selected, 544 deselected in 1.67s ====


기자인 나와 pytest 의 관리자 중 한 명과 약간의 토론 끝에 다음과 같은 결론에 도달했습니다.
  • 선택 및 선택 해제된 테스트의 수를 표시해야 합니다.
  • 수집된 총 테스트 수를 표시해야 합니다.
  • 출력에서 ​​no tests ran를 제거해야 합니다.

  • 우리는 다음과 같은 제안으로 끝을 맺었습니다.

    === 10/50 tests found (40 deselected) in 1.23s ===
    === 50 tests found in 1.23s ===
    


    이렇게 하면 실행이 끝날 때 어떤 테스트가 수집, 선택 및 선택 해제되었는지에 대한 정확한 정보를 전달하여 이 정보를 매우 쉽게 읽을 수 있습니다. 또한 --collect-only 기능이 의미하는 압축되고 직관적인 버전입니다. 또한 이것은 -k 옵션을 사용하여 --collect-only 를 사용하는 동안 테스트를 필터링하는 경우에도 적용됩니다.

    만들어진 것



    문제를 이해했기 때문에 코드베이스에서 이것이 변경이 필요한 부분과 기여하고 싶은 부분을 이해하고 --collect-only 의 출력을 개선하기 위해 변경하여 PR#7875을 열었습니다. 문서를 변경하고 새로운 동작과 일치하도록 테스트를 수정하는 것 외에도 src/_pytest/terminal.py 에 특정한 다음 논리를 추가하여 build_summary_stats_line 함수에서 --collect-only 를 변경했습니다.

            if self.config.getoption("collectonly"):
    
                if self._numcollected == selected:
                    co_output = "%d %s found" % _make_plural(self._numcollected, "test")
                else:
                    deselected = self._numcollected - selected
                    co_output = f"{selected}/{self._numcollected} tests found ({deselected} deselected)"
    
                parts = [(co_output, {main_color: True})]
    
                # Sticking with "0/0 tests found (0 deselected)" would be confusing.
                if self._numcollected == 0:
                    parts = [("no tests found", {_color_for_type_default: True})]
    
                # Sanity check for errors that might have ocurred. Otherwise, it
                # will never let the user know that an error ocurred during
                # collection.
                if errors:
                    color = _color_for_type.get(key, _color_for_type_default)
                    markup = {color: True, "bold": color == main_color}
                    parts = [("%d %s" % _make_plural(errors, "error"), markup)]
    


    아직 검토 중이고 pytest에 PR이 많아서 병합될 때까지 시간이 조금 걸릴 수 있지만 프로젝트에 대한 좋은 기여라고 생각하고 흥미로운 도전이었습니다.
    pytest 또한 대부분 사전 예방적이며 가능한 한 쉽게 기여할 수 있도록 PR 및 문제를 안내하는 놀라운 코드 유지 관리자가 있습니다. 오픈 소스 생태계에서 초보자 기여에 대한 많은 걱정을 덜어줍니다.

    좋은 웹페이지 즐겨찾기