programing

pytest 실행 중에 생성된 일반 인쇄 출력을 보려면 어떻게 해야 합니까?

copysource 2022. 12. 10. 14:13
반응형

pytest 실행 중에 생성된 일반 인쇄 출력을 보려면 어떻게 해야 합니까?

가끔 코드에 인쇄문을 삽입하고 연습할 때 인쇄되는 내용을 보고 싶을 때가 있습니다.제가 평소에 "운동"하는 방법은 기존의 화이팅 테스트로 하는 것입니다.그러나 이러한 기능을 실행하면 표준 출력을 볼 수 없습니다(적어도 PyCharm, IDE 내부에서는).

파이 테스트 실행 중에 표준 출력을 볼 수 있는 간단한 방법이 있습니까?

스위치는 테스트 단위의 캡처를 디세블로 합니다(테스트에 실패했을 경우에만).

-s --capture=no.

pytest는 개별 테스트에서 stdout을 캡처하여 기본적으로 인쇄되는 테스트의 요약과 함께 특정 조건에서만 표시합니다.

추가 요약 정보는 '-r' 옵션을 사용하여 표시할 수 있습니다.

pytest -rP

에, 합격한 테스트의 캡처 출력을 나타냅니다.

pytest -rx

에 실패한 테스트의 캡처 출력을 나타냅니다(디폴트 동작).

출력 포맷은 -s보다 -r이 더 예쁩니다.

승인된 답변에 대한 상향식 코멘트에서 Joe는 다음과 같이 묻습니다.

콘솔에 인쇄하여 junit 보고서에 표시되도록 출력을 캡처할 수 있는 방법이 있습니까?

UNIX 에서는, 이것을 보통 티잉이라고 부릅니다.py.test 기본값이 캡처가 아닌 티잉이 이상적입니다.Python은 즉시 티잉을 지원하지만 py.test나 기존 서드파티 py.test 플러그인(어쨌든...)은 티잉을 지원하지 않습니다.

지원되지 않는 작업을 수행하기 위한 원숭이 패칭 py.test는 간단하지 않습니다. 이유가 무엇입니까?이유:

  • 의 py py.test 뒤에 ._pytest외부로부터의 Import를 의도하지 마십시오.자신이 무엇을 하고 있는지 모르는 상태에서 그렇게 하려고 하면 일반적으로 일반에 알려지게 됩니다.pytest실행 시 불분명한 예외가 발생하는 패키지입니다.Thanks alot, py.test. Really robust architecture you got there.
  • 심지어 어떻게 이 일병을 잡을 수 있는지 알아내더라도_pytestAPI는 안전한 방법으로 공개 실행 전에 실행해야 합니다.pytest " "에 "py.test명령어를 입력합니다.플러그인에서는 이 작업을 수행할 수 없습니다(예: 최상위 수준).conftest모듈)을 참조하십시오.py.test가 플러그인을 동적으로 Import할 때까지 monkey-patch를 원하는 py.test 클래스는 이미 인스턴스화 되어 해당 인스턴스에 액세스할 수 없습니다.이는 원숭이 패치가 의미 있게 적용되도록 하려면 더 이상 외부 패치를 안전하게 실행할 수 없음을 의미합니다.py.test명령어를 입력합니다.하여 이 .test대로)
    1. 원숭이가 _pytestAPI.API.
    2. 을 호출하다pytest.main()하는 py.test명령어를 입력합니다.

답변은 py의 "monkey-patches py.test"입니다.-s ★★★★★★★★★★★★★★★★★」--capture=nostderr을 캡처할 수 있지만 stdout은 캡처할 수 없습니다.기본적으로 이러한 옵션은 stderr도 stdout도 캡처하지 않습니다.물론 이건 티가 많이 나진 않아요.하지만 모든 위대한 여정은 5년 동안 모두가 잊고 있는 지루한 프리퀄에서 시작된다.

왜 이러는 거야?이제 말해줄게.py.test-drived 테스트 스위트에는 느린 기능 테스트가 포함되어 있습니다.이러한 테스트의 stdout을 표시하는 것은 도움이 되고 안심할 수 있으며, 레이섹이 다음 테스트에 도달하는 것을 방지합니다.killall -9 py.test또 다른 장기간에 걸친 기능 테스트가 몇 주 동안 계속 실패했을 때.단, 이러한 테스트의 stderr을 표시하면 py.test는 테스트 실패 시 예외 트레이스백을 보고하지 않습니다.그건 전혀 도움이 안 돼요따라서 stderr을 캡처하도록 py.test를 강제하지만 stdout은 캡처하지 않습니다.

설정되어 것을 로 하고 있습니다.testpy.test를 호출하는 명령어.그렇지 않으면 py.test의 잘 작성된 모범 사례 페이지의 수동 통합 하위 섹션을 참조하십시오.

사용자 지정 setuptools를 제공하는 서드파티 setuptools 플러그인인 pytest-runner를 설치하지 마십시오.test시험하다pytest-runner가 이미 설치되어 있는 경우 해당 pip3 패키지를 제거한 후 위에 링크된 수동 방식을 채택해야 합니다.

위에 강조 표시된 수동 통합의 지침을 따랐다고 가정하면 코드베이스에는PyTest.run_tests() 다음같이 .

class PyTest(TestCommand):
             .
             .
             .
    def run_tests(self):
        # Import the public "pytest" package *BEFORE* the private "_pytest"
        # package. While importation order is typically ignorable, imports can
        # technically have side effects. Tragicomically, that is the case here.
        # Importing the public "pytest" package establishes runtime
        # configuration required by submodules of the private "_pytest" package.
        # The former *MUST* always be imported before the latter. Failing to do
        # so raises obtuse exceptions at runtime... which is bad.
        import pytest
        from _pytest.capture import CaptureManager, FDCapture, MultiCapture

        # If the private method to be monkey-patched no longer exists, py.test
        # is either broken or unsupported. In either case, raise an exception.
        if not hasattr(CaptureManager, '_getcapture'):
            from distutils.errors import DistutilsClassError
            raise DistutilsClassError(
                'Class "pytest.capture.CaptureManager" method _getcapture() '
                'not found. The current version of py.test is either '
                'broken (unlikely) or unsupported (likely).'
            )

        # Old method to be monkey-patched.
        _getcapture_old = CaptureManager._getcapture

        # New method applying this monkey-patch. Note the use of:
        #
        # * "out=False", *NOT* capturing stdout.
        # * "err=True", capturing stderr.
        def _getcapture_new(self, method):
            if method == "no":
                return MultiCapture(
                    out=False, err=True, in_=False, Capture=FDCapture)
            else:
                return _getcapture_old(self, method)

        # Replace the old with the new method.
        CaptureManager._getcapture = _getcapture_new

        # Run py.test with all passed arguments.
        errno = pytest.main(self.pytest_args)
        sys.exit(errno)

이 monkey-patch를 활성화하려면 다음과 같이 py.test를 실행합니다.

python setup.py test -a "-s"

이제 stderr가 아닌 stdout이 생포됩니다.니프티!

상기 몽키패치를 Tee stdout 및 stderr까지 확장하는 것은 빈 시간이 많은 배럴을 통해 독자에게 연습으로 남긴다.

시 " " " 를 사용합니다.-s★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★exampletest.py이치

py.test exampletest.py -s

pytest 문서에 따르면 pytest 버전 3은 테스트에서 캡처를 일시적으로 비활성화할 수 있습니다.

def test_disabling_capturing(capsys):
    print('this output is captured')
    with capsys.disabled():
        print('output not captured, going directly to sys.stdout')
    print('this output is also captured')

pytest --capture=tee-sys최근에 추가되었습니다(v5.4.0).stdout/err에 대한 출력뿐만 아니라 캡처도 할 수 있습니다.


콘솔에서 자세한 내용을 확인하십시오.

-v 짧다

-s 는 '모든 캡처를 무효로 한다'를 의미합니다.



에서 다음을 설정하여 라이브 로깅을 활성화할 수도 있습니다.pytest.ini ★★★★★★★★★★★★★★★★★」tox.ini프로젝트 루트에 있습니다.

[pytest]
log_cli = True

또는 CLI에서 직접 지정할 수도 있습니다.

pytest -o log_cli=True
pytest test_name.py -v -s

심플!

h 명령어를 사용하는 것이 좋습니다.흥미로운 명령어를 사용할 수 있지만, 이 경우에는 --sortcut=no에 대한 -s 바로 가기입니다.충분하다

pytest <test_file.py> -s

「 」를 사용하고 logging가 있습니다. 로깅 출력을 켜도록 지정할 필요가 .-s범용 stdout의 경우.Pytest 테스트 내 로깅을 기반으로 다음을 사용하고 있습니다.

pytest --log-cli-level=DEBUG -s my_directory/

PyCharm IDE를 사용하는 경우 실행 도구 모음을 사용하여 개별 테스트 또는 모든 테스트를 실행할 수 있습니다.실행 도구 창에는 응용 프로그램에서 생성된 출력이 표시되고 테스트 출력의 일부로 모든 인쇄문을 볼 수 있습니다.

출력을 사용하여 코드에서 테스트를 실행하는 경우:

if __name__ == '__main__':
    pytest.main(['--capture=no'])

capsys, capsysbinary, capfd 및 capfdbinary 고정장치를 사용하면 테스트 실행 중에 생성된 stdout/stderr 출력에 액세스할 수 있습니다.다음은 출력 관련 체크를 수행하는 테스트 기능의 예입니다.

def test_print_something_even_if_the_test_pass(self, capsys):
    text_to_be_printed = "Print me when the test pass."
    print(text_to_be_printed)
    p_t = capsys.readouterr()
    sys.stdout.write(p_t.out)
    # the two rows above will print the text even if the test pass.

결과는 다음과 같습니다.

test_print_something_even_if_test_PASSED [100%]시험에 합격하면 인쇄해 주세요.

언급URL : https://stackoverflow.com/questions/14405063/how-can-i-see-normal-print-output-created-during-pytest-run

반응형