python單元測試unittest執行個體詳解

來源:互聯網
上載者:User
本文執行個體講述了python單元測試unittest用法。分享給大家供大家參考。具體分析如下:

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

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

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

1.1 測試模組中的函數:

被測模組:

#!/usr/bin/env python #encoding: utf-8 def sum( x, y):     return x+y def sub( x, y):     return x-y

單元測試模組:

#!/usr/bin/env python #encoding: utf-8 import unittest import myclass class mytest(unittest.TestCase):   ##初始化工作   def setUp(self):     pass   #退出清理工作   def tearDown(self):     pass   #具體的測試案例,一定要以test開頭   def testsum(self):     self.assertEqual(myclass.sum(1, 2), 2, 'test sum fail')   def testsub(self):     self.assertEqual(myclass.sub(2, 1), 1, 'test sub fail')   if __name__ =='__main__':   unittest.main()

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

.F======================================================================FAIL: testsum (__main__.mytest)----------------------------------------------------------------------Traceback (most recent call last): File "C:\Users\xiaowu\workspace\mypython\unitTest.py", line 19, in testsum  self.assertEqual(myclass.sum(1, 2), 2, 'test sum fail')AssertionError: test sum fail----------------------------------------------------------------------Ran 2 tests in 0.001s FAILED (failures=1)

1.2 測試模組類中的函數:

被測模組:

#!/usr/bin/env python#encoding: utf-8class myclass:  def __init__(self):    pass  def sum(self, x, y):    return x+y  def sub(self, x, y):    return x-y

單元測試模組:

#!/usr/bin/env python #encoding: utf-8 import unittest import myclass class mytest(unittest.TestCase):   ##初始化工作   def setUp(self):     self.tclass = myclass.myclass()    ##執行個體化了被測試模組中的類   #退出清理工作   def tearDown(self):     pass   #具體的測試案例,一定要以test開頭   def testsum(self):     self.assertEqual(self.tclass.sum(1, 2), 3) if __name__ =='__main__':   unittest.main()

運行結果:

.----------------------------------------------------------------------Ran 1 test in 0.000sOK

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

2 載入測試套件

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

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

>>import unittest >>dir(unittest) ['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult', 'Tes tSuite', 'TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator', '__all__', '__author__', '__builtins__', '__doc__', '__email__', '__file__', '__ metaclass__', '__name__', '__package__', '__unittest', '__version__', '_makeLoad er', '_strclass', 'defaultTestLoader', 'findTestCases', 'getTestCaseNames', 'mai n', 'makeSuite', 'os', 'sys', 'time', 'traceback', 'types']

可以看到其自身的成員也不是很多,大概包括有:

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

好吧,我們大概看看具體都是幹什麼的

>>memblist = ['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult',\ 'TestSuite','TextTestRunner', 'defaultTestLoader','findTestCases', 'getTestCaseNames', \ 'main', 'makeSuite'] >>for memb in memblist: .. cur = getattr(unittest, memb) .. 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, 當然這個檔案本身是一個單元測試的檔案】

#!/usr/bin/env python#encoding: utf-8#該代碼源自深入pythonimport unittestimport myclassimport reimport osimport sysdef testAllinCurrent():  path = os.path.abspath(os.path.dirname(sys.argv[0]))  files = os.listdir(path)  test = re.compile("test\.py{1}quot;, re.IGNORECASE)  files = filter(test.search, files)  filenameToModuleName = lambda f: os.path.splitext(f)[0]  moduleNames = map(filenameToModuleName, files)  modules = map(__import__, moduleNames)  load = unittest.defaultTestLoader.loadTestsFromModule  return unittest.TestSuite(map(load, modules))if __name__ == "__main__":  unittest.main(defaultTest="regressionTest")

希望本文所述對大家的Python程式設計有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.