一、概述
本文介紹python的單元測試框架unittest,這是Python自帶的標准模塊unittest。unittest是基於java中的流行單元測試框架junit設計的,其功能強大且靈活,對於熟悉junit的人來說掌握unittest很簡單。
unittest涉及的知識點較多,但核心的就那一些,本文只介紹最核心和基礎的內容。
類似junit,使用unittest編寫python的單元測試代碼,包括如下幾個步驟:
1)編寫一個python類,繼承 unittest模塊中的TestCase類,這就是一個測試類
2)在上面編寫的測試類中定義測試方法(這個就是指的測試用例),每個方法的方法名要求以 test 打頭,沒有額外的參數。 在該測試方法中 調用被測試代碼,校驗測試結果,TestCase類中提供了很多標准的校驗方法,如 最常見的assertEqual。
3)執行 unittest.main() ,該函數會負責運行測試,它會實例化所有TestCase的子類,並運行其中所有以test打頭的方法。
二、案例1
我們下面看一個例子,編寫如下的python文件,為了簡單,我們將被測函數與測試代碼放在一個文件中了:
#coding=utf-8 import unittest #被測試方法 def cal(a,b): return a+b #測試類 class CalTest(unittest.TestCase): def testA(self): expected = 6 result = cal(2,4) self.assertEqual(expected,result) def testB(self): expected = 0 result = cal(2,1) self.assertEqual(expected,result) #執行所以測試代碼 if __name__=='__main__':unittest.main()
上面的測試類CalTest中有兩個測試方法,顯然testB方法我們估計讓校驗出錯。在命令行下執行上述python文件,輸出如下信息:
.F
======================================================================
FAIL: testB (__main__.CalTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test2.py", line 19, in testB
self.assertEqual(expected,result)
AssertionError: 0 != 3
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)
上面顯示出了執行出錯的用例,以及出錯信息。最后兩句給出了整個測試執行所花的時間,以及測試失敗的用例數。
如果我們將testB修改正確,運行結果輸出如下:
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
三、案例2
上面的例子只有一個測試文件(python文件)。在實際的項目中,往往又多個測試文件,每個測試文件針對不同的業務代碼進行測試。
那這時該怎么去執行所有測試文件中的測試用例呢?
假設我們有test1.py測試文件中定義了一個測試類CalTest1 , 另外一個測試test2.py測試文件中定義了一個測試類CalTest2.
這樣要想同時能執行這兩個測試文件中的測試用例,可編寫如下的一個總的測試文件,作為執行的總入口:
#coding=utf-8 import unittest from test1 import CalTest1 from test2 import CalTest2 if __name__=='__main__':unittest.main()
從上面的例子,可以看出,使用unittest框架還是比較簡單和方便的。