中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python單元測試中unittest是怎樣的

發布時間:2021-10-14 15:11:08 來源:億速云 閱讀:81 作者:柒染 欄目:編程語言

python單元測試中unittest是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

單元測試作為任何語言的開發者都應該是必要的,因為時隔數月后再回來調試自己的復雜程序時,其實也是很崩潰的事情。雖然會很快熟悉內容,但是修改和調試將是一件痛苦的事情,如果你在修改了代碼后出現問題的話,而單元測試可以幫助我們很快準確的定位到問題的位置,出現問題的模塊和單元。所以這是一件很愉快的事情,因為我們知道其它修改或沒有修改的地方仍然是正常工作的,而我們目前的唯一問題就是搞定眼前這個有點問題的“家伙”。所以工作會在輕松中開始,并且很快將會結束,因為你已經知道很多信息了。

單元測試自然是對程序中最小的可測試模塊--函數來進行測試;因為單元測試的對象是函數,也就是說你得被測試對象一定要有輸出結果,哪怕就是異常輸出,也得有輸出,以便單元測試模塊能夠捕獲返回值,并且與預期值進行比較,從而得出測試通過與否。

單元測試的加載方式有2種:一種是通過unittest.main()來啟動單元測試的測試模塊;一種是添加到testsuite集合中再加載所有的被測試對象,而testsuit里存放的就是單元測試的用例,下面分別列出了2種方法的使用。

1.1 測試模塊中的函數:

被測模塊:

[python] view
plaincopy

  1. #!/usr/bin/env python

  2. #encoding: utf-8


  3. def sum( x, y):  

  4.         return x+y  



  5. def sub( x, y):  

  6.         return x-y   

單元測試模塊:

[python] view
plaincopy

  1. #!/usr/bin/env python

  2. #encoding: utf-8


  3. import unittest  

  4. import myclass  


  5. class mytest(unittest.TestCase):  


  6.     ##初始化工作

  7.     def setUp(self):  

  8.         pass


  9.     #退出清理工作

  10.     def tearDown(self):  

  11.         pass


  12.     #具體的測試用例,一定要以test開頭

  13.     def testsum(self):  

  14.         self.assertEqual(myclass.sum(12), 2'test sum fail')  



  15.     def testsub(self):  

  16.         self.assertEqual(myclass.sub(21), 1'test sub fail')     



  17. if __name__ =='__main__':  

  18.     unittest.main()  

測試結果:【F表示一個fail, F前的點表示一個通過,有E的話表示程序自身異常】

[python] view
plaincopy

  1. .F  

  2. ======================================================================  

  3. FAIL: testsum (__main__.mytest)  

  4. ----------------------------------------------------------------------  

  5. Traceback (most recent call last):  

  6.   File "C:\Users\xiaowu\workspace\mypython\unitTest.py", line 19in testsum  

  7.     self.assertEqual(myclass.sum(12), 2'test sum fail')  

  8. AssertionError: test sum fail  


  9. ----------------------------------------------------------------------  

  10. Ran 2 tests in 0.001s


  11. FAILED (failures=1)  

1.2 測試模塊類中的函數:

被測模塊:

[python] view
plaincopy

  1. #!/usr/bin/env python

  2. #encoding: utf-8


  3. class myclass:  

  4.     def __init__(self):  

  5.         pass



  6.     def sum(self, x, y):  

  7.         return x+y  



  8.     def sub(self, x, y):  

  9.         return x-y   

單元測試模塊:

[python] view
plaincopy

  1. #!/usr/bin/env python

  2. #encoding: utf-8


  3. import unittest  

  4. import myclass  


  5. class mytest(unittest.TestCase):  


  6.     ##初始化工作

  7.     def setUp(self):  

  8.         self.tclass = myclass.myclass()   ##實例化了被測試模塊中的類


  9.     #退出清理工作

  10.     def tearDown(self):  

  11.         pass


  12.     #具體的測試用例,一定要以test開頭

  13.     def testsum(self):  

  14.         self.assertEqual(self.tclass.sum(12), 3)  



  15. if __name__ =='__main__':  

  16.     unittest.main()  

運行結果:

[python] view
plaincopy

  1. .  

  2. ----------------------------------------------------------------------  

  3. Ran 1 test in 0.000s


  4. OK  

這種方式執行單個測試文件時使用-v參數可以獲得更多的測試結果信息。如:mytest.py -v 

2 加載測試套件

好吧,在運用測試套件進行單元測試之前,我想還是稍微研究一下unittest模塊的內容有哪些,其大概的運行方式是什么樣的。而后在給出根據各種情況如何制定單元測試套件。

首先,自然是查看unittest模塊有哪些成員啦!

[python] view
plaincopy

  1. >>import unittest  

  2. >>dir(unittest)  

  3. ['FunctionTestCase''TestCase''TestLoader''TestProgram''TestResult', 'Tes  

  4. tSuite', 'TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator',  

  5. '__all__''__author__''__builtins__''__doc__''__email__''__file__', '__  

  6. metaclass__', '__name__', '__package__', '__unittest', '__version__', '_makeLoad  

  7. er', '_strclass', 'defaultTestLoader', 'findTestCases', 'getTestCaseNames', 'mai  

  8. n', 'makeSuite', 'os', 'sys', 'time', 'traceback', 'types']  

可以看到其自身的成員也不是很多,大概包括有:
['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult',
 'TestSuite','TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator',
 'defaultTestLoader','findTestCases', 'getTestCaseNames', 'main', 'makeSuite']
 
 好吧,我們大概看看具體都是干什么的

[python] view
plaincopy

  1. >>memblist = ['FunctionTestCase''TestCase''TestLoader''TestProgram''TestResult',\  

  2. 'TestSuite','TextTestRunner''defaultTestLoader','findTestCases''getTestCaseNames', \  

  3. 'main''makeSuite']  

  4. >>for memb in memblist:  

  5. ..  cur = getattr(unittest, memb)  

  6. ..  print help(cur)  

 '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對象的實例
 
 至此,我們知道了。其實整個單元測試框架的邏輯出來了。分三步走:第一步testloader根據傳入的參數獲得相應的測試用例,即對應具體的測試方法,
 然后makesuite在把所有的測試用例組裝成testsuite,最后把testsiute傳給testrunner進行執行。
 而我們通常執行的unittest.main(),其實就是unittest.testprom方法,其執行的功能就是上面分析的三步,在第一步中其傳入的參數是自身的模塊__main__;
 在第二步中把自身模塊中的所有測試類中中的測試方法提取出來,并生成測試套件;最后再把測試套件傳遞給testrunner進行具體的測試。
 
 最后給出一個完整的單元測試組織代碼,把該代碼放到單元測試用例文件的同一個目錄后執行該腳本,即可執行所有的測試用例文件。
 【測試用例文件必須為test開頭,如:testxxx.py, 當然這個文件本身是一個單元測試的文件】

[python] view
plaincopy

  1. #!/usr/bin/env python

  2. #encoding: utf-8

  3. #該代碼源自深入python

  4. import unittest  

  5. import myclass  

  6. import re  

  7. import os  

  8. import sys  



  9. def testAllinCurrent():  

  10.     path = os.path.abspath(os.path.dirname(sys.argv[0]))     

  11.     files = os.listdir(path)                                 

  12.     test = re.compile("test\.py{1}quot;, re.IGNORECASE)            

  13.     files = filter(test.search, files)                       

  14.     filenameToModuleName = lambda f: os.path.splitext(f)[0]  

  15.     moduleNames = map(filenameToModuleName, files)           

  16.     modules = map(__import__, moduleNames)     


  17.     load = unittest.defaultTestLoader.loadTestsFromModule    

  18.     return unittest.TestSuite(map(load, modules))  


  19. if __name__ == "__main__":                     

  20.     unittest.main(defaultTest="regressionTest")  

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

榕江县| 神池县| 米泉市| 汕尾市| 吴忠市| 雅江县| 南木林县| 青铜峡市| 眉山市| 郓城县| 七台河市| 壶关县| 太谷县| 麻江县| 白沙| 阳朔县| 营口市| 东乡族自治县| 巩留县| 炉霍县| 武义县| 黑水县| 镇宁| 辽宁省| 英德市| 沙坪坝区| 怀来县| 肇源县| 天水市| 南漳县| 大埔县| 永川市| 普格县| 当雄县| 康马县| 凤冈县| 繁昌县| 五原县| 鄂温| 罗定市| 清水河县|