Pytest通过测试我认为它应该在sys.exit()调用上失败

时间:2019-04-24 13:37:46

标签: python python-3.x pytest

我正在尝试检查我在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都很满意。

1 个答案:

答案 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语法,因为您缺少其他内容。

请参阅:Testing sys.exit() with pytest