单元测试脚本返回退出代码=0,即使测试失败

32

我的测试脚本如下:

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个回答

43

我说的对吗?当用户选择运行测试时,要么1)实例化测试类并从中调用测试方法;要么2)使用unittest.main() - 代码会自动处理适当代码的sys.exit调用。然而,如果用户使用suite和TextTestRunner运行测试,则必须显式设置sys.exit代码。 - variable
@变量,unittest.main调用 sys.exit。 1)-> 不会调用sys.exit,如果您想退出程序,请调用sys.exit()。 2)-> 调用sys.exit,您不需要自己调用sys.exit()。 - falsetru

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())

1
+1 针对仅有的 Python 实现,这在 Python 文档的测试发现章节中显然是缺失的。Unittest Test Discovery - domih

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接