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

相關問題