記得剛剛接觸QTP時(shí),我花了一些時(shí)間想找到QTP執(zhí)行一個(gè)testcase的入口點(diǎn)在哪里,各種文件是如何組織的?這個(gè)順序沒有搞清楚,心理總不踏實(shí)??偛荒芫拖±锖康匿浿葡?,接著稀里糊涂的回放,然后就稱作QTP回歸測(cè)試?當(dāng)然不是!

記得在Java中,搞清楚一個(gè)類的創(chuàng)建過程,了解對(duì)類中各種資源執(zhí)行的時(shí)間順序非常重要。比如,Java解釋器碰到創(chuàng)建一個(gè)類對(duì)象的語(yǔ)句(類似于Class A =New ClassA()),或者調(diào)用一個(gè)類中靜態(tài)方法(類似于a = ClassA.getA() )解釋器首先查找到該類,然后裝載;對(duì)載入的類,首先執(zhí)行靜態(tài)變量和方法的初始化動(dòng)作;然后初始化其他非靜態(tài)變量和方法;最后執(zhí)行構(gòu)造函數(shù)。那么對(duì)于QTP,執(zhí)行一個(gè)testcase時(shí),各種資源文件又是按照何種順序執(zhí)行的呢?

首先,我們歸結(jié)一下一般情況下,一個(gè)QTP testcase包括哪些資源文件:1)一個(gè)或者多個(gè)action(我們大部分的測(cè)試腳本都寫在action中);2)一個(gè)或者多個(gè)連接的外部VB Script文件庫(kù);3)如果不是采用默認(rèn)的環(huán)境變量,還可以連接一個(gè)外部的XML文件作為保存環(huán)境變量的文件;4)Recovery scenario中可能調(diào)用錯(cuò)誤處理的函數(shù),而這些函數(shù)可以保存在外部的一個(gè)VB Script文件中;5)如果采用Object Repository,則有一個(gè)或者多個(gè)對(duì)象庫(kù)文件;6)其他各種跟運(yùn)行testcase相關(guān)的設(shè)置。

這些眾多的文件,在打開一個(gè)testcase并執(zhí)行時(shí),是如何執(zhí)行的呢?經(jīng)過試驗(yàn),我么發(fā)現(xiàn),總體來說是先testcase后test action。就是說,QTP先執(zhí)行testcase的設(shè)置和文件,再執(zhí)行屬于action的設(shè)置和文件。以上6種資源,2,3,4,6是跟testcase相關(guān)的,是先被讀取執(zhí)行的;而1,5是和action相關(guān)的,后執(zhí)行。其次,在2,3,4,6中,順序是這樣排列的:打開一個(gè)testcase,先讀取影響該testcase運(yùn)行的總體設(shè)置參數(shù)6,接著讀取2,3,4(其具體順序依賴腳本中的先后順序);在1和5中,自然先檢查5,看該action對(duì)應(yīng)的對(duì)象庫(kù)是否存在,接著,才執(zhí)行第一個(gè)action。至于后面的其他action,很容易,按照測(cè)試腳本中action的順序執(zhí)行。

理解這個(gè)順序,對(duì)于理解整個(gè)測(cè)試的執(zhí)行非常重要,甚至對(duì)在編寫代碼時(shí)產(chǎn)生的“莫名其妙”的錯(cuò)誤也很有幫助。比如:若在2)中定義個(gè)public 變量,在4)中也定義了整個(gè)變量,代碼編寫時(shí)沒有任何問題,但是在運(yùn)行test時(shí),會(huì)產(chǎn)生重復(fù)定義的錯(cuò)誤!我曾經(jīng)遇到一個(gè)問題:就是將4)中的錯(cuò)誤處理函數(shù)也寫在2)中,結(jié)果運(yùn)行時(shí)老報(bào)告重復(fù)定義的錯(cuò)誤!而事實(shí)上,在2)定義的函數(shù)庫(kù)文件中,我并沒有重復(fù)定義任何public變量!后來發(fā)現(xiàn),QTP對(duì)于2)和4)的文件,是重復(fù)載入的,也就是說,對(duì)于2)QTP讀取一次;對(duì)于4)QTP重新讀取一次,所以,若在2)中定義了一個(gè)函數(shù)外的變量,在讀取4)時(shí)會(huì)報(bào)告重復(fù)定義了。處理的方法就是將4)的函數(shù)放在另外一個(gè)文件中。

接下來我?guī)Т蠹易鲆粋€(gè)qtp設(shè)計(jì)測(cè)試用例腳本實(shí)例:
Set  Browser_name=Description.Create()
Browser_name("name").value="歡迎訪問華為用戶管理網(wǎng)站"
'實(shí)例化一個(gè)對(duì)象

Set  Page_name=Description.Create()
Page_name("title").value="歡迎訪問華為用戶管理網(wǎng)站"

'SystemUtil.Run "C:Program FilesInternet Exploreriexplore.exe"
'Browser("name:=hao123--我的上網(wǎng)主頁(yè)").Navigate "https://uniportal.huawei.com/uniportal"

 '打開IE,并賦值地址

For   i=1  to  DataTable.GetSheet("Action1").GetRowCount    '循環(huán)取出datatable中sheet中的行總數(shù)
' msgbox   DataTable.GetSheet("Action1").GetRowCount  ‘打印出調(diào)試信息
Browser( Browser_name).Page(Page_name).WebEdit("name:=uid").Set  DataTable("用戶名",dtLocalSheet)   '從datatable中取數(shù)據(jù)
Browser(Browser_name).Page(Page_name).WebEdit("name:=password").Set  DataTable("密碼",dtLocalSheet)
Browser(Browser_name).Page(Page_name).WebEdit("name:=verifyCode").Set "1"
Browser(Browser_name).Page(Page_name).WebButton("name:=登錄" ).Click

datatable.Value("運(yùn)行結(jié)果",dtLocalSheet)=Browser(Browser_name).Page(Page_name).WebTable("name:=uid").WebElement("html tag:=B").GetROProperty("outertext")  '將運(yùn)行時(shí)的文本檢查點(diǎn)賦值到datatable中指定的列中

y_status= DataTable("結(jié)果",dtLocalSheet)  '設(shè)置變量存放預(yù)期結(jié)果
r_status= DataTable("運(yùn)行結(jié)果",dtLocalSheet)   '設(shè)置變量存放運(yùn)行結(jié)果

'msgbox  r_status
'
'msgbox  y_status

 
 If    r_status = y_status Then

   
   Reporter.ReportEvent  micPass, "login", "系統(tǒng)登錄成功!+預(yù)期值為:" &y_status+"實(shí)際值為:"&r_status
   else

   Reporter.ReportEvent  micfail, "login", "系統(tǒng)登錄成功!+預(yù)期值為:" &y_status+"實(shí)際值為:"&r_status

end  if 

DataTable.SetNextRow
'將從datatable下一行取值

'Browser(Browser_name).Page(Page_name).Frame("name:=topFrame").Image("name:=登錄").FireEvent "name:=onmouseover"
'Browser(Browser_name).Page(Page_name).Frame("name:=topFrame").Image("name:=登錄").Click
'Browser(Browser_name).Dialog("text:=Microsoft Internet Explorer").WinButton("text:=確定").Click

Next

datatable中的數(shù)據(jù)

用戶名 密碼  結(jié)果    運(yùn)行結(jié)果      

6666 1 登錄錯(cuò)誤:校驗(yàn)碼錯(cuò)誤,請(qǐng)重新輸入校驗(yàn)碼! 
6666 2 登錄錯(cuò)誤:用戶名或密碼無(wú)效