『心善淵』Selenium3.0基礎 — 25、unittest單元測試框架

繁華似錦Fighting發表於2021-07-14

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:表示程式碼有問題。

相關文章