0

我有一个用Selenium Webdriver/Python 2.7编写的测试套件,它由几个测试用例组成。一些测试案例非常关键,如果他们失败了,那么整个测试失败,并且之后不需要运行测试用例。如何在指定测试失败后强制测试停止运行测试套件?

class TestSuite1(unittest.TestCase) 
    def setUp(self): 
     pass 

    def test1(self): 
     return True 

    def test2(self): 
     return false 

    def test3(self): 
     return True 

    # This is a critical test 
    def test4(self): 
     return false 

    def test5(self): 
     return True 

    def tearDown(self): 
     pass 

因此,我想在test4失败时停止整个测试运行(测试运行应该在test2失败时继续运行),因为它非常重要。我知道我们可以使用装饰器,但我正在寻找更有效的方法,因为我在测试运行中有大约20个关键测试,并且对所有测试用例使用20标记看起来效率不高。

回答

1

什么是这样的:

import unittest 

class CustomResult(unittest.TestResult): 
    def addFailure(self, test, err): 
     critical = ['test4', 'test7'] 
     if test._testMethodName in critical: 
      print("Critical Failure!") 
      self.stop() 
     unittest.TestResult.addFailure(self, test, err) 


class TestSuite1(unittest.TestCase): 
    def setUp(self): 
     pass 

    def test1(self): 
     return True 

    def test2(self): 
     return False 

    def test3(self): 
     return True 

    # This is a critical test 
    def test4(self): 
     self.fail() 
     pass 

    def test5(self): 
     print("test5") 
     return True 

    def tearDown(self): 
     pass 


if __name__ == '__main__': 
    runner = unittest.runner.TextTestRunner(resultclass=CustomResult) 
    unittest.main(testRunner=runner) 

您可能取决于你如何调用你的测试来调整这一点。

如果self.fail()(在test4)被注释掉,则测试5种方法。但是如果它没有被注释掉,测试会打印出“严重故障!”并停下来。在我的情况下,只有4个测试运行。

命名这些方法可能也很明智,因此按照字典顺序进行排序时,它们会首先出现,如果发生严重故障,那么不会浪费时间来测试其他方法。

输出(带self.fail()):

 
Critical Failure! 
Ran 4 tests in 0.001s 

FAILED (failures=1) 

输出(无self.fail()):

 
test5 
Ran 5 tests in 0.001s 

OK 
+0

谢谢您的回答,似乎它应该工作正常,但它不是为我工作。有或没有self.fail(),所有测试正在运行。 – Mahmor 2015-04-06 02:09:04

+0

@Mahmor,你如何运行你的测试?如果'if __name__ =='__main __':'里面的代码不是开始测试的,那么所有的测试都会运行。 – jedwards 2015-04-06 14:44:44

+0

我使用python -m unittest a.py通过CLI运行它们。我已经复制了您在a.py中发布的确切代码。是对的吗? – Mahmor 2015-04-06 18:12:19

相关问题