1. 程式人生 > >python + unittest 做單元測試之學習筆記

python + unittest 做單元測試之學習筆記

stl unittest 例子 gin pre log script 有關 assert

單元測試在保證開發效率、可維護性和軟件質量等方面有很重要的地位,所謂的單元測試,就是對一個類,一個模塊或者一個函數進行正確性檢測的一種測試方式。

這裏主要是就應用 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 後 @classmethod
def 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 做單元測試之學習筆記