【Python】unittest-3

1、@unittest.skip("skipping this case") # 無條件忽略該測試方法html

2、@unittest.skipIf(a > 5, "condition is not satisfied!") #若是變量a > 5,則忽略該測試方法linux

3、@unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux") # 除非執行測試用例的平臺是Linux平臺,不然忽略該測試方法  win32是windowswindows

4、測試集框架

一、  unittest自身包括的方法有:less

['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult',
 'TestSuite','TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator',
 'defaultTestLoader','findTestCases', 'getTestCaseNames', 'main', 'makeSuite']dom

二、 每一個方法的含義函數

 'FunctionTestCase':函數測試用例,即給一個函數做爲參數,返回一個testcase實例,可選參數有set-up,tear-down方法
 'TestCase':全部測試用例的基本類,給一個測試方法的名字,返回一個測試用例實例
 'TestLoader':測試用例加載器,其包括多個加載測試用例的方法。返回一個測試套件
 loadTestsFromModule(self, module)--根據給定的模塊實例來獲取測試用例套件
 loadTestsFromName(self, name, module=None)
 --根據給定的字符串來獲取測試用例套件,字符串能夠是模塊名,測試類名,測試類中的測試方法名,或者一個可調用的是實例對象
 這個實例對象返回一個測試用例或一個測試套件
 loadTestsFromNames(self, names, module=None) --和上面功能相同,只不過接受的是字符串列表
 loadTestsFromTestCase(self, testCaseClass)--根據給定的測試類,獲取其中的全部測試方法,並返回一個測試套件
'TestProgram':命令行進行單元測試的調用方法,做用是執行一個測試用例。其實unittest.main()方法執行的就是這個命令,
而這個類實例時默認加載當前執行的做爲測試對象,
原型爲 __init__(self, module='__main__', defaultTest=None, argv=None, testRunner=xx, testLoader=xx)
其中module='__main__'就是默認加載自身
'TestResult':測試用例的結果保存實例,一般有測試框架調用
 'TestSuite':組織測試用例的實例,支持測試用例的添加和刪除,最終將傳遞給testRunner進行測試執行
 'TextTestRunner':進行測試用例執行的實例,其中Text的意思是以文本形式顯示測試結果。顯示測試名稱,即完成的測試結果,其過同執行單元測試腳本時添加-v參數
 'defaultTestLoader':其實就是TestLoader
 'findTestCases', 'getTestCaseNames':這個2個就不用解釋了
 'main': 其實就是TestProgram
 'makeSuite':一般是由單元測試框架調用的,用於生產testsuite對象的實例單元測試

5、單元測試總結測試

至此,咱們知道了。其實整個單元測試框架的邏輯出來了。分三步走:第一步testloader根據傳入的參數得到相應的測試用例,即對應具體的測試方法, 而後makesuite在把全部的測試用例組裝成testsuite,最後把testsiute傳給testrunner進行執行。 而咱們一般執行的unittest.main(),其實就是unittest.testprogram方法,其執行的功能就是上面分析的三步,在第一步中其傳入的參數是自身的模塊__main__; 在第二步中把自身模塊中的全部測試類中中的測試方法提取出來,並生成測試套件;最後再把測試套件傳遞給testrunner進行具體的測試。 最後給出一個完整的單元測試組織代碼,把該代碼放到單元測試用例文件的同一個目錄後執行該腳本,便可執行全部的測試用例文件。ui

6、測試集參數配置

一、  verbosity 參數能夠控制輸出的錯誤報告的詳細程度,默認是 1,若是設爲 0,則不輸出每一用例的執行結果,即沒有上面的結果中的第1行;若是設爲 2,則輸出詳細的執行結果

二、  參數中加stream,能夠將報告輸出到文件:能夠用TextTestRunner輸出txt報告,以及能夠用HTMLTestRunner輸出html報告。

 
#練習:
import random
import unittest
import sys
 
class TestSequenceFunctions(unittest.TestCase):
    a = 1
 
    def setUp(self):
        self.seq = list(range(10))
 
    @unittest.skip("skipping") # 無條件忽略該測試方法
    def test_shuffle(self):
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, list(range(10)))
        self.assertRaises(TypeError, random.shuffle, (1, 2, 3))
 
    # 若是變量a > 5,則忽略該測試方法
    @unittest.skipIf(a > 5, "condition is not satisfied!")
    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)
 
    # 除非執行測試用例的平臺是Linux平臺,不然忽略該測試方法  win32是windows
    @unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")
    def test_sample(self):
        #指望拋出什麼樣的error
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)
 
 
if __name__ == '__main__':
    # unittest.main()
    #使用測試集的方法執行
    #裝載測試用例(該句話等價於suite = [TestSequenceFunctions("test_shuffle"),TestSequenceFunctions
 
("test_choice"),TestSequenceFunctions("test_sample")])
    suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
 
    #使用測試套件並打包測試用例
    suite = unittest.TestSuite(suite)
   
    #保存unittest的測試輸入日誌到文件
    log_name="e:\\test4\\log.txt"
    #verbosity=2是指測試結果的輸出的詳細程度
    #stream = f是指將結果輸出到文件f
    with open(log_name,"w+") as f:
        result=unittest.TextTestRunner(stream = f,verbosity = 2).run(suite)
    #unittest.TextTestRunner(verbosity = 2).run(suite)
 
  #生成測試報告
    print"testsRun:%s" %result.testsRun
    print"failures:%s" %len(result.failures)
    print"errors:%s" %len(result.errors)
    print"skipped:%s" %len(result.skipped)
相關文章
相關標籤/搜索