我所知道的自動化測試模型
這一篇我的偶像Jackei 致敬:
(關(guān)于偶像的問題,發(fā)表一下自己的看法,我覺得每個人都應(yīng)該有“偶像”,偶像是標桿和奮斗目標。關(guān)于有些人拿比爾蓋茨 和 自己當偶像的,要么活在夢里,要么活在自己的世界,我只能 呵呵 了。)
其實,從剛開始做測試就有學(xué)習(xí)自動化(基于UI 的web自動動化測試),理解上一直處于非常皮毛的狀態(tài)。再次的深入學(xué)習(xí)并實踐自動化大概從半年前開始。邊學(xué)習(xí)邊總結(jié)是我的一貫學(xué)習(xí)方式。
《我所知道的軟件測試自動化》- 關(guān)鍵字驅(qū)動的過去和未來
線性測試
通過錄制或編寫腳本,一個腳本完成用戶一套完整的操作,通過對腳本的回放來進行自動化測試。
這是早期進行自動化測試的一種形式。
腳本一
from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://passport.cnblogs.com/login.aspx?ReturnUrl=http://www.cnblogs.com/fnng/admin/EditPosts.aspx") driver.find_element_by_id("tbUserName").send_keys("admin") driver.find_element_by_id("tbPassword").send_keys("123456") driver.find_element_by_id("btnLogin").click() ...... driver.quit () |
腳本二
from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://passport.cnblogs.com/login.aspx?ReturnUrl=http://www.cnblogs.com/fnng/admin/EditPosts.aspx") driver.find_element_by_id("tbUserName").send_keys("user") driver.find_element_by_id("tbPassword").send_keys("456123") driver.find_element_by_id("btnLogin").click() ...... driver.quit () |
通過上面的兩個腳本,我們很明顯的發(fā)現(xiàn)它的問題:
一個用例對應(yīng)一個腳本,假如界面發(fā)生變化,用戶名的屬性發(fā)生改變,不得不需要對每一個腳本進行修改,測試用例形成一種規(guī)模,我們可能將大量的工作用于腳本的維護,從而失去自動化的意義。
這種模式下數(shù)據(jù)和腳本是混在一起的,如果數(shù)據(jù)發(fā)生變也也需要對腳本進行修改。
這種模式下腳本的可重復(fù)使用率很低。
模塊化與庫
我們會清晰的發(fā)現(xiàn)在上面的腳本中,其實有不少內(nèi)容是重復(fù)的;于是就有了下面的形式。
#coding=utf-8 from selenium import webdriver import time #登錄模塊 def login(): driver.find_element_by_id("tbUserName").send_keys("user") driver.find_element_by_id("tbPassword").send_keys("456123") driver.find_element_by_id("btnLogin").click() #退出模塊 def quit(): .............. driver = webdriver.Firefox() driver.get("http://passport.cnblogs.com/login.aspx?ReturnUrl=http://www.cnblogs.com/fnng/admin/EditPosts.aspx") #調(diào)用登錄模塊 login() #其它個性化操作 ...... #調(diào)用退出模塊 |
注意,為了省事我把代碼寫在了一個文件里,真正的實施時需要把模塊放到其它文件進行調(diào)用。還有上面代碼不能完整運行。
通過上面的代碼發(fā)現(xiàn),我們可以把腳本中相同的部分獨立出來,形成模塊或庫;當腳本需要進行調(diào)用。這樣做有兩個好處:
一方面提高了開發(fā)效率,不用重復(fù)的編寫相同的腳本。
另一方面提高了代碼的復(fù)用。
數(shù)據(jù)驅(qū)動
數(shù)據(jù)驅(qū)動應(yīng)該是自動化的一個進步;從它的本意來講,數(shù)據(jù)的改變(更新)驅(qū)動自動化的執(zhí)行,從而引起結(jié)果改變。這顯然是一個非常高級的概念和想法。
其實,我們能做到的是下面的形式。
d:\abc\data.txt
#coding=utf-8 from selenium import webdriver import os,time source = open("D:\\abc\\data.txt", "r") values = source.readlines() source.close() # 執(zhí)行循環(huán) for serch in values: browser = webdriver.Firefox() browser.get("http://www.baidu.com") browser.find_element_by_id("kw").send_keys(serch) browser.find_element_by_id("su").click() browser.quit() |
好吧!不管我們讀取的是txt 文件,還是csv、excel 文件的之類,又或者是數(shù)組、字典函數(shù)。我們實現(xiàn)了數(shù)據(jù)與腳本的分離,換句話說,我們實現(xiàn)了參數(shù)化。我們?nèi)砸磺l數(shù)據(jù),通過腳本的執(zhí)行,可以返回一千條結(jié)果出來。
同樣的腳本執(zhí)行不同的數(shù)據(jù)從而得到了不同的結(jié)構(gòu)。是不是增強的腳本的復(fù)用性呢!
其實,這對開發(fā)來說是完全沒有什么技術(shù)含量的;對于當初QTP 自動化工具來說確是一個買點,因為它面對的大多是不懂開發(fā)的測試。
關(guān)鍵字驅(qū)動
理解了數(shù)據(jù)驅(qū)動,無非是把“數(shù)據(jù)”換成“關(guān)鍵字”,關(guān)鍵字的改變引起測試結(jié)果的改變。
關(guān)鍵字驅(qū)動用編程方式就不太容易表現(xiàn)了。QTP 、 robot framework 等自動化工具就是典型的關(guān)鍵字驅(qū)動(填表格)
好吧!我能說selenium IDE 也是關(guān)鍵字驅(qū)動么?
轉(zhuǎn)化成表格是這樣的:
Selenium IDE 腳本分:命令(command)、對象(command)、值(value)
格式就那里不偏不移,通過這樣的格式去描述不同的對象,從而引起最終結(jié)果的改變。也就是說一切以對象為出發(fā)點。
當然,這樣的腳本,顯然對于不懂代碼的同學(xué)非常直觀!我要找誰(對象)?怎么做(命令)?做什么(值)?
更高級的關(guān)鍵字驅(qū)動,可以自己定義keyword然后“注冊”到框架;從而實現(xiàn)更強大的功能和擴展性。關(guān)鍵字更詳細的理解可以看我偶像的那偏文章。
本文所列出了不同自動化模型,雖然簡單闡述了他們的優(yōu)缺點,但并不主觀的說評判某一模型好壞。其實他們也并非單純后者淘汰前者的關(guān)系,實施自動化更多的是以需求為出發(fā)點,混合的來使用以上模型去解決問題。
posted on 2014-03-11 10:42 順其自然EVO 閱讀(310) 評論(0) 編輯 收藏 所屬分類: selenium and watir webdrivers 自動化測試學(xué)習(xí)