PyUnit:首次测试失败后停止?

时间:2009-03-26 11:48:21

标签: python unit-testing

我在我的测试框架中使用以下代码:

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?)在第一次失败后中止,以防止过多的冗长?

4 个答案:

答案 0 :(得分:7)

问了问题九年后,这仍然是“ python单元测试过早失败”的最佳搜索结果之一,正如我在查看其他搜索结果时所发现的那样,这些答案在最近的版本中不再正确版本的unittest模块。

unittest模块https://docs.python.org/3/library/unittest.html#command-line-optionshttps://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