134 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
| 
 | |
| .. _`captures`:
 | |
| 
 | |
| Capturing of the stdout/stderr output
 | |
| =========================================================
 | |
| 
 | |
| Default stdout/stderr/stdin capturing behaviour
 | |
| ---------------------------------------------------------
 | |
| 
 | |
| 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.
 | |
| 
 | |
| 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.
 | |
| 
 | |
| 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.
 | |
| 
 | |
| Setting capturing methods or disabling capturing
 | |
| -------------------------------------------------
 | |
| 
 | |
| There are two ways in which ``pytest`` can perform capturing:
 | |
| 
 | |
| * file descriptor (FD) level capturing (default): All writes going to the
 | |
|   operating system file descriptors 1 and 2 will be captured.
 | |
| 
 | |
| * ``sys`` level capturing: Only writes to Python files ``sys.stdout``
 | |
|   and ``sys.stderr`` will be captured.  No capturing of writes to
 | |
|   filedescriptors is performed.
 | |
| 
 | |
| .. _`disable capturing`:
 | |
| 
 | |
| You can influence output capturing mechanisms from the command line::
 | |
| 
 | |
|     pytest -s            # disable all capturing
 | |
|     pytest --capture=sys # replace sys.stdout/stderr with in-mem files
 | |
|     pytest --capture=fd  # also point filedescriptors 1 and 2 to temp file
 | |
| 
 | |
| .. _printdebugging:
 | |
| 
 | |
| 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::
 | |
| 
 | |
|     # content of 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::
 | |
| 
 | |
|     $ pytest
 | |
|     ======= test session starts ========
 | |
|     platform linux -- Python 3.5.2, pytest-3.0.7, py-1.4.32, pluggy-0.4.0
 | |
|     rootdir: $REGENDOC_TMPDIR, inifile:
 | |
|     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 setup ---------------------------
 | |
|     setting up <function test_func2 at 0xdeadbeef>
 | |
|     ======= 1 failed, 1 passed in 0.12 seconds ========
 | |
| 
 | |
| Accessing captured output from a test function
 | |
| ---------------------------------------------------
 | |
| 
 | |
| The ``capsys`` and ``capfd`` fixtures allow to access stdout/stderr
 | |
| output created during test execution.  Here is an example test function
 | |
| that performs some output related checks:
 | |
| 
 | |
| .. code-block:: python
 | |
| 
 | |
|     def test_myoutput(capsys): # or use "capfd" for fd-level
 | |
|         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 pytest's
 | |
| own per-test capturing.
 | |
| 
 | |
| If you want to capture on filedescriptor level you can use
 | |
| the ``capfd`` function argument which offers the exact
 | |
| same interface but allows to also capture output from
 | |
| libraries or subprocesses that directly write to operating
 | |
| system level output streams (FD1 and FD2).
 | |
| 
 | |
| 
 | |
| .. versionadded:: 3.0
 | |
| 
 | |
| To temporarily disable capture within a test, both ``capsys``
 | |
| and ``capfd`` have a ``disabled()`` method that can be used
 | |
| as a context manager, disabling capture inside the ``with`` block:
 | |
| 
 | |
| .. code-block:: python
 | |
| 
 | |
|     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')
 | |
| 
 | |
| .. include:: links.inc
 |