1. 程式人生 > >《一頭扎進》系列之Python+Selenium自動化測試框架實戰篇6 - 價值好幾K的框架,呦!這個框架還真牛叉哦!!!

《一頭扎進》系列之Python+Selenium自動化測試框架實戰篇6 - 價值好幾K的框架,呦!這個框架還真牛叉哦!!!

1. 簡介

  本文開始介紹如何通過unittest來管理和執行測試用例,這一篇主要是介紹unittest下addTest()方法來載入測試用例到測試套件中去、用addTest()方法來載入我們測試用例到suite中去和利用discover()方法去載入一個路徑下所有的測試用例。

2. addTest()方法

  這裡首先介紹unittest下addTest()方法來載入測試用例到測試套件中去。為了演示效果,我在前面文章的指令碼基礎上,新建了一個測試指令碼,這個測試指令碼有一個測試用例,加上前面的測試指令碼,一共就是三個測試用例,前面那個測試類裡面包括兩個測試用例。

新建的測試指令碼,test_get_page_title.py程式碼如下:

2.1 程式碼實現:

2.2 參考程式碼:

# -*- coding:utf-8 -*-

# 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行

# 2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2019-12-24
@author: 北京-巨集哥   QQ交流群:705269076
Project: 《《一頭扎進》系列之Python+Selenium框架設計篇5- 價值好幾K的框架,呦!這個框架還真牛叉哦!!!
'''
# 3.匯入模組
import unittest

from automation_framework_demo.framework.browser_engine import BrowserEngine
from automation_framework_demo.pageobjects.baidu_homepage import HomePage


class GetPageTitle(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        browser = BrowserEngine(cls)
        cls.driver = browser.open_browser(cls)

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

    def test_get_title(self):
        homepage = HomePage(self.driver)
        print(homepage.get_page_title())

2.3 執行結果:

執行程式碼後,控制檯列印如下圖的結果

      今天來學習下,如果載入這兩個測試類檔案裡面的3個測試指令碼。在unittest下有一個管理測試套件的叫TestSuit(),我們要使用這個測試套件,需要先初始化一個suite例項,然後這個例項有一個addTest()的方法,可以載入不同類裡面的不同測試函式,格式這樣的 addTest(測試類的類名(‘測試函式名稱,就是test開頭的函式’)),我們在testsuites這個包下新建一個TestRunner.py檔案用來管理我們的用例啟動方式。
來看看這個TestRunner.py的內容

2.4 程式碼實現:

2.5 參考程式碼:

# -*- coding:utf-8 -*-

# 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行

# 2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2019-12-24
@author: 北京-巨集哥   QQ交流群:705269076
Project: 《《一頭扎進》系列之Python+Selenium框架設計篇5- 價值好幾K的框架,呦!這個框架還真牛叉哦!!!
'''
# 3.匯入模組
import unittest
#from automation_framework_demo.testsuits import testsuits
from automation_framework_demo.testsuits.baidu_search2 import BaiduSearch
from automation_framework_demo.testsuits.test_get_page_title import GetPageTitle

suite = unittest.TestSuite()
suite.addTest(BaiduSearch('test_baidu_search'))
suite.addTest(BaiduSearch('test_search2'))
suite.addTest(GetPageTitle('test_get_title'))

if __name__ == '__main__':
    # 執行用例
    runner = unittest.TextTestRunner()
    runner.run(suite)

2.6 執行結果:

執行程式碼後,控制檯列印如下圖的結果

這個方法有沒有侷限性呢?當然有,加入你有幾百個測試類,你是不是也一直這樣手動去新增?有沒有其他更好的方法去載入我們的測試指令碼,關於這個問題,請緊跟巨集哥的腳步繼續往下看、往下走。

3. makeSuite()方法

前面文章介紹瞭如何用addTest()方法來載入我們測試用例到suite中去,本文介紹利用makeSuite()方法,一次性載入一個類檔案下所有測試用例到suite中去。還是利用前面一篇文章中的測試指令碼,來看看TestRunner.py如何寫。

3.1 程式碼實現:

3.2 參考程式碼:

# -*- coding:utf-8 -*-

# 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行

# 2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2019-12-24
@author: 北京-巨集哥   QQ交流群:705269076
Project: 《《一頭扎進》系列之Python+Selenium框架設計篇5- 價值好幾K的框架,呦!這個框架還真牛叉哦!!!
'''
# 3.匯入模組
import unittest
#from automation_framework_demo.testsuits import testsuits
from automation_framework_demo.testsuits.baidu_search2 import BaiduSearch
from automation_framework_demo.testsuits.test_get_page_title import GetPageTitle

'''
suite = unittest.TestSuite()
suite.addTest(BaiduSearch('test_baidu_search'))
suite.addTest(BaiduSearch('test_search2'))
suite.addTest(GetPageTitle('test_get_title'))
'''
suite =unittest.TestSuite(unittest.makeSuite(BaiduSearch))

if __name__ == '__main__':
    # 執行用例
    runner = unittest.TextTestRunner()
    runner.run(suite)

3.3 執行結果:

執行程式碼後,控制檯列印如下圖的結果

缺陷: makeSuite()方法雖然比前面文章的addTest()方法有了一定的效率提升,在新增測試用例到測試套件過程。但是這個方法也有很多缺點,我不可能把所有專案指令碼都放一個測試類檔案吧。在unittest中還是有很多方法可以用來新增測試用例到suite中,makeSuite(類名稱),只是一種,你可以多看看unittest的文件介紹。接下來我們介紹如何一次性載入一個檔案目錄下所有測試用例。

4. discover()方法

  繼續接著介紹,如何利用unittest管理和執行測試用例的問題,這裡我們還是利用之前已經有的三條測試用例,如果你跳過了前面文章,請回到框架設計篇的第八篇和第七篇,裡面有相關測試類的檔案。本文來介紹,如果利用discover()方法去載入一個路徑下所有的測試用例。這個方法是不是太適合我們現在的需求,例如我只需要跑testsuite包下所有測試用例,不管在裡面有多少個包和多少個測試類,只需要用discover()搞定,來看看這個場景下TestRunner.py如何寫。

4.1 程式碼實現:

4.2 參考程式碼:

# -*- coding:utf-8 -*-

# 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行

# 2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2019-12-24
@author: 北京-巨集哥   QQ交流群:705269076
Project: 《《一頭扎進》系列之Python+Selenium框架設計篇5- 價值好幾K的框架,呦!這個框架還真牛叉哦!!!
'''
# 3.匯入模組
import unittest

suite = unittest.TestLoader().discover("testsuits")


if __name__ == '__main__':
    # 執行用例
    runner = unittest.TextTestRunner()
    runner.run(suite)

4.3 執行結果:

執行程式碼後,控制檯列印如下圖的結果

上面的testsuits是可以包名,也可以是一個資料夾名稱,在實際指令碼開發過程中,最後都採用這個方法來批量管理和執行幾百上千的測試用例。下一篇內容,大概會介紹如何利用HTMLTestRunner.py這個開源的外掛,生成測試報告,這個測試報告是一個HTML的格式。介紹完了生成報告文章,框架設計系列教程就會結束,不打算過多介紹其他技能點。

5. 小結

5.1 報錯提示:ImportError: Start directory is not importable: 'D:\\PyCharm-Workspace\\testcases'

以下兩種路徑實現程式碼存放在path.py中,檢視區別:

base_dir = os.path.dirname(os.getcwd())       # 第一種,當前目錄
# os.getcwd() 定位路徑為common
# os.path.dirname(os.getcwd()) 定位路徑為API_work
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))    # 第二種,該程式碼存放的根目錄
# os.path.abspath(__file__) 定位路徑為path.py
# os.path.dirname(os.path.abspath(__file__)) 定位路徑為common
# os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 定位路徑為API_work

 以上兩種方式,在path.py中執行,print輸出均為:

 但第一種方式,在run.py中呼叫path.py中的base_dir屬性,查詢 "test_*.py" 的根目錄就會出現下以報錯:

 原因:

1、在run.py中呼叫path.py 中的 os.getcwd() 程式碼 ,就是定位 run.py 的根目錄;

即:

      os.getcwd()   定位路徑為API_work

      os.path.dirname(os.getcwd())   定位路徑為API_work的上一層目錄,因找不到上一層目錄,所以報錯;

2、在run.py中呼叫第二種方式,是查詢path.py的根目錄,所以可執行正常;

總結:

  其他模組會呼叫固定路徑時,不要使用 os.getcwd() 當前定位方式來實現;使用 os.path.abspath(__file__) 實現。

好了,今天的分享就到這裡吧!!!謝謝各位的耐心閱讀。有問題加群交流討論

 

您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得隨手點波  推薦  不要忘記哦!!!

別忘了點 推薦 留下您來過的痕跡