[英]Unittest failed with sys.exit
我正在尝试使用unittest运行测试。 这是我的结构:
projectname/
projectname/
foo.py
bar.py
tests/
test_foo.py
test_bar.py
我用它运行:
cd tests/
python -m unittest discover
但是在一个文件中,例如foo.py ,我使用了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)
sys.exit()
使用是自愿的,我无法将其删除。 我知道unittest.main函数有一个名为exit
的选项:
if __name__ == "__main__":
unittest.main(exit=False)
但是我想测试tests目录中的所有文件。 另一种方法是:
if __name__ == '__main__':
tests = unittest.TestLoader().discover('.')
unittest.TextTestRunner(verbosity=1).run(tests)
它找到所有test_文件,但是sys.exit()
使unittest崩溃。
sys.exit
实际上并不退出解释器。 它只是提高SystemExit
。 如果该异常到达堆栈顶部,则解释器将开始退出过程(具有相关的退出值)。
unittest
很不高兴,因为它正在捕获SystemExit
异常(因此解释器实际上不会退出),但是该测试并未描述为期望引发该异常。
尝试以下方法。
def test_exit_func(self):
with self.assertRaises(SystemExit):
sys.exit(0)
我认为在模块中使用sys.exit()不是一个好主意。 但是如果有必要,您应该做的是编写一个测试用例,将该模块包装为子流程(可能使用子流程模块),并验证退出代码。 您可能还需要一个包装脚本来调用。 换句话说,您调用一个导入该模块的外部Python脚本,然后退出。 然后,单元测试框架可以通过检查子流程的返回值来报告通过/失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.