我正在尝试检查我在Mac(10.14.4)上用python3编写的脚本的退出代码。当我运行测试时,它不会失败,我认为这是错误的。但是我看不到我错了。
测试文件如下:
import pytest
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import my_script
class TestMyScript():
def test_exit(self):
with pytest.raises(SystemExit) as pytest_wrapped_e:
my_script.main()
assert pytest_wrapped_e.type == SystemExit
def test_exit_code(self):
with pytest.raises(SystemExit) as pytest_wrapped_e:
my_script.main()
self.assertEqual(pytest_wrapped_e.exception.code, 42)
我的脚本如下:
#!/usr/bin/env python3
import sys
def main():
print('Hello World!')
sys.exit(0)
if __name__ == '__main__':
main()
我得到的输出是:
$ py.test -v
============================= test session starts ==============================
platform darwin -- Python 3.7.3, pytest-3.10.1, py-1.8.0, pluggy-0.9.0 -- /usr/local/opt/python/bin/python3.7
cachedir: .pytest_cache
rootdir: /Users/robertpostill/software/gateway, inifile:
plugins: shutil-1.6.0
collected 2 items
test/test_git_refresh.py::TestGitRefresh::test_exit PASSED [ 50%]
test/test_git_refresh.py::TestGitRefresh::test_exit_code PASSED [100%]
=========================== 2 passed in 0.02 seconds ===========================
$
我希望第二个测试(test_exit_code)失败,因为退出调用得到的代码是0,而不是42。但是由于某种原因,无论我在sys.exit调用中输入什么值,assert都很满意。
答案 0 :(得分:3)
很好的问题,这是因为从未调用过您的Asserts
(他们俩)。调用exit()
时,程序就完成了(至少在with
子句中),它关掉灯,收拾行囊,然后回家。不再调用其他功能。要查看此内容,请在致电assert
之前和之后添加main
:
def test_exit_code(self):
with pytest.raises(SystemExit) as pytest_wrapped_e:
self.assertEqual(0, 1) # This will make it fail
my_script.main()
self.assertEqual(0, 1) # This will never be called because main `exits`
self.assertEqual(pytest_wrapped_e.exception.code, 42)
如果没有断言失败且没有任何中断,则测试通过,因此在您的情况下,两个测试都通过了,因为从未击中assert
。
要解决此问题,请从asserts
语句中退出with
:
def test_exit_code(self):
with pytest.raises(SystemExit) as pytest_wrapped_e:
my_script.main()
self.assertEqual(pytest_wrapped_e.exception.code, 42)
尽管现在您需要修复pytest
语法,因为您缺少其他内容。