我正在使用Python的unittest
库并且所有测试都成功,但我仍然得到追溯,我无法理解如何解决问题。
........
----------------------------------------------------------------------
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
>>>
答案 0 :(得分:14)
您似乎在Python shell中运行,它会为您捕获异常,因此您可以继续调试。如果您已从命令行运行,则行
sys.exit(not self.result.wasSuccessful())
将以退出代码0退出程序,这表示成功(如果您不熟悉程序与shell的交互方式,这可能会违反直觉)。但是,由于您在解释器中运行,因此会捕获异常。
我建议您的程序或测试没有任何问题。单元测试框架可能只是不希望以交互方式运行!
答案 1 :(得分:13)
为了避免执行追溯结束:
if __name__ == '__main__':
unittest.main(exit=False)
答案 2 :(得分:7)
以:
结束您的unittest文件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
答案 3 :(得分:3)
sys.exit(not self.result.wasSuccessful())
当我假设我的Python包中的__main__.py
始终拥有__name__
,"__main__"
时,我碰到了这个 - 但是当我通过发现运行我的单元测试时,我发现它们将被执行,但使用不同的__name__
- "package.__main__"
。
因此,我在__main__.py
中确实需要以下内容,就像在简单的Python脚本中一样:
if __name__ == '__main__':
main()
而不仅仅是
main()
如果main
为unittest.main
,请使用
if __name__ == '__main__':
main(exit=False)
如果您希望过程在交互模式下保持不变,如果您正在调用
python -im package_name
如果您正在使用:
python -m unittest discover
然后我认为exit=False
不重要。
答案 4 :(得分:1)
无论您使用什么来运行这些测试,它都会捕获SystemExit异常并打印回溯。当您编写捕获异常的代码时,您应该注意不要捕获您实际上不想捕获的异常,例如SystemExit
(由sys.exit()
引发以结束程序)并且通常{{1 (由control-C引发。)