根据pytest文档,我可以声明SystemExit()发生,但我想做更多:我还想验证退出代码和任何消息。我尝试了下面的代码,但没有打印,我不确定我需要断言以证明我得到了正确的错误代码。
with pytest.raises(SystemExit):
docopt_args = validate_args(docopt_args)
out, err = pytest.capsys.readouterr()
assert out == 'Foo'
print out, err
当我运行我的测试时,它会通过,但就是这样。什么都没打印,我没有得到断言错误。
我希望执行的代码是:
print '\n' + docopt_args['-d'] + ' is not a valid date\n'
sys.exit(-3)
答案 0 :(得分:12)
这适用于最新的pytest:
您需要做的只是使用pytest
选项运行--capture=sys
并依赖于raises()
上下文之外的断言(此位因某些原因很重要!)
示例:强>
#!/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)
<强>演示:强>
$ 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 =====================================
将print("Foo")
更改为print("Bar")
会导致:
$ 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 =====================================
我认为这正是你所追求的!
我是用干净的virtualenv:
完成的mkvirtualenv test
pip install pytest
答案 1 :(得分:0)
import pytest
def test_exit():
with pytest.raises(SystemExit):
script_exit()