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__) 實現。
好了,今天的分享就到這里吧!!!謝謝各位的耐心閱讀。有問題加群交流討論
您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得隨手點波 推薦 不要忘記哦!!!
別忘了點 推薦 留下您來過的痕跡