自動化測試模型可以看作自動化測試框架與工具設(shè)計的思想。自動化測試不僅僅是單純寫腳本運行就可以了,還需要考慮到如何使腳本運行效率提高,代碼復(fù)用、參數(shù)化等問題。自動化測試模型分為四大類:線性模型、模塊化驅(qū)動、數(shù)據(jù)驅(qū)動、關(guān)鍵字驅(qū)動。
-
線性模型
通過錄制或編寫對應(yīng)應(yīng)用程序的操作步驟產(chǎn)生的線性腳本。單純的來模擬用戶完整的操作場景。線性腳本中每個腳本都相互獨立,且不會產(chǎn)生其他依賴與調(diào)用,其實就是簡單模擬用戶某個操作流程都腳本。
優(yōu)點:每個腳本相對獨立,且不產(chǎn)生其他依賴和調(diào)用。
缺點:用例之間存在重復(fù)的操作, 開發(fā)成本高。比如重復(fù)的用戶登錄和退出。維護成本高,由于重復(fù)的操作,當(dāng)重復(fù)的操作發(fā)生改變時,則需要逐一進行腳本的修改。
案例:在帝國軟件主頁自動登錄和退出操作
from selenium import webdriver
from time import sleep
'''
線性模型:
線性腳本中每個腳本都相互獨立,且不會產(chǎn)生其他依賴與調(diào)用,其實就是簡單模擬用戶某個操作流程的腳本。
'''
driver = webdriver.Chrome()
driver.get("http://localhost/")
# 登錄賬號
driver.find_element_by_name('username').clear()
driver.find_element_by_name('username').send_keys('xiaojuan')
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('123456')
driver.find_element_by_name('Submit').click()
sleep(5)
# 退出登錄
driver.find_element_by_link_text('退出').click()
sleep(2)
alert = driver.switch_to.alert
alert.accept()
driver.quit()
-
模塊化驅(qū)動
模塊化驅(qū)動,把重復(fù)的操作代碼封裝為獨立的公共模塊,當(dāng)用例執(zhí)行時需要用到這部分,直接調(diào)用即可。比如登錄系統(tǒng)、退出登錄、截圖函數(shù)等等。
優(yōu)點:減少代碼重復(fù)性,提高代碼的復(fù)用性,可維護性高。
缺點:雖然模塊化的步驟相同,但是測試數(shù)據(jù)不同,仍需要編寫重復(fù)的腳本。比如說重復(fù)的登錄模塊,如果登錄用戶不同,依舊要重復(fù)編寫登錄腳本。
案例:封裝登錄模塊及調(diào)用登錄模塊
from selenium import webdriver
from time import sleep
class Login():
def user_login(self, driver):
# 登錄賬號
driver.find_element_by_name('username').clear()
driver.find_element_by_name('username').send_keys('xiaojuan')
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('123456')
driver.find_element_by_name('Submit').click()
def user_logout(self, driver):
# 退出登錄
driver.find_element_by_link_text('退出').click()
sleep(2)
alert = driver.switch_to.alert
alert.accept()
if __name__ == "__main__":
# 以下腳本,當(dāng)前模塊運行時調(diào)用,當(dāng)其它模塊調(diào)用該模塊時,不運行
driver = webdriver.Chrome()
driver.get("http://localhost/")
driver.implicitly_wait(10)
L = Login()
L.user_login(driver)
L.user_logout(driver)
調(diào)用以上登錄模塊內(nèi)容:
from loginClass import *
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://localhost/")
driver.implicitly_wait(10)
Login().user_login(driver)
Login().user_logout(driver)
driver.quit()
-
數(shù)據(jù)驅(qū)動(參數(shù)化)
數(shù)據(jù)驅(qū)動,數(shù)據(jù)的改變從而驅(qū)動自動化測試的執(zhí)行,最終引起測試結(jié)果的改變。 裝載數(shù)據(jù)的方式可以是列表、字典或是外部文件(txt、csv、xml、excel),目的就是實現(xiàn)數(shù)據(jù)和腳本的分離。
優(yōu)點:通過這種方式,將數(shù)據(jù)和用例分離,可以快速增加相似測試,完成不同數(shù)據(jù)情況下的測試。
案例:參數(shù)化封裝登錄模塊,并實現(xiàn)不同賬戶的登錄測試
from selenium import webdriver
from time import sleep
class Login():
def login(self,driver,username,password):
# 登錄賬號
driver.find_element_by_name('username').clear()
driver.find_element_by_name('username').send_keys(username)
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys(password)
driver.find_element_by_name('Submit').click()
def logout(self,driver):
# 退出登錄
driver.find_element_by_link_text('退出').click()
sleep(2)
alert = driver.switch_to.alert
alert.accept()
if __name__ == "__main__":
driver = webdriver.Chrome()
driver.get("http://localhost/")
driver.implicitly_wait(10)
Login().login(driver, 'xiaojuan1', '123456')
Login().logout(driver)
Login().login(driver, 'xiaojuan', '123456')
Login().logout(driver)
driver.quit()
from loginClassParam import *
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("http://localhost/")
driver.implicitly_wait(10)
Login().login(driver, 'xiaojuan', '123456')
Login().logout(driver)
sleep(3)
Login().login(driver, 'xiaojuan1', '123456')
Login().logout(driver)
sleep(2)
driver.quit()
-
關(guān)鍵字驅(qū)動
通過關(guān)鍵字的改變引起測試結(jié)果的改變叫關(guān)鍵字驅(qū)動測試。 selenium IDE也是一種傳統(tǒng)的關(guān)鍵字驅(qū)動的自動化工具,Robot Framework 是一個功能更強大的關(guān)鍵字驅(qū)動測試框架。
現(xiàn)實中,使用比較方便的是模塊化驅(qū)動與數(shù)據(jù)驅(qū)動相結(jié)合的形式,使用代碼復(fù)用性高,可維護性好,同時也可以實現(xiàn)測試數(shù)據(jù)與用例分離的效果。