unittest是一個python版本的junit,junit是java中的單元測試框架,unittest實現了很多junit中的概念,比如我們非常熟悉的test case, test suite等,總之,原理都是相通的,只是用不同的語言表達出來。
unittest中的4個重要的概念:test fixture, test case, test suite, test runner,我覺得只有理解了這幾個概念,才能真正的理解單元測試的基本原理,下面就主要圍繞這幾個概念來展開這篇文章。
1、Test Case
一個TestCase的實例就是一個測試用例。什么是測試用例呢?就是一個完整的測試流程,包括測試前准備環境的搭建(setUp),執行測試代 碼(run),以及測試后環境的還原(tearDown)。單元測試(unit test)的本質也就在這里,一個測試用例是一個完整的測試單元,通過運行這個測試單元,可以對某一個問題進行驗證。
2、Test Suite
一個功能的驗證往往需要多個測試用例,可以把多個測試用例集合在一起執行的,就是TestSuite,TestSuit用來組裝單個測試用例,可以通過addTest加載到TestCase到TestSuit中,從而返回一個TestSuit實例;而且TestSuite也可以嵌套TestSuite。
(TestLoader是用來加載TestCase到TestSuite中的,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase,創建它們的實例,然后add到TestSuite中,再返回一個TestSuite實例)
3、TestRunner
測試的執行也是單元測試中非常重要的一個概念,一般單元測試框架中都會提供非常豐富的執行策略和執行結果;在unittest中,通過TextTestRunner是來執行測試用例的,其中的run(test)會執行TestSuite/TestCase中的run(result)方法。測試的結果會保存到TextTestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息。TestRunner可以使用圖形界面、文本界面,或者返回一個特殊的值的方式來表示測試執行結果。
(這樣整個流程就清楚了,首先是要寫好TestCase,然后由TestLoader加載TestCase到TestSuite,然后由 TextTestRunner來運行TestSuite,運行的結果保存在TextTestResult中,整個過程集成在unittest.main模 塊中)
4、Test Fixture
對一個測試用例環境的搭建和銷毀,是一個fixture,通過覆蓋TestCase的setUp()和tearDown()方法 來實現。這個有什么用呢?比如說在這個測試用例中需要訪問數據庫,那么可以在setUp()中建立數據庫連接以及進行一些初始化,在tearDown() 中清除在數據庫中產生的數據,然后關閉連接。注意tearDown的過程很重要,要為以后的TestCase留下一個干凈的環境。關於fixture,還 有一個專門的庫函數叫做fixtures,功能更加強大,詳細介紹可以查閱相應的函數庫資料。
下面以一個小例子來說明一下這幾個用法
首先編寫需要引入的方法test_Count.py
class Count: def __init__(self,a,b): self.a=int(a) self.b=int(b) def add(self): return self.a+self.b
定義一個Count類,有兩個參數,定義一個方法,實現兩個參數想加
接着寫實現該方法測試腳本test_TestCount.py
rom test_Count import Count import unittest class TestCount(unittest.TestCase): def setUp(self): print("test start") def test_add(self): j=Count(5,6) self.assertEqual(j.add(),11) def test_add2(self): j=Count(12,11) self.assertEqual(j.add(),23) def tearDown(self): print("test end") if __name__=='__main__': suite=unittest.TestSuite() suite.addTest(TestCount("test_add2")) suite.addTest(TestCount("test_add")) runner=unittest.TextTestRunner() runner.run(suite)
首先引入Test_Count中的Count類,接着在引入unittest框架;然后重寫TestCase里面的方法,包括setUp()、測試方法、tearDown();最后在在main下調用unittest框架的TestSuite()類來創建測試套件。通過他提供的addTest()方法來添加測試用例“test_add()”、“test_add()”,再調用unittest框架的TextTestRunner()類,通過它下面的runn()方法來運行suite所組裝的測試用例
執行結果如下: