『心善淵』Selenium3.0基礎 — 28、unittest中測試套件的使用

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

1、測試套件的作用

在我們實際工作,使用unittest框架會有兩個問題:

  1. 我們知道測試用例的執行順序是根據測試用例名稱順序執行的,在不改變用例名稱的情況下,我們怎麼來控制用例執行的順序。
  2. 一個測試檔案,我們直接執行該檔案即可,但如果有多個測試檔案,怎麼實現多個測試檔案一起執行行。

要解決上面兩個問題,我們就要用到測試套件TestSuite

2、使用測試套件

(1)入門示例

1)用法

  1. unittest.TestSuite():建立測試套件。
  2. addTest()addTests()方法是將測試用例新增到測試套件中。
  3. unittest.TextTextRunner():通過該類下面的run()方法來執行suite所組裝的測試用例,suite測試套件為run()方法引數。

例如:將test_Demo1模組下的TestDmeo類下的test_case_01測試用例新增到測試套件中。

# 1.建立測試套件
suite = unittest.TestSuite()

# 2.向測試套件中新增測試用例
# 模組名.測試類名('測試用例名')
suite.addTest(test_Demo.TestDmeo('test_case_01'))

# 3.執行測試套件中的用例
runner = unittest.TextTestRunner()
runner.run(suite)

2)示例

# 1 匯入unittest
import unittest

# 2 建立測試類
class TestDmeo(unittest.TestCase):

    # 3 編寫test case
    def test_case_01(self):
        """測試用例1"""
        print("執行測試用例1")

    def test_case_02(self):
        """測試用例2"""
        print("執行測試用例2")

    def test_case_03(self):
        """測試用例3"""
        print("執行測試用例3")


if __name__ == '__main__':
    # 執行當前測試類中,以test開頭的測試用例
    # unittest.main()

    # 1. 建立測試套件
    suite = unittest.TestSuite()
    # 2. 向測試套件中新增測試用例
    # 當前模組中的測試用例,可省略模組名(檔名)
    suite.addTest(TestDmeo('test_case_02'))
    suite.addTest(TestDmeo('test_case_03'))
    suite.addTest(TestDmeo('test_case_01'))
    # 3. 執行測試套件中的用例
    runner = unittest.TextTestRunner()
    runner.run(suite)

提示:向測試套件中新增測試用例的順序,就是測試用例執行的順序。(此時解決了第一個問題)

注意:

使用PyCharm執行上邊程式碼,會按順序執行全部測試用例,這是PyCharm問題。

使用命令列直接執行該Python檔案,沒有問題。

(2)根據不同的條件載入測試用例(瞭解)

提示:這種方式很少用,瞭解一下即可。推薦都用下面的方式(3)。

unittest.TestLoader():根據不同的條件載入測試用例,其中有幾個方法:

  1. unittest.TestLoader().loadTestsFromName(測試用例名)
  2. unittest.TestLoader().loadTestsFromNames(測試用例名的列表)
  3. unittest.TestLoader().loadTestsFromTestCase(測試類名)
  4. unittest.TestLoader().loadTestsFromModule(模組名)
  5. unittest.TestLoader().discover()

例如:將``test_demo2模組下的TestDmeo類下的test_case_01`測試用例新增到測試套件中。

測試用例名格式:檔名+類名+方法名,一級一級的。

示例

# 1 匯入unittest
import unittest

# 2 建立測試類
class TestDmeo(unittest.TestCase):

    # 3 編寫test case
    def test_case_0001(self):
        """測試用例0001"""
        print("執行測試用例0001")

    def test_case_0002(self):
        """測試用例0002"""
        print("執行測試用例0002")

    def test_case_0003(self):
        """測試用例0003"""
        print("執行測試用例0003")


if __name__ == '__main__':
    # 1. 建立測試套件
    suite = unittest.TestSuite()

    # 2. 向測試套件中新增測試用例
    """
    # 2.1 loadTestsFromName
    # 提示:
        name引數是傳入檔名,字串格式
        格式:模組名.測試類名.測試用例名  
    """
    # suite_1 = unittest.TestLoader().loadTestsFromName('test_demo2.TestDmeo.test_case_01')

    """
    # 2.2 loadTestsFromNames
        引數是一個列表,列表中的元素格式同上
    """
    # suite_1 = unittest.TestLoader().loadTestsFromNames(
    #     ['test_demo2.TestDmeo.test_case_01','test_demo2.TestDmeo.test_case_02'])

    """
    # 2.3  loadTestsFromTestCase
        引數一個測試類名
        當前模組直接傳如測試類名稱即可
    """
    suite_1 = unittest.TestLoader().loadTestsFromTestCase(TestDmeo)

    # 加入套件
    suite.addTest(suite_1)
    # 3. 執行測試套件中的用例
    runner = unittest.TextTestRunner()
    runner.run(suite)

(3)常用方式(推薦)

unittest.defaultTestLoader():通過該類下面的discover()方法可自動根據測試目錄test_dir匹配查詢測試用例檔案,如test*.py,並將查詢到的測試用例組裝到測試套件中。

1)簡單示例:

discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

2)測試套件示例:

  1. 建立test_case包用來存放測試用例。
  2. 以上面兩個測試類做例子,把test_demo1test_demo2兩個測試用例類檔案放入test_case包中。
  3. 編寫呼叫用例指令碼run_case.py檔案執行多個測試用例。

3)說明:

test_demo1test_demo2兩個檔案,就是上面(1)(2)的示例。

下面是run_case.py檔案內容,需求是同時執行test_demo1test_demo2兩個檔案中的測試用例。

"""
1.學習目標
    run_case.py必須會寫
2.操作步驟
    2.1 明確測試用例存放路徑
    2.2 將要執行的用例新增到測試套件中
    2.3 執行測試套件中的用例
3.注意事項
    1.run_case.py檔案需要放置在專案根目錄下
    2.所有測試用例都寫在test_caset資料夾中
    3.編寫用例的py檔案需要以test開頭
"""
# 1.匯入unittest
import unittest

# 2.獲取測試用例存放路徑---測試用例存放資料夾
case_path = "./test_case"

# 3.新增用例到測試套件中
"""
# 如果只新增一個檔案,pattern就直接填寫檔名
start_dir, 指定case目錄
pattern='test*.py', 匹配檔案規則,# 選擇資料夾中的寫test_開頭的py檔案
"""
discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py")  

# 4.執行測試套件中的用例
runner = unittest.TextTestRunner()
runner.run(discover)

相關文章