1. 程式人生 > >python的unittest框架如何按自己編好的順序批量執行的解決方案

python的unittest框架如何按自己編好的順序批量執行的解決方案

利用python的unittest框架批量執行case的載入方式有2種:  1.通過unittest.main()來啟動所需測試的測試模組;
  2.新增到testsuite集合中再載入所有的被測試物件,而testsuit裡存放的就是所需測試的用例;方案大概為以下4種:1、通過unittest.main()來執行測試用例的方式:
if __name__ == "__main__":
     unittest.main()
2、通過testsuit來執行測試用例的方式:
if __name__ == "__main__":
     # 構造測試集
     suite = unittest.TestSuite()
     suite.addTest(TestCase("testCreateFolder"))
     suite.addTest(TestCase("testDeleteFolder")) 
     # 執行測試
     runner = unittest.TextTestRunner()
     runner.run(suite)
3、通過testLoader 逐一新增測試指令碼:
if __name__ == "__main__":
     #此用法可以同時測試多個類
     suite1 = unittest.TestLoader().loadTestsFromTestCase(TestCase1) 
     suite2 = unittest.TestLoader().loadTestsFromTestCase(TestCase2) 
     suite = unittest.TestSuite([suite1, suite2]) 
     unittest.TextTestRunner(verbosity=2).run(suite)
4、通過TestLoader 類中提供的discover():
import unittest

case_path="./test_case/"
suite=unittest.defaultTestLoader.discover(case_path,pattern="test_*.py")
if __name__=='__main__':
    runner=unittest.TextTestRunner()
    runner.run(suite)
然後我們已知unittest預設載入指令碼的順序是:根據ASCII碼的順序載入,數字與字母的順序為:0-9,A-Z,a-z。所以以A開頭的測試用例方法會優先執行,以a開頭會後執行。很多情況下,我們的指令碼會放在不同的路徑下,如圖:【指令碼分了很多層級,每一級都有case和下一級目錄】
如果我們單個載入case,那麼我們首先要做的,是需要在一個run檔案的開頭,import所有包含case的.py檔案指令碼邏輯及框架設計痛點:在case比較多且目錄多時,import比較費時費力。而如果使用discover()的方式,則指令碼新增的順序很可能不是我們理想的(通常情況下,我們的指令碼之間有依賴關係,這就牽涉到如何寫指令碼邏輯的問題,此不多做討論),一種方案如果在指令碼檔案中提前按case名稱編寫,如test_1, test_2, test_3,這無疑也是痛苦的,一旦我們需要新增和刪除一個指令碼時,維護case名稱會費時費力。基於這些設計痛點,本人設計了一套解決方案,可以讓指令碼按照資料驅動的原理,順序新增case名稱載入到測試套件中,達到理想化的順序執行問題。設計思路如下:一,動態匯入test_case目錄及其所有子目錄下的所有以test_開頭的.py檔案(測試指令碼檔案也需要這樣維護),程式碼:二,把需要執行的case檔案的類以及其需要執行的case維護在excel中(也可以維護在其它型別檔案中,怎麼維護就怎麼解析,目的是排序),附excel資料及解析方式:說明:excel中標記為ready的才會新增到caseList中,這樣不需要執行的case只需要改變isReady的值即可,返回值是一個按excel順序排列並按格式 fileName.ClassName("caseName")儲存的字串List, 因為addTest方法就是按這個格式去匹配的三,前面兩步完成以後,只需要把caseList中的每一項[字串]變成可以被程式識別的類,然後順序的新增到測試套件中,即可完成測試套件的組裝,這裡需要用到了一個【eval】方法(不懂自行百度),附執行邏輯如下:四,把步驟三返回的suite執行一個run方法即可,開頭有介紹,不再另附程式碼結論:如此,完美的解決了指令碼的執行順序問題,應用到自己的框架中,也會起到很好的效果。我想這也是開源自動化繞不開的難題,開發語言設計就是要先匯入後識別,此方案的核心也是解決動態匯入的問題