This works with the latest pytest :
All you have to do is run pytest with the option --capture=sys and depend on the statement outside the context of raises() (this bit is important for some reason!)
Example:
#!/usr/bin/env python from __future__ import print_function import pytest def f(code=0): print("Foo") raise SystemExit(code) def test_f(capsys): with pytest.raises(SystemExit): f() out, err = capsys.readouterr() assert out == "Foo\n" print(out, err)
Demo:
$ py.test -v --capture=sys test_foo.py ======================================= test session starts ======================================== platform linux2 -- Python 2.7.9 -- py-1.4.27 -- pytest-2.7.0 -- /home/prologic/.virtualenvs/test/bin/python rootdir: /home/prologic/tmp, inifile: collected 1 items test_foo.py::test_f PASSED ===================================== 1 passed in 0.00 seconds =====================================
Changing print("Foo") to print("Bar") results in:
$ py.test -v --capture=sys test_foo.py ======================================= test session starts ======================================== platform linux2 -- Python 2.7.9 -- py-1.4.27 -- pytest-2.7.0 -- /home/prologic/.virtualenvs/test/bin/python rootdir: /home/prologic/tmp, inifile: collected 1 items test_foo.py::test_f FAILED ============================================= FAILURES ============================================= ______________________________________________ test_f ______________________________________________ capsys = <_pytest.capture.CaptureFixture instance at 0x7f2729405518> def test_f(capsys): with pytest.raises(SystemExit): f() out, err = capsys.readouterr() > assert out == "Foo\n" E assert 'Bar\n' == 'Foo\n' E - Bar E + Foo test_foo.py:17: AssertionError ===================================== 1 failed in 0.01 seconds =====================================
What I think is exactly what you were after!
I did this in pure virtualenv :
mkvirtualenv test pip install pytest
The trick here is to read and understand setting capture methods or disabling capture
James mills
source share