Tests succeed, still get traceback
我正在使用python的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ........ ---------------------------------------------------------------------- Ran 8 tests in 0.020s OK Traceback (most recent call last): File"C:\Users\Paul\Desktop\bloomfilter\test_bloomfilter.py", line 85, in <module> unittest.main() File"C:\Programming\PythonX86\Python27\lib\unittest\main.py", line 95, in __init__ self.runTests() File"C:\Programming\PythonX86\Python27\lib\unittest\main.py", line 231, in runTests sys.exit(not self.result.wasSuccessful()) SystemExit: False >>> |
您似乎在python shell中运行,它为您捕获异常,以便继续调试。如果你是从命令行运行的,
1 | sys.exit(not self.result.wasSuccessful()) |
退出代码为0的程序,表示成功(如果您不熟悉程序与shell的交互方式,这可能是违反直觉的)。但是,由于您正在解释器中运行,因此会捕获异常。
我建议您的程序或测试没有任何问题。UnitTests框架可能只是不希望以交互方式运行!
要避免执行结束的回溯:
1 2 | if __name__ == '__main__': unittest.main(exit=False) |
UnitTest文件结尾为:
1 2 3 4 5 6 | if __name__=='__main__': try: unittest.main() except SystemExit as inst: if inst.args[0] is True: # raised by sys.exit(True) when tests failed raise |
当我假设我的python包中的
因此,我确实需要在我的
1 2 | if __name__ == '__main__': main() |
而不仅仅是
1 | main() |
如果
1 2 | if __name__ == '__main__': main(exit=False) |
如果您想让进程在交互模式下保持,如果您正在调用
1 | python -im package_name |
如果您正在使用:
1 | python -m unittest discover |
那么我认为江户十一〔十二〕也不重要。
无论您使用什么来运行这些测试,它都会捕获SystemExit异常并打印跟踪。编写捕获异常的代码时,应注意不要捕获实际上不想捕获的异常,如