申明:本文是基於python3.x及selenium3.x.html
unittest,也能夠稱爲PyUnit,相似於JUnit,用於python項目中,能夠用來建立全面的測試套件,能夠用於單元自動化測試(模塊)、接口自動化測試(接口)、功能自動化測試(UI)等等。python
官方文檔:https://docs.python.org/3.6/library/unittest.htmlweb
unittest具有建立測試用例、測試套件、測試夾具的能力,包括的組件以下:python3.x
TestCase類瀏覽器
咱們能夠經過繼承TestCase類而且在測試類爲每個測試添加測試方法來建立單個測試或者一組測試。每一個測試最重要的任務是調用assert方法來比對結果,如調用assEqual()來檢驗結果,調用assertTrue()來驗證條件,或者調用assertRises()來驗證預期的異常。session
除了添加測試,咱們還要添加測試夾具——setUp()方法和tearDown()方法,用來建立或處置測試用用例所需的任何對象和條件。測試
下面就邊實操邊說明:ui
首先,咱們須要先引入unittest模塊,而後定義一個繼承於TestCase類的子類,以下所示:spa
import unittest from selenium import webdriver class BaiduSearchTest(unittest.TestCase):
setUp()方法命令行
一個測試用例是從setUp()方法開始執行的,用這個方法在每一個測試執行前去執行一些初始化的任務。好比建立瀏覽器實例,訪問URL,加載測試數據和打開日誌文件等。此方法沒有參數,不返回任何值。當定義一個setUp()方法,測試執行器在每次執行測試方法以前優先執行該方法。在下面的例子裏,我將用setUp()方法來建立Chrome實例,並在測試開始執行以前訪問到被測程序的主頁。代碼以下:
import unittest from selenium import webdriver class BaiduSearchTest(unittest.TestCase): def setUp(self): #create a new Chrome session self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.driver.maximize_window() self.driver.get('https://www.baidu.com')
編寫用例
有了setUp()方法,如今能夠寫一些測試用例來驗證被測程序的功能。與setUp()方法類似,test方法也是在TestCase類中實現。重點是測試方法的命名必須以test開頭,這種命名約定也通知test runner哪一個方法表明測試方法。對於test runner能找到的每一個測試方法,都會在執行測試方法以前先執行setUp()方法。這樣作有助於確保每一個測試方法可以依賴相同的環境,不管類中有多少測試方法。下面將添加一個新測試方法test_search_python(),並使用簡單的assertEqual()方法來驗證搜索術語返回的結果和預期結果相匹配。代碼以下:
import unittest from selenium import webdriver from time import sleep class BaiduSearchTest(unittest.TestCase): def setUp(self): #create a new Chrome session self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.driver.maximize_window() self.driver.get('https://www.baidu.com') def test_search_python(self): #get the search textbox search_textbox = self.driver.find_element_by_id('kw') search_textbox.clear() #enter search keyword search_textbox.send_keys("python") #get the and seacrh button and click search_button = self.driver.find_element_by_id('su') search_button.click() #add assert sleep(2) tag = self.driver.find_element_by_link_text("PyPI").text self.assertEqual('PyPI',tag)
tearDown()方法
相似於setUp()方法在每一個測試方法以前被調用,TestCase類也會在測試執行完成後調用tearDown()方法來清理全部的初始化值。一旦測試被執行,在setUp()中定義的值將再也不須要,因此最好的在完成的時候清理掉。在個人例子中,在測試執行完成後,就再也不須要Chrome的實例。我將在tearDown()方法中關閉瀏覽器,代碼接上面的以下:
... def tearDown(self): #close the browser window self.driver.quit()
運行測試
爲了經過命令行運行測試,咱們能夠在測試用例中添加調用簡單的unittest.main()方法,並將傳遞verbosity參數以便在控制檯顯示詳細的測試狀況。代碼接上面的以下:
... if __name__ == '__main__': unittest.main(verbosity=2)
而後將整個測試代碼保存爲python腳本,在這個例子裏,保存爲baidusearch.py。在腳本存放路徑下用命令行窗口經過下面的命令在執行該測試。在測試運行結束後,unittest會把測試結果顯示在控制檯,以下所示:
除了測試結果概要外,當一個測試用例執行失敗,針對每一個失敗也會經過文本信息展現具體哪裏有錯誤。以下所示:
上圖展現了具體哪一個測試方法執行失敗,經過打印信息能夠定位具體致使失敗的代碼。另外,失敗自身也會以AssertionError形式顯示,上面例子爲預期結果與實際結果不匹配。
添加其餘測試
下面將爲測試類添加其它的測試。規則很簡單,新的測試方法命名也要以test開頭,代碼以下:
... def test_search_selenium(self): search_textbox = self.driver.find_element_by_id('kw') search_textbox.clear() search_textbox.send_keys("python") search_button = self.driver.find_element_by_id('su') search_button.click() sleep(2) tag = self.driver.find_element_by_link_text("Selenium Remote Control").text self.assertIn('Selenium',tag)
運行整個測試類將看到兩個Chrome的實例將打開和關閉,這正是setUp()方法和tearDown()方法針對每一個測試方法都要執行產生的結果,以下圖所示:
更多基於python的unittest信息能夠參考:https://docs.python.org/3.6/library/unittest.html