我在我的测试框架中使用以下代码:
testModules = ["test_foo", "test_bar"]
suite = unittest.TestLoader().loadTestsFromNames(testModules)
runner = unittest.TextTestRunner(sys.stdout, verbosity=2)
results = runner.run(suite)
return results.wasSuccessful()
有没有办法让报告(runner.run
?)在第一次失败后中止,以防止过多的冗长?
答案 0 :(得分:7)
问了问题九年后,这仍然是“ python单元测试过早失败”的最佳搜索结果之一,正如我在查看其他搜索结果时所发现的那样,这些答案在最近的版本中不再正确版本的unittest模块。
unittest模块https://docs.python.org/3/library/unittest.html#command-line-options和https://docs.python.org/2.7/library/unittest.html#command-line-options的文档显示,有一个参数failfast = True,可以将其添加到unittest.main中,或等效地添加到命令行选项-f中。或--failfast,以在第一个错误或失败时停止测试运行。此选项是在2.7版中添加的。与其他答案中建议的先前必需的解决方法相比,使用该选项要容易得多。
也就是说,只需更改您的
unittest.main()
到
unittest.main(failfast=True)
答案 1 :(得分:6)
根据Eugene的指导,我想出了以下内容:
class TestCase(unittest.TestCase):
def run(self, result=None):
if result.failures or result.errors:
print "aborted"
else:
super(TestCase, self).run(result)
虽然这种方法运行得相当好,但每个单独的测试模块必须定义是否要使用此自定义类或默认类(命令行开关,类似于py.test
的{},这有点令人讨厌。 {1}},会是理想的......)
答案 2 :(得分:5)
这是一个功能。如果要覆盖它,则需要子类化TestCase
和/或TestSuite
类并覆盖run()
方法中的逻辑。
P.S .:
我认为你必须继承unittest.TestCase
并在你的类中覆盖方法run()
:
def run(self, result=None):
if result is None: result = self.defaultTestResult()
result.startTest(self)
testMethod = getattr(self, self._testMethodName)
try:
try:
self.setUp()
except KeyboardInterrupt:
raise
except:
result.addError(self, self._exc_info())
return
ok = False
try:
testMethod()
ok = True
except self.failureException:
result.addFailure(self, self._exc_info())
result.stop()
except KeyboardInterrupt:
raise
except:
result.addError(self, self._exc_info())
result.stop()
try:
self.tearDown()
except KeyboardInterrupt:
raise
except:
result.addError(self, self._exc_info())
ok = False
if ok: result.addSuccess(self)
finally:
result.stopTest(self)
(我已对默认的result.stop()
定义添加了两次run
次调用。
然后你必须修改所有的测试用例,使它们成为这个新类的子类,而不是unittest.TestCase
。
警告 :我没有测试此代码。 :)
答案 3 :(得分:0)
基于AnC的答案,这就是我正在使用的......
def aborting_run(self, result=None):
if result.failures or result.errors:
print "aborted"
else:
original_run(self, result)
original_run = unittest.TestCase.run
unittest.TestCase.run = aborting_run