繁体   English   中英

单元测试因sys.exit失败

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM