提及python的單元測試,第一反應確定就會是unittest,unittest做爲python的標準庫,很優秀,也被普遍的用到各個項目,可是大家知道嗎?python的單元測試並不僅有這一個,還有個pytest。和nose,後面咱們主要經過unittest+python完成咱們的自動化框架html
unittest單元測試框架最先受到junit(junit是java的單元測試,)的啓發,和其餘語言的主流單元測試框架有很類似的地方,他支持測試自動化,多個用例共享前置和清理代碼,聚合多個測試用例到測試集中,並將測試和報告框架獨立java
官方文檔:https://docs.python.org/2/library/unittest.htmlpython
一、TestCase(測試用例):全部的測試用例的基類,一個test case 包括正常執行的用例,其中包括setup(用例的開始),tearDown(用例的結束),以及run(用例的執行器)。c++
二、TestSuite(測試套件):多個測試用例的組合就是測試套件,TestSuite能夠嵌套TestSuite。框架
三、TestLoder:是用來加載 TestCase到TestSuite中,其中有幾個loadTestsFrom_()方法,就是從各個地方尋找TestCase,建立他們的實例,而後add到TestSuite中,再返回一個TestSuite實例函數
四、TextTestRunner:是來執行測試用例的,其中的run(test)會執行TestSuite/TestCase中的run(result)方法。
五、TextTestResult:測試結果會保存到TextTestResult實例中,包括運行了多少用例,成功與失敗多少等信息;
六、TestFixture:一個測試用例的初始化準備及環境還原,主要是setUp() 和 setDown()方法;單元測試
對於一些方法的使用,必需要先看一遍源碼,源碼上寫的很清楚的測試
import unittest class IntegerArithmeticTestCase(unittest.TestCase): def testAdd(self): # test method names begin with 'test' # 測試用例的名稱要以test開頭 self.assertEqual((1 + 2), 3) self.assertEqual(0 + 1, 1) def testMultiply(self): self.assertEqual((0 * 10), 0) self.assertEqual((5 * 8), 40) if __name__ == '__main__': unittest.main()
上面的源碼中經過繼承unittest.TestCase來建立一個測試用例,在這個類中,方法定位都是已test的前綴開頭(固然也能夠本身進行修改,這個要更改源碼,安靜後面進行補充),測試框架將它做爲獨立的測試去執行,每條用例中也都經過assert的方法進行去斷言ui
一、setUp:在寫測試用例的時候,這個就是執行用例的前置條件。
二、tearDown:執行完用例後,爲了避免影響下一次用例的執行,通常有個數據還原的過程,這就是執行用例的後置條件。
三、前置和後置都是非必要的條件,若是沒有也能夠寫pass,也能夠不寫
五、setUpClass():必須使用@classmethod 裝飾器,全部case運行前只運行一次
六、tearDownClass():必須使用@classmethod裝飾器,全部case運行完後只運行一次spa
說了這麼多,咱們動手試試。
# coding:utf-8 import unittest class Test(unittest.TestCase): def setUp(self): print('這是用例的前置') def tearDown(self): print('這是用例的後置') def test01(self): print('這是第一條用例') def test02(self): print('這是第二條用例') def test03(self): print('這是第三條用例') if __name__ == '__main__': unittest.main()
發現每執行一條用例,先執行的前置條件,而後執行用例內容,最後執行後置的條件。
Ran 3 tests in 0.001s 表示執行了3條用例公用了0.01S的時間
可能咱們遇到一些用例,只須要執行1次前置和後置,那麼咱們能夠經過添加裝飾器進行執行一次前置
裝飾器源碼:
class classmethod(object): """ classmethod(函數)- >方法 將函數轉換爲類方法。 類方法接收類做爲隱式的第一個參數, 就像實例方法接收實例同樣。 要聲明類方法,請使用如下習語: 丙級: @classmethod 定義f(cls, arg1, arg2,…): … 它能夠在類(例如C.f())上調用,也能夠在實例上調用 (例如C () .f ())。除了類以外,實例將被忽略。 若是爲派生類調用類方法,則爲派生類 對象做爲隱含的第一個參數傳遞。 類方法與c++或Java靜態方法不一樣。 若是您想要這些,請參閱staticmethod builtin。 """ def __get__(self, *args, **kwargs): # real signature unknown """ Return an attribute of instance, which is of type owner. """ pass def __init__(self, function): # real signature unknown; restored from __doc__ pass @staticmethod # known case of __new__ def __new__(*args, **kwargs): # real signature unknown """ Create and return a new object. See help(type) for accurate signature. """ pass __func__ = property(lambda self: object(), lambda self, v: None, lambda self: None) # default __isabstractmethod__ = property(lambda self: object(), lambda self, v: None, lambda self: None) # default __dict__ = None # (!) real value is ''
代碼操做
# coding:utf-8 import unittest class Test(unittest.TestCase):
@classmethod def setUpClass(self): print('這是用例的前置')
@classmethod def tearDownClass(self): print('這是用例的後置') def test01(self): print('這是第一條用例') def test02(self): print('這是第二條用例') def test03(self): print('這是第三條用例') if __name__ == '__main__': unittest.main()
執行結果
發現只執行了一次前置和一次後置。
unittest做爲python標準庫提供的單元測試,使用簡單,功能強大,平常測試需求都可以知足,可是unittest的強大的功能不僅僅只有這麼多,具體什麼功能,後面一一爲你們寫出來,若是又不足的地方也能夠提出來,安靜進行修改。
感受安靜寫的對您有幫助的話,能夠點個關注,持續更新。哪裏寫的有問題或者不懂的能夠留言,看到後第一時間回覆