QTP自動化測試權(quán)威指南 連載(四)
第九章庫函數(shù)文件
庫函數(shù)文件是包含VBScript腳本的純文本格式文件,用來聲明方法,變量,類等。庫函數(shù)文件可以用任意后綴名,最常用的是VBS或者TXT。庫函數(shù)文件可以用來組織存放不同功能的代碼。它提供了在不同的QTP腳本中分享代碼的方法。下面兩節(jié)介紹加載庫函數(shù)文件的兩種方法。
關(guān)聯(lián)一個全局庫函數(shù)文件
通過這種方式庫函數(shù)文件的同一實(shí)例可以被當(dāng)前測試的所有Action共享和訪問。如圖9-1,打開 Test->Settings… ->Resources (標(biāo)簽頁),添加庫函數(shù)文件。
圖9-1 Test Resource配置
小提示1:多個庫函數(shù)文件加載順序是從下到上。如果有兩個庫函數(shù)文件包含相同函數(shù),那么會使用更靠近頂部的。
小提示2:如果庫函數(shù)文件B依賴庫函數(shù)文件A中的內(nèi)容,庫函數(shù)文件A應(yīng)在列表中更靠近底部。
小提示3:QTP使用全路徑名存放庫函數(shù)文件。作為推薦選項(xiàng),我們可以使用文件相對路徑,如"..\test.vbs"
運(yùn)行時動態(tài)加載本地庫函數(shù)文件
QTP提供ExecuteFile方法可以在運(yùn)行時動態(tài)加載庫函數(shù)文件。使用這種方法時庫函數(shù)文件及其內(nèi)容只能在ExecuteFile執(zhí)行的那個Action中可見。下面是一些例子:
'通過絕對路徑加載庫函數(shù)文件 '通過相對路徑加載庫函數(shù)文件 '從Quality Center加載庫 |
小提示:如果ActionA和ActionB都通過ExecuteFile加載了test.vbs,同時ActionA調(diào)用ActionB,要注意他們對于所有test.vbs的變量和方法都只使用自己的副本和單獨(dú)實(shí)例。
運(yùn)行時動態(tài)加載全局庫函數(shù)文件
如之前描述,在一個Action中直接使用ExectueFile方法只能使庫函數(shù)文件在當(dāng)前Action可見。但是每個QTP測試腳本可能需要一組全局庫,使得對其中所有的Action都可用。取代直接在Action中使用ExecuteFile來加載庫的方法,我們在某個全局庫中加載庫函數(shù)文件,那么它將對所有Action可用。
'C: \LibLoader.vbs Public Function ExecuteFileGlobal (ByValfileName) ExecuteFilefileName End Function |
我們可以將以上代碼保存在一個VBS文件中并跟測試關(guān)聯(lián),使得在任意Action中都能通過調(diào)用ExecuteFileGlobal方法來加載文件。這樣加載的文件在所有Action中都可以使用。
'在全局區(qū)域加載文件 ExecuteFileGlobal "C:\Test.vbs" |
但是當(dāng)多個Action反復(fù)調(diào)用ExecuteFileGlobal會使某個庫函數(shù)文件加載多次,這樣每次都會破壞當(dāng)前庫函數(shù)文件中的全局變量的狀態(tài)。
這個問題可用使用下面的方法解決。我們給ExecuteFileGlobal方法增加一個加載標(biāo)記,當(dāng)它為False時庫函數(shù)文件就不會加載。可以通過給所有使用ExecuteFileGlobal方法加載的庫函數(shù)文件創(chuàng)建一個全局字典來實(shí)現(xiàn)。庫函數(shù)文件的路徑用來判斷這個庫是否被加載過。
'C: \LoadLibrary.vbs 'ExecuteFileGlobal方法動態(tài)加載文件 '加載庫函數(shù)文件 |
通過一個例子可以更好理解上面代碼。首先我們創(chuàng)建一個要動態(tài)加載的庫函數(shù)文件。
'C:\TestA.vbs Dim X X = 2 |
以下代碼演示ExecuteFileGlobal的使用方法
'在全局區(qū)域加載testa.vbs '在全局區(qū)域加載testa.vbs,如果已經(jīng)加載則忽略 ''在全局區(qū)域重新加載testa.vbs |
問題 9-1. 如何動態(tài)定義全局變量
有時我們需要動態(tài)在兩個或多個Action中共享變量值。使用加載庫函數(shù)文件的相同概念,我們可以在運(yùn)行時創(chuàng)建全局變量。
Declare.vbs Action1: Action2: |
理解執(zhí)行作用域
理解測試腳本中全局作用域和本地作用域的區(qū)別是很重要的。
● 全局作用域是QTP加載所有測試資源和場景恢復(fù)庫所在。測試腳本中的所有Action都可以訪問
● 本地作用域是指所有在Action中定義的作用區(qū)域,不可被此Action之外所訪問
圖9-2描述了包含兩個Action的QTP腳本的作用域視圖,來表述QTP如何工作。
● 當(dāng)腳本啟動時QTP創(chuàng)建全局作用域
● QTP首先添加所有場景恢復(fù)庫。按照關(guān)聯(lián)順序從上到下
● 場景恢復(fù)庫之后,QTP加載所有關(guān)聯(lián)在 Test->Settings…->Resource (標(biāo)簽)下的文件。加載的順序是從下到上
● 之后QTP根據(jù)測試定義的工作流程按順序調(diào)用每個Action。針對每個Action,QTP創(chuàng)建一個私有的本地作用域。此作用域在每個Action周期建立和釋放
● 在Action1中定義的方法不會被其他Action或者全局作用域訪問到
圖9-2 QTP運(yùn)行作用域:本地和全局作用域
小提示:如果多個全局庫中有同名方法,那么最后一個加載的那個庫中的方法會被調(diào)用。
Option Explicit的適用性
在庫函數(shù)文件頭部的"Option Explicit"聲明允許程序員對所有使用的變量做強(qiáng)制變量聲明。但我們可以看到即便在某些關(guān)聯(lián)的庫中有"Option Explicit"聲明,對于沒有聲明的變量也沒有拋出錯誤。
這個出現(xiàn)的原因是源于全局作用域建立的機(jī)制。我們需要在所有全局作用域中而不能只在個別全局庫函數(shù)文件中使用"Option Explicit"。強(qiáng)制變量聲明"Option Explicit"需要放在所有使用的庫函數(shù)文件中,如果有遺漏,QTP就不會在全局域強(qiáng)制使用變量聲明。
全局作用域內(nèi)執(zhí)行本地作用域代碼
我們之前看過如何在本地作用域加載庫函數(shù)文件("運(yùn)行時動態(tài)加載本地庫函數(shù)文件")以及如何從本地加載全局作用域庫函數(shù)文件("運(yùn)行時動態(tài)加載全局庫函數(shù)文件")。
有時為了維護(hù)腳本我們可能需要在Action之前或之后增加代碼。這種維護(hù)可能涉及多個數(shù)量的腳本。而QTP只允許一次打開一個腳本,所以編輯多個腳本是相當(dāng)費(fèi)時的工作。為了避免這種情形我們可以在所有Action中調(diào)用兩個特殊的方法,代碼如下:
'反射任何需要在Action之前執(zhí)行的代碼為語句并執(zhí)行 'Action相關(guān)的代碼 '執(zhí)行任何需要在Action之后執(zhí)行的代碼 |
GetActionStart和GetActionEnd方法返回空值或者是需要執(zhí)行的一段代碼。下面是這兩個方法的實(shí)現(xiàn)。
'每個Action之前調(diào)用的方法 '獲取需要調(diào)用這個方法的Action名字 '每個Action最后調(diào)用的方法 ''獲取需要調(diào)用這個方法的Action名 ''獲取需要調(diào)用這個方法的Action名 End Function |
(未完待續(xù))
版權(quán)聲明:51Testing軟件測試網(wǎng)及相關(guān)內(nèi)容提供者擁有51testing.com內(nèi)容的全部版權(quán),未經(jīng)明確的書面許可,任何人或單位不得對本網(wǎng)站內(nèi)容復(fù)制、轉(zhuǎn)載或進(jìn)行鏡像。51testing軟件測試網(wǎng)歡迎與業(yè)內(nèi)同行進(jìn)行有益的合作和交流,如果有任何有關(guān)內(nèi)容方面的合作事宜,請聯(lián)系我們。
相關(guān)鏈接:
posted on 2013-06-19 10:55 順其自然EVO 閱讀(501) 評論(0) 編輯 收藏 所屬分類: qtp