我們簡單介紹一下有關功能測試的基本方法,這實際上對于所有自動化功能測試產品來說都是一樣的。一般情況下,用QTP來進行功能測試的基本方法主要包括三個主要階段:
1、創建測試或組建
首先可以通過在應用程序或網站上錄制會話,或者建立對象庫并使用關鍵字驅動功能向關鍵字視圖中手動添加步驟來創建測試或組件。在QTP里面我們可以通過兩種方式添加步驟來創建測試或組件:
在應用程序或網站上錄制會話。
建立對象庫并使用這些對象在關鍵字視圖或專家視圖中手動添加步驟
然后在在測試或組件中插入檢查點,檢查頁面、對象或文本字符串中的特定值或特征,通過它可以標識網站或應用程序是否正常運行?;蚴峭ㄟ^用參數替換固定值擴展測試或組件的范圍。提供數據表中的數據,定義環境變量和值,定義測試、組件或操作參數和值,或者使用QTP生成隨機數字或當前用戶和測試數據等。
最后如果需要的話使用QTP中眾多的功能測試功能來增強測試或組件或添加編寫語句來實現更復雜的測試目標。
2、運行測試和組建
控制運行會話,幫助標識和消除測試或組件中的缺陷。使用“單步執行”、“單步跳過”和“單步退出”命令逐步運行測試或組件,或設置斷點使測試或組件在預定點暫停。每當測試或組件在斷點處停止時,可以在“調試查看器”中查看其變量的值。
3、分析結果
在運行測試或組件之后,通過兩種方式可以查看其結果:在“結果”窗口中查看結果;自動報告在運行會話過程中檢測到的缺陷,可能的話并上報到其他缺陷管理產品中。
.試圖與對象模型
在介紹QTP中的Descriptive Programming前,我們有必要先介紹一下ExpertView及在ExpertView里進行編碼的一些基本知識。
在QTP里面提供了兩種視圖,第一種我們把它稱為KeywordView(關鍵字視圖,在早期的版本中稱為TreeView),第二種把它成為ExpertView(專家視圖),這兩種視圖分別是針對兩種類型的人進行使用的。
1、KeywordView(關鍵字視圖)
通過關鍵字視圖,QTP提供了一種模塊化的表格格式創建和查看測試或組件的步驟。每個步驟在關鍵字視圖中都是一行,這樣用戶可以輕松的修改任何一部分組成。
在錄制會話過程中,用戶在應用程序上執行的每個步驟在關鍵字視圖中記錄為一行。例如,在51testing的頁面上執行的下列三個步驟:
在“用戶名”編輯框中輸入zhoda02。
在“密碼”編輯框中輸入加密字符串41c630a213508cd49eb35089db1b893144b9。
單擊“登錄”按鈕。
那么,關鍵字視圖將包含下列行:
很顯然,關鍵字視圖非常直觀有效,使用的人可以很清晰的看到被錄制對象的錄制層次及運行步驟,比較適合那些對于業務操作流程熟悉的人員使用。但是,如果需要一些增強型的操作,那就需要切換到專家視圖里進行了。
2.ExpertView(專家視圖)
QTP在關鍵字視圖中的每個節點在專家視圖中對應一行腳本。上面例子對應的腳本如下:(刪除后一句是因為前后重復,一句可以說明問題)
Browser("51Testing軟件測試網:軟件測試的專業網站").Page("51Testing軟件測試網:軟件測試的專業網站").WebEdit("username").Set "zhoda02"
Browser("51Testing軟件測試網:軟件測試的專業網站").Page("51Testing軟件測試網:軟件測試的專業網站").WebEdit("password").SetSecure "41c630a213508cd49eb35089db1b893144b9"
Browser("51Testing軟件測試網:軟件測試的專業網站").Page("51Testing軟件測試網:軟件測試的專業網站").WebButton("登錄").Click
對于QTP來說,其核心編碼語言是Visual Basic Script,因此,如果用戶熟悉VBScript,可以運用自如的添加和更新語句,并通過編程方式增強測試和腳本,而這一切必須在專家視圖中完成。
更為重要的是,有些操作是必須在專家視圖中才可以完成的,例如:要處理動態對象、客戶化報告、獲取對象運行時的屬性值(Run-time Value)等等,這些都必須通過專家視圖中的VBScript編碼完成。
然而,QTP里所有的操作都是基于對象進行的,所以我們必須對對象模型有一個基本了解,才可以在專家視圖內進行Descriptive Programming。
3、測試對象模型
測試對象模型是一大組對象類型或類,QTP用這些對象類型或類來表示應用程序中的對象。每個測試對象類都有一個可以唯一標識屬于該類的對象的屬性列表,以及一組QTP可以對其進行錄制的方法。它包括測試對象(Test Object)和運行時對象(RunTime Object)。
測試對象是QTP在測試或組件中創建的用于表示應用程序中的實際對象的對象。QTP存儲有關該對象的信息,這些信息有助于它在運行會話期間標識和檢查該對象。
運行時對象是網站或應用程序中的實際對象,在運行會話期間執行針對該對象的方法。
如果錄制時執行應用程序的相應操作,則一般情況下QTP將完成以下操作:
標識QTP測試對象類(表示執行了操作的對象),并創建相應的測試對象
讀取應用程序中對象屬性的當前值,然后將屬性和屬性值列表與測試對象一起存儲。
選擇該對象的唯一名稱,一般使用該對象某個重要屬性的值。
使用適當的QPT 測試對象方法錄制對對象執行的操作。
例如,假定使用以下HTML 源代碼單擊“查找”按鈕:
<INPUT TYPE="submit" NAME="Find" VALUE="Find">
QTPl將單擊的對象標識為WebButton 測試對象。它將創建一個名為Find 的WebButton 對象,然后為該Find WebButton 對象錄制下列屬性和屬性值,同時還會錄制對WebButtion的Click方法。
在關鍵字視圖及專家視圖中顯示內容分別為:
Browser("Mercury Interactive").Page("Mercury Interactive").WebButton("Find").Click
運行測試或組件時,QTP通過其測試對象類及其描述(一組用于唯一標識該對象的測試對象屬性和屬性值)來標識應用程序中的每個對象。測試對象及其屬性和屬性值的列表存儲在對象庫中。例如在上例中,QTP將在運行會話期間在對象庫中搜索WebButton 對象,通過名稱Find 來查找其描述。QTP根據找到的描述,在應用程序中查找WebButton 對象,該對象帶有HTML 標記INPUT、類型為submit、值為Find。找到對象后,它將對其執行Click 方法。
在這樣一組對象模型的基礎上,QTP為各類應用對象都提供了一組方法和屬性,例如Web Objects,Windows Objects,SAPGUI Objects,ActiveX,Java等。下面是一些Web Objects的方法和示例:
對象
方法
Browser
Check
Frame
Click
Image
Exist
Link
GetCellData
Page
GetProperty
WebArea
GetROProperty
WebButtion
Mouseover
WebCheckBox
RowCount
WebEdit
Select
WebList
Set
WebRadioGroup
SetProperty
WebTable
Submit
例1:獲取單元格中的值
thisText = Browser(…).Page(…).Frame.(…).WebTable("sample").GetCellData(2,1)
例2:獲取圖片的名稱
ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")
例3:檢查某個對象是否存在,如果存在彈出對話框說明對象存在。
If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then
MsgBox("The object exists.")
End if
.描述性編程(descriptive programming)
1、descriptive programming概述
通常情況下,當在錄制一個操作時,QTP會將被操作對象加入到對象庫里(Object Repository)。一旦對象存在于對象庫里,我們就可以在專家視圖里通過添加相關的對象方法來對該對象進行操作。我們可以通過引用層次型對象庫里的對象描述(Object Description)來添加相應的方法。
因為QTP對象庫中的每個對象都具有唯一名稱,所以在引用時對象名是必須需要指定的。然后在測試運行期間,QTP在對象庫中根據這個對象的名稱和父對象來查找對象,并使用為這個測試對象存儲的測試對象描述,在網站或應用程序中標識該對象。
例如我們用QTP錄制Yahoo Mail登錄情況時我們需要輸入用戶名,于是在錄制時我們就會錄下一個WebEdit對象,它的缺省邏輯名為“login”,該編輯字段位于名為“Yahoo! Mail - The best” 的頁面上,并且該頁面在瀏覽器中使用名稱Yahoo!進行錄制。如圖所示,即為錄制時的對象庫的內容:
那么如果我們想要應用該對象,就可以在專家視圖輸入以下信息:
Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").Set “xxx”
或者我們也可以調用一些方法,獲取改對象在運行時的對象名,如:
Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").GetROProperty(“name”)
然而,我們可以發覺到,上面的例子在處理對象時,對象已經存在于對象庫里,因此我們可以應用這個對象的邏輯名。實際使用中,情況往往并非如此簡單,我們經常會遇到很多在頁面上動態產生的對象,換而言之,對象庫里沒有這些對象,我們也無從引用。因此我們必須采用其他的技術來完成這類操作,這也就是我們需要講解的Descriptive Programming。
為了滿足上面提到的動態對象的處理問題,QTP允許用戶通過將對象屬性編碼到測試腳本里來動態識別對象,這就是我們通常意義下稱為的Descriptive Programming。通過這種方式,我們可以指示QTP不通過引用對象庫和對象名來對實際對象進行操作。具體操作中,我們只需要為QTP提供對象的一組屬性和值,這樣QTP就可以來識別相應的對象并對其進行操作。這相當于,告訴QTP要識別對象的一些關鍵特征,根據這些特征QTP就可以一一匹配然后識別出來這個對象。
而且,更為重要的是,通過這種Descriptive Programming的方式,還可以讓QTP識別具有某些相同屬性的對象。我們先來舉個例子來看一下:我們假設當前的Windows系統中打開了若干的Yahoo主頁面(多于一個),現在我們要關閉所有的正在瀏覽Yahoo主頁面的瀏覽器。
對于上面那個例子來說,我們先看一個簡單一點的情況,假設只有且僅有一個Yahoo主頁面:那么我們可以用下面的方法來
Window("Text:=Yahoo! - Microsoft Internet Explorer").Close
我們可以看到語句里我們要查找的對象是Window窗口標題為“Yahoo! - Microsoft Internet Explorer”,然后把它關閉,具體的語法說明我們稍后為解釋。但是上面的語句僅僅適合前面提到的條件“只有且僅有一個Yahoo主頁面”,如果有多個同樣的窗口就會出錯,原因是通過語句可以匹配到多個對象,而QTP不知道應該對哪個對象進行關閉動作。我們需要進一步的縮小匹配范圍:
Dim i
i = 0
while (Window("Text:="Yahoo!" - Microsoft Internet Explorer", "index:="&i).exist)
Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).close
i = i +1
wend
這里我們可以看到,對于具有相同屬性的對象,我們可以通過index參數來對其進行區別,第一個對象為index=0,第二個為index=1等等,依次類推。當然我們還可以通過CreationTime和Location參數來定位對象,這里就不詳細敘述了。
通過上面的例子,我們對Descriptive Programming有一個基本了解了,下面我們詳細講解一下Descriptive Programming:在具體實現中,我們有兩種類型的Descriptive Programming方法??梢粤谐鲋苯釉跍y試語句中描述對象的屬性和值的集合;或者向Description 對象中添加屬性和值的集合,然后在語句中輸入Description 對象的名稱。下面我們分別舉例介紹。
2、直接在語句中輸入編程描述
通過多個指定描述對象的property:=value對,可以直接在語句中描述對象,這是最直接有效的方法。
常規語法為:
TestObject("PropertyName1:=PropertyValue1", "..." , "PropertyNameX:="PropertyValueX""}
TestObject - 測試對象的類。
PropertyName:=PropertyValue - 測試對象的屬性及其值。各個property:="value" 對之間應用逗號和引號分開。
例如:以下語句指定Mercury Tours 頁面中名為author且索引值為3 的WebEdit 測試對象。當測試運行時,QTP 將查找具有匹配屬性值的WebEdit 對象,并輸入文本jojo。
Browser("Mercury Tours").Page("Mercury Tours").WebEdit("Name:="Author"", "Index:="3"").Set "Mark Twain"
我們也可以從從描述中的特定位置(從Page 對象描述開始)開始使用Descriptive Programming。
Browser("Mercury Tours").Page("Title:="Mercury" Tours").WebEdit("Name:="Author"", "Index:="3"").Set "jojo"
此外,如果我們希望在在一個測試或組件中多次使用相同的Descriptive Programming,則可以將創建的對象賦值給變量,這樣使用會方便很多。
例如:我們需要完成下面一系列操作
Window("Text:=HyperSna").WinButton("Caption:=日期").Click
Window("Text:=HyperSna").WinButton("Caption:=時間").Click
Window("Text:=HyperSna").WinButton("Caption:=確定").Click
那么,為了方便其見,我們可以將Window("Text:=HyperSna")賦值到一個變量,然后再使用,參見下面的代碼:
Set WinHyper = Window("Text:="HyperSna"")
WinHyper.WinButton("Caption:=日期").Click
WinHyper.WinButton("Caption:=時間").Click
WinHyper.WinButton("Caption:=確定").Click
如果使用了VBScript里面的With語句,還可以簡化為以下代碼:
With Window("Text:="HyperSna"")
.WinButton("Caption:=日期").Click
.WinButton("Caption:=時間").Click
.WinButton("Caption:=確定").Click
End With
下面我們來看一個更為詳細的例子,在QTP產品缺省安裝里面自帶了一個網上訂機票的示例稱為Mercury Tour,我們看一下在訂票過程中何時需要用Descriptive Programming。
首先登入系統后,如果需要訂票,就要先搜索航班,此時系統要求輸入訂票乘客的數量,假設我們在第一次錄制腳本時選擇了1個Passenger,并成功完成訂票。然后,我們需要參數化乘客數量來測試訂票系統,我們會發現回放會失敗。原因在于,不同的乘客的數量導致在訂票時需要輸入每個乘客的姓名,而錄制時,只輸入了一個乘客的姓名。而乘客姓名的輸入框是隨著乘客數量的變化而動態生成的,我們不可能從對象庫里得到沒有錄制的對象,因此必須使用Descriptive Programming。
在錄制單個乘客時,我們得到的錄制語句是:
Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passFirst0").Set "Michael"
Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passLast0").Set "Wang"
顯然WebEdit("passFirst0")和WebEdit("passLast0")是錄制時產生的對象并存放到對象庫里的。通過對象庫,我們可以看到對象的屬性如下
系統對于發生多個FirstName時,命名規則是passFirst0,passFirst1…依次類推。因此只要通過簡單的Descriptive Programming就可以完成動態FirstName與LastName的識別工作。這里我們假設參數化的乘客數已經賦值給intPassNum,下面是腳本中的關鍵語句:
counter = 0
For i = 0 to (intPassNum)
Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:="passFirst""&i).Set "Michael"
Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:="passLast""&i).Set "Wang"
counter = counter + 1
Next
3、使用description對象
使用Description 對象可以返回包含一組Property 對象的Properties 集合對象。Property 對象由屬性名和值組成。然后,可以在語句中指定用返回的Properties 集合代替對象名。(每個property 對象都包含一個屬性名和值)。
要創建Properties 集合,可以使用以下語法輸入Description.Create 語句:
Set MyDescription = Description.Create()
創建Properties 對象(例如,以上示例中的MyDescription)后,就可以輸入語句,以便在運行會話期間在Properties 對象中添加、編輯、刪除或檢索屬性和值。這樣,就可以在運行會話期間,使用動態方法確定哪個屬性以及多少個屬性應包含在對象描述中。
在Properties 集合中填充一組Property 對象(屬性和值)后,可以在測試語句中指定用Properties 對象代替對象名。
例如,假設我們需要完成以下一個操作:
Window("Error").WinButton("text:=OK", "index:="1"").Click
我們可以通過Description對象來實現同樣的功能,參加下面的代碼:
Set MyDescription = Description.Create()
MyDescription("text").Value = "OK"
MyDescription("index").Value = 1
Window("Error").WinButton(MyDescription).Click
Set MyDescription = Nothing
【小結】以上是對QTP中有關處理動態對象中的Descriptive Programming的簡單介紹,希望對大家能夠有所幫助,就總體而言,如果能夠熟練掌握Descriptive Programming,那么有很多實際中的問題就可以迎刃而解。當然Descriptive Programming只是QTP中的一個功能,QTP在實際功能測試中還有很多強大的功能,作為QTP學習的一個系列有機會我會一一介紹。
原文轉自:http://www.anti-gravitydesign.com