unittest測試框架詳談及實操(一)

申明:本文是基於python3.x及selenium3.x.html

unittest,也能夠稱爲PyUnit,相似於JUnit,用於python項目中,能夠用來建立全面的測試套件,能夠用於單元自動化測試(模塊)、接口自動化測試(接口)、功能自動化測試(UI)等等。python

官方文檔:https://docs.python.org/3.6/library/unittest.htmlweb

unittest具有建立測試用例、測試套件、測試夾具的能力,包括的組件以下:python3.x

  • Test Fixture(測試夾具):經過使用測試夾具,能夠定義在單個或者多個測試執行以前的準備工做和測試執行後的清理工做。
  • Test Case(測試用例):一個測試用例是在unittest中執行測試的最小單元。它經過unittest提供的assert方法來驗證一組特定的操做或輸入之後獲得的具體響應。unittest提供了一個名爲TestCase的基礎類,能夠用來建立測試用例。
  • Test Suite(測試套件):一個測試套件是多個測試用例的集合,是針對被測程序的對應功能和模塊建立的一組測試,一個測試套件內的測試將一塊兒執行。
  • Test Runner(測試執行器):測試執行器負責測試執行調試而且生成測試結果給用戶。測試執行器可使用圖形界面、文本界面或者特定的返回值來展現測試執行結果。
  • Test Report(測試報告):測試報告用來展現全部執行用例的成功或者失敗狀態的彙總,執行失敗的測試步驟的預期結果與實際結果,還有總體運行情況及運行時間的彙總。注意,unittest自己是沒有相應的內置模塊來生成友好的報告,但咱們能夠借用unittest的擴展庫HTMLTestRunner來實現,須要單獨下載並放到python安裝目錄下。

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

相關文章
相關標籤/搜索