目錄
1、unittest基本簡介
unittest
是Python自帶的一個單元測試框架,unittest
又被稱為PyUnit
,是由Java的JUnit
衍生而來,基本結構是類似的。對於單元測試,需要設定預先條件,對比預期結果和實際結果。
由於unittest
是Python自帶的標準模組,所以不需要單獨再去安裝。引入包import unittest
即可使用。
2、unittest基本概念
(1)unittest核心的四個概念
test fixture
:
fixture
表示test case
執行前需要做的準備工作以及結束後的清理工作。比如,建立臨時/代理資料庫、目錄或啟動一個瀏覽器程式。test case
:
test case
是單元測試中的最小個體,通常是使用assert方法(斷言)檢查動作和輸入的響應。
unittest
提供了一個基礎類TestCase
,一般是基於TestCase類進行擴充,來建立test case
測試用例。test suite
:
test suite
(套件)是test case
的合集,通常用test suite
將test case
按需求彙總後,統一執行。(批量執行用例)test runner
:
test runner
是一個執行器,用來執行測試用例或者套件。並將測試結果儲存到TextTestResult
例項中,包括執行了多少測試用例,成功了多少,失敗了多少等資訊。並提供圖形介面、文字介面或者返回一個值展示測試結果。
(2)如何建立一個測試類
所有測試用例類都要繼承TestCase
基本類。
# 1. 匯入unittest
import unittest
# 2. 定義一個測試類
class Test_demo(unittest.TestCase):
(3)test fixture
常用的四個方法
1)基於函式級別的方法
setup()
:每個測試方法執行前執行一次。測試類中有多少測試用例執行多少次。teardown()
:每個測試方法執行完後執行一次。測試類中有多少測試用例執行多少次。
2)基於類級別的方法
setUpClass()
:在測試類執行前執行一次,需要@classmethod
裝飾器修飾。tearDownClass()
:在測試類執行完後執行一次,需要@classmethod
裝飾器修飾。
(4)unittest編寫測試方法(用例)規範
py
檔案需要以test
開頭。(規範,不必須)- 測試類名稱需要
Test
開頭。(規範,不必須) - 每個測試方法名稱均以
test
開頭,否則是不被unittest
識別的。(規範,必須) - 在
unittest
框架中,測試用例就是TestCase
的例項,所以每個測試類必須繼承unittest
中TestCase
類來編寫用例。 - 測試方法必須帶
self
引數,用來單獨執行或則組合執行用例。 - 測試用例的執行順序是按照測試方法名的ASCII編碼字符集的順序進行排序的。
(5)執行測試指令碼
unittest.main()
:將一個單元測試模組變為可直接執行的測試指令碼,main()
方法是使用TestLoader
類來搜尋所有包含在該模組中以test
命名開頭的測試方法,並自動執行他們。
執行方法的預設順序是:根據ASCII碼的順序載入測試用例,數字與字母的順序為:0-9,A-Z,a-z
。
3、unittest入門示例
"""
1.學習目標
掌握unittest框架下測試用例編寫方法
2.操作步驟
2.1 匯入unittest
2.2 建立測試類
測試類名稱需要Test開頭
繼承unittest中的TestCase基本類
class Test_demo(unittest.TestCase):
2.3 編寫test fixture
setUp()--前置函式
tearDown()--後置函式
setUpClass()--+@classmethod
tearDownClass()+@classmethod
2.4 編寫test case
測試方法名稱均以test開頭
測試用例執行順序:按照測試用例名稱ASCII字符集編碼排序。
所以我們在執行測試類中的測試方法的時候,要注意測試方法的執行順序。
3.需求
編寫簡單的測試類
"""
# 1 匯入unittest
import unittest
# 2 建立測試類
class Test_demo(unittest.TestCase):
# 3 編寫test fixture
# setUp我們也稱之為前置函式
def setUp(self) -> None:
print("setUp在每個測試用例執行前先執行。")
# setUp我們也稱之為後置函式
def tearDown(self) -> None:
print("tearDown在每個測試用例執行後執行。")
@classmethod
# cls等同於self,用於函式和類方便區分。
def setUpClass(cls) -> None:
print("setUpClass在測試類執行前先執行。")
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass在測試類執行後執行。")
# 4 編寫test case
# 每個測試方法均以test開頭,否則是不被unittest識別的。
def test_case_03(self):
"""測試用例3,這裡是測試用例的備註"""
# 測試方法中,將多行註釋寫在第一行,就是該方法的備註。
print("執行測試用例3")
def test_case_02(self):
"""測試用例2"""
print("執行測試用例2")
def test_case_01(self):
"""測試用例1"""
print("執行測試用例1")
if __name__ == '__main__':
# 執行當前測試類中,以test開頭的所有測試用例
unittest.main()
"""
輸出結果:
setUpClass在測試類執行前先執行。
setUp在每個測試用例執行前先執行。
執行測試用例1
tearDown在每個測試用例執行後執行。
setUp在每個測試用例執行前先執行。
執行測試用例2
tearDown在每個測試用例執行後執行。
setUp在每個測試用例執行前先執行。
執行測試用例3
tearDown在每個測試用例執行後執行。
tearDownClass在測試類執行後執行。
"""
提示:
test fixture
的四個方法,用到哪個寫哪個就好,不用全部都寫。
結果說明:
測試執行完成後,會列印如下資訊
# 執行了3個測試用例,執行的時間
Ran 3 tests in 0.008s
# 執行結果
OK
執行結果有如下三種:
OK
:表示測試用例全部通過。F
:表示測試用例沒通過,程式碼沒有問題。E
:表示程式碼有問題。