关于python:测试成功,仍然得到追溯

Tests succeed, still get traceback

我正在使用python的unittest库,所有测试都成功了,但是我仍然得到了一个回溯,我不知道如何解决这个问题。

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


sys.exit(not self.result.wasSuccessful())

当我假设我的python包中的__main__.py总是有__name__"__main__"的时候,我遇到了这个问题,但是当我在那里通过discovery运行单元测试时,我发现它们将被执行,但使用的是不同的__name__"package.__main__"

因此,我确实需要在我的__main__.py中使用以下内容,就像在简单的python脚本中一样:

1
2
if __name__ == '__main__':
    main()

而不仅仅是

1
main()

如果mainunittest.main的话,用

1
2
if __name__ == '__main__':
    main(exit=False)

如果您想让进程在交互模式下保持,如果您正在调用

1
python -im package_name

如果您正在使用:

1
python -m unittest discover

那么我认为江户十一〔十二〕也不重要。


无论您使用什么来运行这些测试,它都会捕获SystemExit异常并打印跟踪。编写捕获异常的代码时,应注意不要捕获实际上不想捕获的异常,如SystemExit(由sys.exit()引发以结束程序),通常为KeyboardInterrupt(由control-c引发)。