1. 程式人生 > >Python 中 unittest(單元測試)的學習

Python 中 unittest(單元測試)的學習

python 中單元測試 unittest模組學習

unittest主要概念:

    1. 一個TestCase的例項就是一個測試用例。什麼是測試用例呢?就是一個完整的測試流程,包括測試前準備環境的搭建(setUp),執行測試程式碼(run),以及測試後環境的還原(tearDown)。元測試(unit test)的本質也就在這裡,一個測試用例是一個完整的測試單元,通過執行這個測試單元,可以對某一個問題進行驗證。
    2.而多個測試用例集合在一起,就是TestSuite,而且TestSuite也可以巢狀TestSuite。
    3.TestLoader是用來載入TestCase到TestSuite中的,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase,建立它們的例項,然後add到TestSuite中,再返回一個TestSuite例項。
    4.TextTestRunner是來執行測試用例的,其中的run(test)會執行TestSuite/TestCase中的run(result)方法。
    PS:測試的結果會儲存到TextTestResult例項中,包括運行了多少測試用例,成功了多少,失敗了多少等資訊。

關鍵程式碼->>>原始檔(widget.py)
 # /usr/bin/python
 # encoding:utf-8

 class Widget:
     def __init__(self, size=(40, 40)):
         self._size = size

     def get_size
(self):
return self._size def resize(self, width, height): if width < 0 or height < 0: raise ValueError, 'illegal size' self._size = (width, height) if __name__ == '__main__': widget = Widget() print widget.get_size()

關鍵程式碼->>>測試檔案(widgettest.py)

# /usr/bin/python
# encoding:utf-8

from widget import Widget
import unittest


class WidgetTestCase(unittest.TestCase):

# 物件的初始化工作可以在setUp()方法中完成
    def setUp(self):
        self.widget = Widget()

# 物件的資源的釋放則可以在tearDown()方法中完成
    def tearDown(self):
        self.widget.dispose()
        self.widget = None

# 對應widget類中的get_size函式測試
    def test_size(self):
        self.assertEqual(self.widget.get_size(), (40, 40))

# 對應widget類中resize函式的測試
    def test_Resize(self):
        self.widget.resize(100, 100)
        self.assertEqual(self.widget.get_size(), (100, 100))

if __name__ == "__main__":
    unittest.main()
按照以上兩個程式碼例項可以完成具體的python單元測試

測試用例集TestSuite

完整的單元測試很少只執行一個測試用例,開發人員通常需要編寫多個測試用例才能對某一軟體功能進行比較完成的測試,這些相關的測試用例稱為一個測試用例集,在PyUnit中是用TestSuite類來表示的。PyUinit測試框架允許Python程式設計師在單元測試程式碼中定義一個名為suite()的全域性函式,並將其作為整個單元測試的入口,PyUnit通過呼叫它來完成整個測試過程:

如:

def suite():  
    suite = unittest.TestSuite()  
    suite.addTest(WidgetTestCase("testSize"))  
    suite.addTest(WidgetTestCase("testResize"))  
    return suite 

or 直接定義一個TestSuite的子類,並在其初始化方法init中完成所有測試用例的新增:

class WidgetTestSuite(unittest.TestSuite)  
    def __init__(self):  
        unittest.TestSuite.__init__(self, map(WidgetTestCase, ("testSize", "testResize")))  

這樣只需要在suite()方法中返回該類的一個例項就可以了:

def suite():  
    return WidgetTestSuite()

在PyUnit測試框架中,TestSuite類可以看成是TestCase類的一個容器,用來對多個測試用例進行組織,這樣多個測試用例可以自動在一次測試中全部完成。事實上,TestSuite除了可以包含TestCase外,也可以包含TestSuite,從而可以構成一個更龐大的測試用例集:

suite1 = mysuite1.TheTestSuite()
suite2 = mysuite2.TheTestSuite()
alltests = unittest.TestSuite((suite1, suite2))

編寫測試用例(TestCase)並將它們組織成測試用例集(TestSuite)的最終目的只有一個:實施測試並獲得最終結果。PyUnit使用TestRunner類作為測試用例的基本執行環境,來驅動整個單元測試過程。但是Python開發人員在進行單元測試時一般不直接使用TestRunner類,而是使用其子類TextTestRunner來完成測試,並將測試結果以文字方式顯示出來。舉例說明如下:

# /usr/bin/python
# encoding: utf-8

from widget import Widget  
import unittest  

#執行測試的類  
class WidgetTestCase(unittest.TestCase):  
    def setUp(self):  
        self.widget = Widget()  

    def tearDown(self):  
        self.widget.dispose()  
        self.widget = None  

    def test_size(self):  
        self.assertEqual(self.widget.get_size(), (40, 40))  

    def test_resize(self):  
        self.widget.resize(100, 100)  
        self.assertEqual(self.widget.get_size(), (100, 100))  

#測試  
if __name__ == "__main__":  
    #構造測試集              
    suite = unittest.TestSuite()  
    suite.addTest(WidgetTestCase("test_size"))  
    suite.addTest(WidgetTestCase("test_resize"))  
    #執行測試  
    runner = unittest.TextTestRunner()  
    runner.run(suite)  

Ps:原始碼和測試程式碼最好放在一起。