单元测试脚本即使测试失败也返回退出码=0
我的测试脚本如下:
import os
import sys
from unittest import defaultTestLoader as loader, TextTestRunner
path_to_my_project = os.path.dirname(os.path.abspath(__file__)) + '/../'
sys.path.insert(0, path_to_my_project)
suite = loader.discover('my_project')
runner = TextTestRunner()
runner.run(suite)
如果我运行这个脚本,输出结果是:
$ python3 runtest.py
.....F.....
======================================================================
FAIL: test_insert (fate.test.test_operators.OperatorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/chiel/Projects/tfate/libs/fate/../fate/test/test_operators.py", line 16, in test_insert
self.assertEqual(expected, self.session.text[:14])
AssertionError: 'Foo import sys$' != 'Foo import sys'
- Foo import sys$
? -
+ Foo import sys
----------------------------------------------------------------------
Ran 12 tests in 0.030s
FAILED (failures=1)
并且退出代码是零:
$ echo $?
0
然而,Python的文档上说:“默认情况下,main会调用sys.exit()
,并返回一个表示测试成功或失败的退出代码。”
我的脚本哪里出问题了?
2 个回答
25
我在获取 TextTestRunner
的结果时遇到了一些麻烦。对于像我一样的人,这里是它的工作原理:
"""Run all tests inside of *_test.py modules located in the same directory."""
import sys
import unittest
if __name__ == '__main__':
test_suite = unittest.defaultTestLoader.discover('.', '*_test.py')
test_runner = unittest.TextTestRunner(resultclass=unittest.TextTestResult)
result = test_runner.run(test_suite)
sys.exit(not result.wasSuccessful())
43
这段代码没有使用 unittest.main
这个功能。你需要通过 TestResult.wasSuccessful
来检查结果,并且要手动调用 sys.exit
。
import sys
....
ret = not runner.run(suite).wasSuccessful()
sys.exit(ret)