初始python單元測試框架unittest與webdriver的關係(一)

unittest是屬於python的單元測試框架,和java的junit,c#的nunit雷同,unittest的詳細說明,具體見官方的地址:https://docs.python.org/2/library/unittest.html。unittest單元測試給我們提供了創建測試用例,測試套件,以及測試固件。unittest在安裝pyhton以後,直接自帶了,可以直接使用。作爲單元測試,是對程序最小模塊的一種敏捷化的測試,更多的是開發作爲對自己代碼質量的一種考覈,測試驅動的方法中,測試先行,開發接着來。在自動化測試中,我們雖然沒有按照這樣的模式來,但是有一個基本的事實的,當我們把selenium2的API全部學習完後,但是作爲自動化測試來說,我們不可能把N個測試點,寫在一個python的文件裏面,即使一個簡單的文本輸入框,我們要測試它的邊界值,敏感字符等,如果寫在一個文件中,執行失敗後,我們得仔細的查看到底是邊界值出問題了還是其他出問題了,導致該部分執行失敗,顯然,這樣的自動化,不是我們想要的,也會給成本增加很多的,也無法達到自動化的要求,更加無法處理幾百幾千個測試用例的批量執行。那麼,就讓我們來了解神祕的unittest,unittest的關係圖具體見如下截圖的層級關係:

Test Case

測試用例是單元測試中最小的單位,它的任務就是檢查對於具體的功能是否和期望的功能一直,這期間會使用到assert等斷言,對於一個單獨的case來說,它具有穩定性,獨立性,可持續性,以及期望結果等特點。

Test Suite

測試套件,顧名思義,就是測試容器,通俗的說就是一個或者多個測試用例的集合,一般我們會用到addTest(),makeSuite()等方法。

Test Runner

Test Runner是指執行測試套件中的測試用例,並且呈現給用戶結果,一般會使用到run(),TextTestRunner()的方法。

Test Report

對自動化測試來說,測試報告是必須的,依據自動化的測試報告,我們可以詳細的瞭解到通過或失敗的測試用例,預期與結果的結果狀態,在python的自動化測試中,一般通過HTMLTestRunner.py來實現的,HTMLTestRunner.py具體下面還會再詳細介紹。

當然,如上的問題,就讓selenium IDE給我們揭開謎底,我們層層剝開,進入TDD的測試模式。Seleniumide只可以安裝在firefox中,看成firefox的一個插件安裝進去,下載地址是selenium的官方地址(http://docs.seleniumhq.org/projects/ide/plugins.jsp),下載文件後,直接拖動到firefox的瀏覽器,點擊選擇全部安裝,安裝成功後,會提示重新啓動瀏覽器,重新啓動firefox的瀏覽器後,在工具欄,就可以看到seleniumide,點擊seleniumide,顯示出seleniumide的程序部分,見截圖:

就已selenium ide錄製百度搜索,來引入單元測試,打開百度,在搜索輸入框中輸入框webdriver,點擊百度一下安裝,見錄製的截圖:

點擊selenium ide的文件下拉框,點擊Export Test Case As,點擊Python 2/unittest/webdriver,見截圖:

保存文件爲demo.py文件,打開demo.py文件,可以看到如下的代碼:

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

from selenium import webdriver

from selenium.webdriver.common.byimport By

fromselenium.webdriver.common.keys import Keys

fromselenium.webdriver.support.ui import Select

from selenium.common.exceptionsimport NoSuchElementException

from selenium.common.exceptionsimport NoAlertPresentException

import unittest, time, re

class Demo(unittest.TestCase):

def setUp(self):

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url ="https://www.baidu.com/"

self.verificationErrors = []

self.accept_next_alert = True

def test_demo(self):

driver = self.driver

driver.get(self.base_url +"/")

driver.find_element_by_id("kw").click()

driver.find_element_by_id("kw").clear()

driver.find_element_by_id("kw").send_keys("webdriver")

driver.find_element_by_id("su").click()

def is_element_present(self, how, what):

try: self.driver.find_element(by=how,value=what)

except NoSuchElementException, e:return False

return True

def is_alert_present(self):

try: self.driver.switch_to_alert()

except NoAlertPresentException, e:return False

return True

def close_alert_and_get_its_text(self):

try:

alert = self.driver.switch_to_alert()

alert_text = alert.text

if self.accept_next_alert:

alert.accept()

else:

alert.dismiss()

return alert_text

finally: self.accept_next_alert = True

def tearDown(self):

self.driver.quit()

self.assertEqual([],self.verificationErrors)

if __name__ =="__main__":

unittest.main()

如上的代碼,就是一個完整的自動化的case,下面分別解釋下代碼部分:

def setUp(self):

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url ="https://www.baidu.com/"

self.verificationErrors = []

self.accept_next_alert = True

def tearDown(self):

self.driver.quit()

self.assertEqual([],self.verificationErrors)

如上代碼部分爲unittest的測試固件,分別爲setUp和tearDown(),在 setUp部分中,打開url,也就是測試地址https://www.baidu.comtearDown()部分是結束測試,重點說明,setup 和tearDown()部分,有多少個自動化的case,就執行多少次。

def test_demo(self):

driver = self.driver

driver.get(self.base_url +"/")

driver.find_element_by_id("kw").click()

driver.find_element_by_id("kw").clear()

driver.find_element_by_id("kw").send_keys("webdriver")

driver.find_element_by_id("su").click()

如上代碼爲測試點部分,該測試點爲在百度搜索輸入框輸入webdriver,然後點擊百度一下,重點說明,在python的unittest的單元測試中,開頭必須是test,否則unittest會不識別的。

那麼精簡後的自動化測試腳本爲:

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

from selenium import webdriver

from selenium.webdriver.common.byimport By

fromselenium.webdriver.common.keys import Keys

fromselenium.webdriver.support.ui import Select

from selenium.common.exceptionsimport NoSuchElementException

from selenium.common.exceptionsimport NoAlertPresentException

import unittest, time, re

class Demo(unittest.TestCase):

def setUp(self):

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url =https://www.baidu.com/

def test_demo(self):

driver = self.driver

driver.get(self.base_url +"/")

driver.find_element_by_id("kw").click()

driver.find_element_by_id("kw").clear()

driver.find_element_by_id("kw").send_keys("webdriver")

driver.find_element_by_id("su").click()

def tearDown(self):

self.driver.quit()

if __name__ =="__main__":

unittest.main()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章