Unittest 因 sys.exit 而失败

ncr*_*fer 3 python unit-testing python-unittest

我正在尝试使用 unittest 运行我的测试。这是我的结构:

projectname/
    projectname/
        foo.py
        bar.py
    tests/
        test_foo.py
        test_bar.py
Run Code Online (Sandbox Code Playgroud)

我运行它:

cd tests/
python -m unittest discover
Run Code Online (Sandbox Code Playgroud)

但是在一个文件中,例如foo.py,我使用了 a sys.exit(0),而 unittest 并不喜欢它:

$ python -m unittest discover
....E.
======================================================================
ERROR: test_foo (...)
----------------------------------------------------------------------
Traceback (most recent call last):
...
...
File "/home/.../projectname/foo.py", line 12, in write
    sys.exit(0)
SystemExit: 0

----------------------------------------------------------------------
Ran 6 tests in 0.018s

FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud)

sys.exit()使用是自愿的,我无法将其删除。我知道有一个调用exitunittest.main 函数的选项:

if __name__ == "__main__":
    unittest.main(exit=False)
Run Code Online (Sandbox Code Playgroud)

但是我想测试tests目录中的所有文件。另一种方法是:

if __name__ == '__main__':
    tests = unittest.TestLoader().discover('.')
    unittest.TextTestRunner(verbosity=1).run(tests)
Run Code Online (Sandbox Code Playgroud)

它找到所有的test_文件,但sys.exit()使 unittest 崩溃。

Dun*_*nes 7

sys.exit实际上并没有退出解释器。它只是提高SystemExit。如果该异常到达堆栈顶部,则解释器将启动退出过程(使用相关的退出值)。

unittest不高兴,因为它正在捕获该SystemExit异常(因此解释器实际上不会退出),但该测试并未被描述为期望引发该异常。

请尝试以下操作。

def test_exit_func(self):
    with self.assertRaises(SystemExit):
        sys.exit(0)
Run Code Online (Sandbox Code Playgroud)