.. _`captures`: 標準出力/標準エラーのキャプチャ =============================== .. Capturing of the stdout/stderr output ========================================================= .. Default stdout/stderr/stdin capturing behaviour --------------------------------------------------------- デフォルトの stdout/stderr/stdin のキャプチャ処理 ------------------------------------------------- .. During test execution any output sent to ``stdout`` and ``stderr`` is captured. If a test or a setup method fails its according captured output will usually be shown along with the failure traceback. テストの実行中 ``stdout`` と ``stderr`` へ送られる全ての出力内容はキャプチャされます。テストまたはセットアップメソッドが失敗した場合、そこでキャプチャされた出力は、通常、エラートレースバックと一緒に表示されます。 .. In addition, ``stdin`` is set to a "null" object which will fail on attempts to read from it because it is rarely desired to wait for interactive input when running automated tests. 加えて ``stdin`` は、その読み込みに失敗する "null" オブジェクトがセットされます。その理由は自動テストを実行するときに対話式の入力を待つのを考慮することはほとんどないからです。 .. By default capturing is done by intercepting writes to low level file descriptors. This allows to capture output from simple print statements as well as output from a subprocess started by a test. デフォルトのキャプチャは、低レベルのファイルディスクリプタへの書き込みを横取りします。単純な print 文からの出力も、あるテストが生成したサブプロセスからの出力も同じようにキャプチャできます。 .. Setting capturing methods or disabling capturing ------------------------------------------------- メソッドをキャプチャする、または無効にする設定 ---------------------------------------------- .. There are two ways in which ``py.test`` can perform capturing: ``py.test`` でキャプチャを実行する方法が2つあります: .. * file descriptor (FD) level capturing (default): All writes going to the operating system file descriptors 1 and 2 will be captured. * ファイルディスクリプタ (FD) レベルのキャプチャ (デフォルト): オペレーティングシステムのファイルディスクリプタ1と2への全ての書き込みをキャプチャする .. * ``sys`` level capturing: Only writes to Python files ``sys.stdout`` and ``sys.stderr`` will be captured. No capturing of writes to filedescriptors is performed. * ``sys`` レベルのキャプチャ: Python ファイル ``sys.stdout`` と ``sys.stderr`` への書き込みのみキャプチャする、ファイルディスクリプタへの書き込みはキャプチャしない .. You can influence output capturing mechanisms from the command line:: .. _`disable capturing`: コマンドラインから出力内容のキャプチャ設定を制御できます:: py.test -s # 全てのキャプチャを無効にする py.test --capture=sys # sys.stdout/stderr を in-mem ファイルに置き換える py.test --capture=fd # ファイルディスクリプタ1と2を一時ファイルに差し向ける .. _printdebugging: デバッグに print 文を使う ------------------------- .. Using print statements for debugging --------------------------------------------------- .. One primary benefit of the default capturing of stdout/stderr output is that you can use print statements for debugging:: デフォルトで stdout/stderr の出力をキャプチャする主な利点の1つとして、デバッグに print 文が使えます:: # test_module.py の内容 def setup_function(function): print ("setting up %s" % function) def test_func1(): assert True def test_func2(): assert False .. and running this module will show you precisely the output of the failing function and hide the other one:: このモジュールを実行すると、失敗するテスト関数の出力を適切に表示して、成功するもう1つのテストを非表示にします:: $ py.test =========================== test session starts ============================ platform linux2 -- Python 2.7.1 -- pytest-2.2.4 collecting ... collected 2 items test_module.py .F ================================= FAILURES ================================= ________________________________ test_func2 ________________________________ def test_func2(): > assert False E assert False test_module.py:9: AssertionError ----------------------------- Captured stdout ------------------------------ setting up ==================== 1 failed, 1 passed in 0.01 seconds ==================== .. Accessing captured output from a test function --------------------------------------------------- テスト関数からキャプチャされた出力へのアクセス ---------------------------------------------- .. The :ref:`funcarg mechanism` allows test function a very easy way to access the captured output by simply using the names ``capsys`` or ``capfd`` in the test function signature. Here is an example test function that performs some output related checks:: :ref:`funcarg mechanism` により、テスト関数のシグネチャに ``capsys`` または ``capfd`` という名前を使うだけで、簡単にキャプチャされた出力へアクセスできます。次に関連する値の確認を行うテスト関数のサンプルを紹介します:: def test_myoutput(capsys): # または fd レベルの "capfd" を使う print ("hello") sys.stderr.write("world\n") out, err = capsys.readouterr() assert out == "hello\n" assert err == "world\n" print "next" out, err = capsys.readouterr() assert out == "next\n" .. The ``readouterr()`` call snapshots the output so far - and capturing will be continued. After the test function finishes the original streams will be restored. Using ``capsys`` this way frees your test from having to care about setting/resetting output streams and also interacts well with py.test's own per-test capturing. ``readouterr()`` 呼び出しは、その時点での出力内容のスナップショットを返し、その後もキャプチャが続行されます。テスト関数が終了した後、元のストリームが復元されます。 ``capsys`` を使うことで、テスト内で出力ストリームをセット/リセットすることに注意を払わなくてよくなります。また、pytest が保持するテスト単位のキャプチャも扱えます。 .. If you want to capture on ``fd`` level you can use the ``capfd`` function argument which offers the exact same interface. ``fd`` レベルのキャプチャを行う場合も全く同じインターフェースを提供する ``capfd`` という関数の引数を使います。 .. include:: links.inc