1. 程式人生 > >python:discover()方法批量執行用例

python:discover()方法批量執行用例

runner 收集 使用 子目錄 utils 每次 框架 ner docs

自動化測試過程中,自動化覆蓋的功能點和對應測試用例之間的關系基本都是1 VS N,如果每次將測試用例一個個單獨執行,不僅效率很低,

無法快速反饋測試結果,而且維護起來很麻煩。在python的單元測試框架unittest中,提供了批量執行的測試用例的方法。

這篇博客,介紹下unittest框架的常用類和方法,以及利用discover()方法批量執行測試用例的方法。。。

官方文檔:unittest單元測試框架

一、unittest框架

首先介紹一下unittest框架和執行測試用例相關的幾個模塊:

1、TestCase()類

TestCase類的實例表示unittest中的邏輯測試單元,此類旨在用作基類,具體測試由具體的子類實現。該類實現了測試運行器所需的接口,以允許它驅動測試,

以及測試代碼可用於檢查和報告各種故障的方法。每個實例都將運行unittest的一個名為methodName的基本方法。

2、setUp()方法

該方法的主要作用是用來初始化測試環境,它在測試用例執行之前立即調用,除了AssertionError或SkipTest,通過該方法產生的任何異常都將被認為是錯誤的。

只有測試成功執行,才會被調用,默認什麽都不做。

3、tearDown()方法

該方法的主要作用是在測試用例執行完畢後記錄測試結果並恢復測試環境,即使出現異常,也會調用此方法。

4、run()方法

該方法的作用是運行測試用例,將測試結果收集到TestResult中作為傳遞的對象。

如果省略結果或者用None創建臨時結果對象(通過調用defaultTestResult()方法),結果對象會返回給run()的調用者。

5、defaultTestResult()方法

該方法返回應該用於此測試用例類的測試結果作為實例(如果沒有其他結果,實例應返回給run()方法)。

6、TestSuite()類

該類代表單個測試用例和測試套件的集合。它提供了運行測試所需的接口以使其可以像其他測試一樣運行。TestSuite實例和遍歷套件相同,單獨運行每個測試用例。

TestSuite的行為和TestCase非常相似,但它並未實際執行測試,而是用於將測試用例聚合到一起,下面的2個方法用於向TestSuite實例中添加測試用例:

addTest():添加測試用例到TestCase或TestSuite套件中;

addTests():將叠代TestCase和TestSuite實例中的所有測試用例添加到此測試組件,相當於調用addTest()的每個元素。

7、TestLoader()類

所述TestLoader類被用來創建類和模塊的測試套件。通常不需要創建該類的實例。unittest框架提供了一個可以共享的實例unittest.defaultTestLoader。

8、discover()方法

discover(start_dir, pattern =‘test *.py‘, top_level_dir = None

start_dir:要測試的模塊名或測試用例目錄;

pattern=‘test*.py‘:表示用例文件名的匹配原則,下面的例子中匹配文件名為以“test”開頭的“.py”文件,星號“*”表示任意多個字符;

top_level_dir=None:測試模塊的頂層目錄,如果沒有頂層目錄,默認為None;

該方法通過從指定的開始目錄遞歸到子目錄中查找所有測試模塊,並返回包含它們的TestSuite對象,只有與模式匹配測試文件和可導入的模塊名稱才會被加載。

所有測試模塊必須可以從項目的頂層導入,如果起始目錄不是頂層目錄,則頂層目錄必須單獨指定。

如果一個測試文件的名稱符合pattern,將檢查該文件是否包含 load_tests() 函數,如果 load_tests() 函數存在,則由該函數負責加載本文件中的測試用例。

如果不存在,就會執行loadTestsFromModule(),查找該文件中派生自TestCase 的類包含的 test 開頭的方法。

9、TestResult()類

該類用於記錄哪些測試成功或失敗的信息。一個TestResult對象存儲一組測試的結果,在TestCase和TestSuite中保證結果正確記錄。

測試框架unittest需要訪問TestResult作為報告目的運行一組測試所生成的對象,為此目的TestResult和TestRunner.run()方法返回一個實例 。

二、addTest()實例

舉個例子來說,如果測試用例有下面這些:

技術分享圖片

使用addTest()方法執行測試用例,示例代碼如下:

# coding=utf-8
import unittest

# 加載測試用例
import test_user
import test_mobile
import test_mobcode
import test_txtcode
import test_pwd
import test_signup
import test_login
import test_vipcenter
import test_search

# 將測試用例添加到測試集合
suite = unittest.TestSuite()
suite.addTest(test_user.UserTest("test_user"))           # 用戶名
suite.addTest(test_mobile.MobileTest("test_mobile"))     # 手機號碼
suite.addTest(test_mobcode.MobCodeTest("test_mobcode"))  # 手機驗證碼
suite.addTest(test_txtcode.TxtCodeTest("test_txtcode"))  # 圖形驗證碼
suite.addTest(test_pwd.PasswordTest("test_pwd"))         # 密碼
suite.addTest(test_signup.SignUpTest("test_signup"))     # 註冊功能
suite.addTest(test_login.LoginTest("test_loggin"))       # 登錄功能
suite.addTest(test_vipcenter.VipTest("test_vip"))        # 會員中心
suite.addTest(test_search.SearchTest("test_search"))     # 搜索功能

# 運行測試用例
runner = unittest.TextTestRunner()
runner.run(suite)

可以看出需要進行很多的用例導入和添加操作,如果用例成百上千條,那麽這將是一場災難!!!

三、discover()使用實例

還是上面的那些測試用例,這次使用discover()方法批量執行用例,示例代碼如下:

# coding=utf-8
import unittest
from unittest import defaultTestLoader

# 測試用例存放路徑
case_path = ./Testcase/case   

# 獲取所有測試用例
def get_allcase():
    discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py")
    suite = unittest.TestSuite()
    suite.addTest(discover)
    return suite

if __name__ == __main__:
    # 運行測試用例
    runner = unittest.TextTestRunner()
    runner.run(get_allcase())

相比於addTest()方法,discover()方法更方便高效,也可以提高測試反饋速率。

PS:使用discover()方法,切記測試用例中需要執行的測試方法必須以test開頭,否則無法加載!!!

以上就是關於unittest框架的一些常用類和方法的介紹,以及批量執行測試用例的2種方法,僅供參考。。。

python:discover()方法批量執行用例