python + unittest 做單元測試之學習筆記
單元測試在保證開發效率、可維護性和軟件質量等方面有很重要的地位,所謂的單元測試,就是對一個類,一個模塊或者一個函數進行正確性檢測的一種測試方式。
這裏主要是就應用 python + unitest 做單元測試做的一些學習筆記。
Unittest 提供了test cases, test suites, test fixtures,test runner:
- test case :通過繼承TestCase類,我們可以創建一個test,或者一組tests
- test suites : 測試套件, 使用時要將test case 裝載到測試套件裏
- test fixtures : setup + test case + teardown,每個test case執行的時候都會運行setUp->test_case->tearDown ,因此setUp 和 tearDown 可以用來做環境的初始化。例如,寫一個有關數據操作的類,setUp放連接數據庫,tearDown 放關閉數據庫連接。
一、unittest.main() 的使用
所有的test case 要以test開頭,例如 def test_pass_case(self)
具體的單元測試例子如下:
import unittest def calc(x,y): return x + y class TestCalc(unittest.TestCase): def test_pass_case(self): ‘‘‘這是通過的測試用例‘‘‘ print(‘這個是通過用例‘) res = calc(1,2) self.assertEqual(3,res) self.assertNotEqual(2,3) def setUp(self):#每個用例執行前都會執行它 print(‘我是setUp‘) def tearDown(self):#每個用例運行之後都會執行它 print(‘我是tearDown‘) @classmethod def setUpClass(cls):#所有的用例執行之前執行一次,setUp()前 print(‘我是setupClass‘)#所有的用例都運行完之後執行一次,setDown 後 @classmethoddef tearDownClass(cls):#所有的用例執行之後執行一次,setDown()後 print(‘我是teardownClass‘) def test_a(self): ‘‘‘這是普通的測試用例‘‘‘ print(‘a‘) def test_fail_case(self): ‘‘‘這是失敗的測試用例‘‘‘ print(‘這個是失敗的測試用例‘) res = calc(9,8) self.assertEqual(98,res) def test_haha(self): ‘‘‘這是哈哈‘‘‘ self.assertEqual(1,2) if __name__ == ‘__main__‘: unittest.main()#它會幫你運行當前這個python裏面所有的測試用例
由此可以看到,執行順序是:靜態方法 setUpClass() -> setUp -> test case -> SetDown ->... -> SetUp -> testcase -> testDown -> 靜態方法 setDownClass()。
所以可以用setUpClass、tearDownClass做所有用例的前置初始化和結束。
unittest.main() #它會幫你運行當前這個python裏面所有的測試用例
二、 應用 HTMLTestRunner 生成測試報告
if __name__ == ‘__main__‘: suite = unittest.TestSuite()#定義一個測試套件 suite.addTest(TestCalc(‘test_pass_case‘))#測試套件中添加測試用例 suite.addTest(TestCalc(‘test_a‘)) f = open(‘report.html‘,‘wb‘)#打開一個保存結果的html文件 runner = HTMLTestRunner.HTMLTestRunner(stream=f,title=‘測試報告‘,description=‘測試情況‘)#生成執行用例的對象 runner.run(suite)#運行
可以將某幾個test case加入test suite ,這樣生成的測試報告裏只有這兩個test case 的結果。
具體如下:
可以將類裏所有的test case加入test suite,如下
suite.addTests(unittest.makeSuite(TestCalc))#把類裏面所有的測試用例加入測試套件
得到的測試報告結果為:
三、針對整個項目的test case,生成測試報告
例如有以下的結構:
test_buy 裏關於購買的cases, test_login是關於login 的cases, test_reg是關於註冊的cases, run_all_cases執行所有的cases
註意,在test_buy, test_login,test_reg裏的case 需要以test 開頭,這樣才會被執行到,還有這三個文件不一定以test開頭,這裏只是為了方便才這麽寫的,但是必須得有相同的規則,比如這裏的文件名都以test_ 開頭。
run_all_cases.py代碼如下所示:
import unittest,HTMLTestRunner suite = unittest.TestSuite() all_cases = unittest.defaultTestLoader.discover(‘.‘,‘test_*.py‘)#第一個參數:從哪個目錄,第二個參數:定義規則 # for case in all_cases: # suite.addTests(case) [suite.addTests(case) for case in all_cases]#列表生成式,和上面的註釋寫法一樣 f = open(‘new_report.html‘,‘wb‘)#打開一個保存結果的html文件 runner = HTMLTestRunner.HTMLTestRunner(stream=f,title=‘測試報告‘,description=‘測試情況‘)#生成執行用例的對象 runner.run(suite)#運行
四、集成jenkins,生成jenkins能識別的測試報告
這裏就要用到 xmlrunner 模塊,jenkins能識別xml格式。
runner = xmlrunner.XMLTestRunner(‘.‘)#當前目錄
以上就是對Unittest的簡單總結,後續會持續更新。
python + unittest 做單元測試之學習筆記