1、unittest基本簡介

unittest是Python自帶的一個單元測試框架,unittest又被稱為PyUnit,是由Java的JUnit衍生而來,基本結構是類似的。對於單元測試,需要設定預先條件,對比預期結果和實際結果。

由於unittest是Python自帶的標準模組,所以不需要單獨再去安裝。引入包import unittest即可使用。

2、unittest基本概念

(1)unittest核心的四個概念

  1. test fixture

    fixture表示test case執行前需要做的準備工作以及結束後的清理工作。比如,建立臨時/代理資料庫、目錄或啟動一個瀏覽器程序。
  2. test case

    test case是單元測試中的最小個體,通常是使用assert方法(斷言)檢查動作和輸入的響應。

    unittest提供了一個基礎類TestCase,一般是基於TestCase類進行擴充,來建立test case測試用例。
  3. test suite

    test suite(套件)是test case的合集,通常用test suitetest case按需求彙總後,統一執行。(批量執行用例)
  4. 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編寫測試方法(用例)規範

  1. py檔案需要以test開頭。(規範,不必須)
  2. 測試類名稱需要Test開頭。(規範,不必須)
  3. 每個測試方法名稱均以test開頭,否則是不被unittest識別的。(規範,必須)
  4. unittest框架中,測試用例就是TestCase的例項,所以每個測試類必須繼承unittestTestCase類來編寫用例。
  5. 測試方法必須帶self引數,用來單獨執行或則組合執行用例。
  6. 測試用例的執行順序是按照測試方法名的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:表示程式碼有問題。