單元測試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()
跳過測試的方法:測試
預期故障的方法:spa
經驗淺談: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一直被跳過。
因此這裏要注意的是,裝飾器的條件表達式裏的變量取值並不遵循測試用例執行的順序,能夠理解爲它的取值先於全部的測試用例而且獨立於測試用例,只和類變量的賦值有關。