gpt4 book ai didi

python - 在 pytest 中验证来自 SystemExit 的错误代码或消息

转载 作者:太空狗 更新时间:2023-10-29 18:02:54 25 4
gpt4 key购买 nike

根据 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)

最佳答案

这适用于最新的 pytest :

您需要做的就是使用 --capture=sys 选项运行 pytest 并在 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

这里的技巧是阅读和理解Setting capturing methods or disabling capturing

关于python - 在 pytest 中验证来自 SystemExit 的错误代码或消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30256332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com