7、pytest--標準出力と標準エラー出力をキャプチャする
4477 ワード
目次 1. 標準出力/標準エラー出力/標準入力のデフォルトキャプチャ動作 2. 動作をキャプチャするには 2.1. ファイル記述子レベルのキャプチャ動作(デフォルト) 2.2. 2.3. キャプチャ動作 3. 4. 取得された情報 には、試験例でアクセスする.
テストの実行中に、標準出力と標準エラー出力がキャプチャされます.テストに失敗したり、異常が発生したりした場合、異常情報のスタックも一緒に表示されます.
また、標準入力は、
実際、標準入力を使用したい場合は、
通常、キャプチャ動作は、低レベルのファイル記述子への書き込みをブロックすることによって実現される.これにより、簡単な
オペレーティングシステムへのファイル記述子1(標準入力)と2(標準エラー入力)の書き込み動作はすべてキャプチャされ、これも
ファイル記述子は、現在のプロセスで開いているファイルに対応する小さな整数です.例えば、標準入力のファイル記述子は通常0であり、標準出力は1であり、標準エラーは2であり、その後プロセスによって開かれるファイルの記述子は3、4、5などの順に指定される.
デフォルトのキャプチャ動作がもたらす主な利点は、
次の例を見てみましょう.
次に、このモジュールを実行します.
テスト実行中に生成された出力情報には、
次の例では、テストの出力情報を確認します.
ファイル記述子レベルのテスト出力にアクセスしたい場合は、
非テキスト型のデータにアクセスしたい場合は、
一時的に動作をキャプチャしたい場合は、コンテキストマネージャとして使用する
GitHub倉庫住所:https://github.com/luizyao/pytest-chinese-doc
sys
レベルのキャプチャ動作print()
関数を用いたデバッグ例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.取得された情報にテスト・インスタンスでアクセスする
テスト実行中に生成された出力情報には、
capsys
、capsysbinary
、capfd
、capfdbinary 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