7、pytest--標準出力と標準エラー出力をキャプチャする

4477 ワード

目次
  • 1. 標準出力/標準エラー出力/標準入力のデフォルトキャプチャ動作
  • 2. 動作をキャプチャするには
  • 2.1. ファイル記述子レベルのキャプチャ動作(デフォルト)
  • 2.2. sysレベルのキャプチャ動作
  • 2.3. キャプチャ動作
  • 3. print()関数を用いたデバッグ例
  • 4. 取得された情報
  • には、試験例でアクセスする.

    1.標準出力/標準エラー出力/標準入力のデフォルトのキャプチャ動作


    テストの実行中に、標準出力と標準エラー出力がキャプチャされます.テストに失敗したり、異常が発生したりした場合、異常情報のスタックも一緒に表示されます.--show-captureコマンドラインオプションを使用して、これらの動作を定義できます.--show-captureの構成項目は、no,stdout,stderr,log,allであり、デフォルトはallである.
    また、標準入力は、"null"オブジェクトに設定される.自動化テストでは、インタラクティブ入力のシーンを使用する必要が少ないためです.
    実際、標準入力を使用したい場合は、OSError: reading from stdin while output is capturedというエラーが発生します.
    通常、キャプチャ動作は、低レベルのファイル記述子への書き込みをブロックすることによって実現される.これにより、簡単なprint()文とテスト中のサブプログラムの出力動作をキャプチャすることができます.

    2.動作をキャプチャする

    pytestには2つのキャプチャ動作があり、--captureコマンドラインオプションで指定できます.

    2.1. ファイル記述子レベルのキャプチャ動作(デフォルト)


    オペレーティングシステムへのファイル記述子1(標準入力)と2(標準エラー入力)の書き込み動作はすべてキャプチャされ、これもpytestのデフォルトのキャプチャ動作であり、--capture=fdによって指定することもできる.
    ファイル記述子は、現在のプロセスで開いているファイルに対応する小さな整数です.例えば、標準入力のファイル記述子は通常0であり、標準出力は1であり、標準エラーは2であり、その後プロセスによって開かれるファイルの記述子は3、4、5などの順に指定される.

    2.2. Sysレベルのキャプチャ動作

    Pythonへのsys.stdoutおよびsys.stderrへの書き込み動作のみがキャプチャされ、ファイル記述子への書き込みのキャプチャは実行されず、--capture=sysによって指定される.

    2.3. 行動をキャプチャできるようにする

    --capture=noによって、pytestの捕獲挙動を可能にすることができる.-sコマンドラインオプションによって同じ効果を実現することもできます.それは--capture=noのショートカットにすぎません.本質的には同じです.

    3.print()関数を使用したデバッグ例


    デフォルトのキャプチャ動作がもたらす主な利点は、print()関数を使用してデバッグ例を支援できることです.
    次の例を見てみましょう.
    # src/chapter-7/test_module.py
    
    def setup_function(function):
        print("setting up", function)
    
    
    def test_func1():
        assert True
    
    
    def test_func2():
        assert False
    setup_function(function)関数は、各試験例が開始される前に実行され、いくつかの初期化操作を行う.
    次に、このモジュールを実行します.
    λ pipenv run pytest -q src/chapter-7/test_module.py
    .F                                                      [100%] 
    ========================== FAILURES ========================== 
    _________________________ test_func2 _________________________
    
        def test_func2():
    >       assert False
    E       assert False
    
    src\chapter-7\test_module.py:32: AssertionError
    ------------------- Captured stdout setup -------------------- 
    setting up 
    1 failed, 1 passed in 0.05s
    pytestは、失敗した使用例情報を正確に印刷し、他の使用例を無視することがわかる.

    4.取得された情報にテスト・インスタンスでアクセスする


    テスト実行中に生成された出力情報には、capsyscapsysbinarycapfdcapfdbinary fixturesによってアクセスできます.
    次の例では、テストの出力情報を確認します.
    # src/chapter-7/test_output.py
    
    import sys
    
    
    def test_output(capsys):
        print('hello')
        print('world', file=sys.stderr, end='&')  #  , 
        captured = capsys.readouterr()
        assert captured.out == 'hello
    ' # print() assert captured.err == 'world&' print('next') captured = capsys.readouterr() assert captured.out == 'next
    '
    readouterr()メソッドは、これまでのすべての標準出力と標準エラー出力を示し、キャッシュ領域をリセットする名前付きメタグループ(outおよびerrプロパティを含む)を返します.
    ファイル記述子レベルのテスト出力にアクセスしたい場合は、capfd fixtureを使用して、まったく同じインタフェースを提供します.
    非テキスト型のデータにアクセスしたい場合は、capsysbinary fixtureを使用します.readouterr()メソッドはバイトストリームを返します.次の例を参照してください.
    # src/chapter-7/test_output.py
    
    def test_binary_output(capsysbinary):
        print('hello')
        captured = capsysbinary.readouterr()
        assert captured.out == b'hello
    '

    一時的に動作をキャプチャしたい場合は、コンテキストマネージャとして使用するcapsys.disabled()メソッドを使用します.withの役割ドメインでのキャプチャ動作を禁止することができます.次の例を参照してください.
    # src/chapter-7/test_output.py
    
    def test_disabling_capturing(capsys):
        print("hello")
        with capsys.disabled():
            print("world")
        captured = capsys.readouterr()
        assert captured.out == "hello
    "

    GitHub倉庫住所:https://github.com/luizyao/pytest-chinese-doc