使用裝飾器實現測試跳過和預期故障的方法

單元測試unittest提供了四個裝飾器,用以實現測試跳過和預期故障。less

首先看一段代碼:單元測試

#coding=utf-8
import unittest
import myLogging

class Test(unittest.TestCase):

    flag = False
     
    def setUp(self):
        pass
 
    def tearDown(self):
        pass
 
    @unittest.skip('無條件跳過 testOne')
    def testOne(self):
        print("I am testOne, nice to meet you!")
     
    @unittest.skipIf(flag, '條件爲真則跳過')    
    def testTwo(self):
        print("I am testTwo, nice to meet you!")
     
    @unittest.skipUnless(flag,'條件爲假則跳過')    
    def testThree(self):
        print("I am testThree, nice to meet you!")
     
    @unittest.expectedFailure    
    def testFour(self):
        print("I am testFour, nice to meet you!")
     
    @unittest.expectedFailure    
    def testFive(self):
        '''
        This is a test
        '''
        self.assertTrue('True')
        self.assertIs('True', True)
        print("I am testFive, nice to meet you!")
        myLogging.logging.debug("ceshi")


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

跳過測試的方法:測試

  • @unittest.skip(reason):無條件跳過被裝飾的測試用例
  • @unittest.skipIf(condition,reason):條件爲真則跳過測試用例,爲假則執行測試
  • @unittest.skipUnless(condition,reason):條件爲假則跳過測試用例,爲真則執行測試

預期故障的方法:spa

  • @unittest.expectedFailure:將測試標記爲預期的失敗。 若是測試在運行時失敗,則測試不會被視爲失敗

 

經驗淺談:debug

    使用這幾個裝飾器時,有一點要注意,條件跳過測試的兩個方法(@unittest.skipIf(condition,reason)和@unittest.skipUnless(condition,reason)),條件判斷表達式condition中若是用到類變量,該類變量的取值會取最初始賦給它的值,而在測試用例中對它進行改變是沒法影響裝飾器的取值的。code

看下面這段代碼:blog

#coding=utf-8
import unittest

class Test(unittest.TestCase):

    flag = False
     
    def setUp(self):
        pass
 
    def tearDown(self):
        pass
    
    def testOne(self):
        Test.flag = True
     
    @unittest.skipIf(flag, '條件爲真則跳過')    
    def testTwo(self):
        print("I am testTwo, nice to meet you!")
     

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

這裏兩個測試用例,不考慮裝飾器時,執行順序是先testOne再testTwo。在testOne中,對類變量flag作了改變,變成True。ip

加上裝飾器後,預期結果是:只有testOne能執行,testTwo被跳過。而實際的結果是:utf-8

Finding files... done.
Importing test modules ... done.

I am testTwo, nice to meet you!
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

testTwo仍是被執行了一遍。it

    通過探索發現,@unittest.skipIf(flag, '條件爲真則跳過') 裝飾器裏的類變量flag實際上的取值是最開始的賦值False,因此判斷條件爲False,測試用例被執行。相反的,若是flag一開始的賦值是True,而後在執行testOne時,改爲False,執行腳本時,testTwo一直被跳過。

    因此這裏要注意的是,裝飾器的條件表達式裏的變量取值並不遵循測試用例執行的順序,能夠理解爲它的取值先於全部的測試用例而且獨立於測試用例,只和類變量的賦值有關。

相關文章
相關標籤/搜索