frank
如果在一般自動化測試框架上(連線qc)再考慮下面四個特性,那麼就極大地提高了擴充套件性和重用性,而且可以降低qtp程式設計錯誤。就成為了合適的大型,多平台專案的自動化測試框架。
1. 將一些基礎的函式封裝在dll檔案中,我們以.net為例。
在dll中我們利用了c#語言的特性,編寫很多實用的通用性function。如果需要還可以組織成類。
在qtp呼叫dll的方法或含dll方法的類:
dotnetdllpath = 「c:\dotnet.dll」
set dotinstance = dotnetfactory.createinstance("dotnet.name", dotnetdllpath)
dotinstance.method
可以把相似的function封裝在類中,然後在library 生成這個類的物件例項(newclassname),那麼在qtp中可以直接用這個物件 (例項)及其所有的方法。從而極大地拓展了qtp的功能。
2. 註冊新的方法和重寫qtp方法。因為註冊新的方法比較簡單,步驟及原理和重寫qtp方法一樣,所以下面以重寫qtp方法為例子。
這裡面涉及的最重要的一條語法是:
registeruserfunctoclass,methodname,functionname, setasdefault
e.g. registeruserfunc "webedit", "set", "myset"
「set」 是qtp可以顯示的新的或自帶的方法。
「myset」 是自己寫function 的name。function functionname
大家都應用(settoproperty, getropropery等)時屬性值的名稱是絕對不能出錯的,為了防止出錯,我們可以重寫方法。
以dialog().settoproperty("windowid", win01)為例,我們對每一次dialog的settoproperty的windowid屬性編碼, 就得寫這就話,而且"windowid"拼寫不能錯;而且static,winbutton物件都有這樣的麻煩。
現在我們寫乙個這樣的方法:
function updatewindowid(obj, newvalue)
obj.settoproperty "window id", newvalue
set updatewindowid = obj
end function
registeruserfunc "dialog", "updatewindowid", " updatewindowid"
registeruserfunc "static", "updatewindowid", "updatewindowid"
registeruserfunc "winbutton", "updatewindowid", "updatewindowid"
這樣就徹底解決了這些物件,在每次程式設計settoproperty 的"windowid"屬性時,要找屬性的name是什麼。
其實這樣做是不夠的,你可以很輕鬆settoproperty 的"windowid"屬性時,但是其他的很多屬性呢?比如說」text」。所以我們寫乙個更通用的方法來解決settoproperty的屬性值問題。
通用性的settoproperty方法是:
function update(obj, propertyname, val)
obj.settoproperty propertyname, val
set update = obj
end function
所以上面的updatewindowid不用具體實現,只要呼叫通用性的update方法:
function updatewindowid(obj, newvalue)
set updatewindowid = update(obj, "window id", newvalue )
end function
像set (比如settoproperty) 方法是直接這樣實現的。但是像get(比如gettoproperty)方法就除了呼叫getroproperty外,還要考慮這個方法是否已經被註冊了,如果已經註冊了,呼叫新的註冊方法,否則呼叫gettoproperty方法。
所以通用性的gettoproperty方法是:
function getruntimepropertyoroverride(obj, strproperty, strapipropertyname)
dim qtpname : qtpname = getfullqtpname(obj)
dim func : set func = getref(qtpname & "." & strapipropertyname)
if not isempty(func) then
getruntimepropertyoroverride = func(objsender)
exit function
end if
getruntimepropertyoroverride = getroproperty(obj, strproperty)
end function
function getfullqtpname(obj)
dim fullqtpname: fullqtpname = obj.gettoproperty("class name") & "(""" & _
obj.gettoproperty("testobjname") & """)"
dim objcurrent : set objcurrent = obj
do while not isempty(objcurrent.gettoproperty("parent"))
set objcurrent = objcurrent.gettoproperty("parent")
fullqtpname = objcurrent.gettoproperty("class name") & "(""" & _
objcurrent.gettoproperty("testobjname") & """)" & "." & fullqtpname
loop
getfullqtpname = fullqtpname
end function
3. 關於多瀏覽器的問題比如ie不同版本和firefox。
最好定義乙個類,把所有瀏覽器的型號作為屬性。
class browsertype
public property get ie7
ie7 = "ie7"
end property
public property get ie8
ie8 = "ie8"
end property
public property get ff3
ff3 = "ff3"
end property
end class
再定義乙個類,就是qtp要直接運用的這個類的物件。因為我們設計的是面對多瀏覽器視窗的,所以我們首先生成乙個儲存browser的dictionary(比如key(browsername)-vlaue(browser))。這個類裡面有屬性:browser_pro(broswer的reference)和type(瀏覽器的type)和對外用get和set方法。要實現我們平常瀏覽器切換等功能,下面的方法就很好的實現了:
get currentbrowsername
setcurrentbrowser(strbrowsername)
getbrowser(strbrowsername)
addexistingbrowser(browsername, browserdescription)
addnewbrowser(browsername)
removeandclosebrowser(browsername):
removeandcloseallbrowsers():
4. 自定義result report.這個問題比較好解決。qtp每次執行結果會生成xml的result report。但是顯然不夠大中型專案的需要,好在這個問題在技術上好解決。這個沒有統一的寫法,專案不同report的方式內容也不同,具體**的話,google一下.
可以參考文章:
簡述QTP自動化測試框架
一提到框架,很多新入手的朋友們可能會一頭霧水。最早的我也是如此,經過一段時間的自動化測試 實際使用,我把框架的概念作了乙個簡化的理解。實現qtp 自動化測試框架實際上要由以下幾個部分組成 1 一組錄製好的qtp指令碼 2 乙個可以組織用例的excel文件 3 乙個vbscripts指令碼 這三部分內...
自動化測試QTP知識框架
基於qtp的自動化測試開發 qtp初級 基本資訊 一 軟體自動化測試 1.自動化測試 1.1.軟體自動化測試的故事 1.2.自動化測試的應用案例 1.3.自動化測試中的效益 1.4.自動化測試的風險 2.自動化測試最佳實踐模型 2.1.珍珠模型 pearl 總覽 2.2.purpose 建立自動化測...
自動化測試QTP知識框架
基於qtp的自動化測試開發 qtp初級 基本資訊 一 軟體自動化測試 1.自動化測試 1.1.軟體自動化測試的故事 1.2.自動化測試的應用案例 1.3.自動化測試中的效益 1.4.自動化測試的風險 2.自動化測試最佳實踐模型 2.1.珍珠模型 pearl 總覽 2.2.purpose 建立自動化測...