一文搞懂 unittest 單元測試框架
阿新 • • 發佈:2021-12-23
前言
unittest 是一款基於 Python 語言的單元測試框架。unittest 是 Python 開發包
中的一個標準模組,使用的時候直接匯入即可。
官方文件:
https://docs.python.org/2/library/unittest.html
為啥要用框架?
- 方便組建測試用例
- 一鍵執行用例,跳過用例等
- 並生成視覺化測試報告
- 他支援測試自動化,多個用例共享前置以及清理程式碼
官網文件例子:
import unittest
print(help(unittest))
語法規則:
-
匯入unittest:import unittest
-
建立一個測試類,必須要繼承unittest.TestCase類
-
建立一個測試方法,且方法要以“test” 開頭
import unittest class IntegerArithmeticTestCase(unittest.TestCase): def testAdd(self): # test method names begin with 'test' # 測試用例的名稱要以test開頭 self.assertEqual((1 + 2), 3) # 斷言,assertEqual 判斷相等 self.assertEqual(0 + 1, 1) def testMultiply(self): self.assertEqual((0 * 10), 0) self.assertEqual((5 * 8), 40) if __name__ == '__main__': unittest.main() """ 執行結果: .. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK """
unittest的執行結果:
-
2 : 表示執行了兩條用例
-
. 表示測試用例執行通過
-
F 表示執行失敗
-
E 表示執行錯誤
-
S 表示執行跳過
重要概念
- Test Case:
最小的測試單元,即測試方法。
unittest提供了TestCase基類,我們建立的測試類要繼承該基類,它可以用來建立新的測試用例。
- Test Suite:
測試用例、測試套件或兩者的集合,用於組裝一組要執行的測試。
使用TestSuite類來建立測試套件。
- Test Runner:
Test Runner是一個元件,用於協調測試的執行並向用戶提供結果。
unittest提供了TextTestRunner類執行測試用例。
- TestLoder:
是用來載入 TestCase到TestSuite中,其中有幾個loadTestsFrom_()方法,就是從各個地方尋找TestCase,建立他們的例項,然後add到TestSuite中,再返回一個TestSuite例項
- TextTestResult:
測試結果會儲存到TextTestResult例項中,包括運行了多少用例,成功與失敗多少等資訊;
- TestFixture:
測試用例的初始化準備及環境還原,主要是setUp() 和 setDown()方法;
測試用例執行順序
unittest預設按照ASCII碼的順序載入測試用例(包括測試目錄和測試檔案、測試類、測試方法),即它並不是按照測試用例的建立順序從上到下執行的。
discover() 和 main()方法的執行順序是一樣的。故想讓某個測試檔案先執行,可以在命名上加以控制。
如何控制順序?
可以通過TestSuite類的addTest()方法按照一定的順序來載入測試用例,這樣想先被執行的用例就可以先載入。
import unittest
class IntegerArithmeticTestCase(unittest.TestCase):
def testAdd(self): # test method names begin with 'test'
print("加法")
self.assertEqual((1 + 2), 3)
self.assertEqual(0 + 1, 1)
def testMultiply(self):
print("乘法")
self.assertEqual((0 * 10), 0)
self.assertEqual((5 * 8), 40)
class SubtractionTestCase(unittest.TestCase):
def testSubtraction(self):
print("減法")
self.assertEqual((5 - 3), 2)
if __name__ == '__main__':
# 建立測試套件
suit = unittest.TestSuite()
suit.addTest(IntegerArithmeticTestCase("testAdd")) # 新增測試用例,新增 加法 用例到測試套件中
suit.addTest(SubtractionTestCase("testSubtraction")) # SubtractionTestCase 類名稱,testSubtraction 用例名稱
# 建立測試執行器
runner = unittest.TextTestRunner()
runner.run(suit)
"""
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
加法
減法
"""
Setup和Teardown
前置和後置
使用場景:
- 前置: 先登入、插入資料,再執行其他用例
- 後置: 執行完用例,退出登入,清理資料等
-
setUpModule/tearDownModule
在整個模組的開始與結束時被執行 -
setUpClass/ tearDownClass
在測試類的開始與結束時被執行 -
setUp/tearDown
在測試用例的開始與結束時被執行
# 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.000s
OK
這是用例的前置處理
這是第一條用例
這是用例的後置處理
這是用例的前置處理
這是第二條用例
這是用例的後置處理
這是用例的前置處理
這是第三條用例
這是用例的後置處理
"""