qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          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ù)文件
          ExecuteFile "C:\Test.vbs"

          '通過相對路徑加載庫函數(shù)文件
          currentTestDir = Environment("TestDir")
          vbsFilePath = currentTestDir& "\..\..\CommonLibs\Test.vbs"
          ExecuteFilevbsFilePath

          '從Quality Center加載庫
          ExecuteFile "[QC-ATTACH];;Subject\CommonLibs;;\Test.vbs"

            小提示:如果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
          Dim loadedFiles
          Set loadedFiles = CreateObject("Scripting.Dictionary")
          loadedFiles.CompareMode = vbTextCompare

          'ExecuteFileGlobal方法動態(tài)加載文件
          'Inputs - strFile: 需加載的完整文件名
          '       reload: 是否重新加載已載入的文件
          Public Function ExecuteFileGlobal (ByValstrFile,ByValreLoad)
           '判斷reload為 False ,之后檢查文件是否加載過
           If reload = False and loadedFiles.Exists (strFile) then
            ExecuteFileGlobal = False
            Exit Function
           End if

            '加載庫函數(shù)文件
          ExecuteFilestrFile
            '將文件加入字典列表
          loadedFiles (strFile) = True
          ExecuteFileGlobal = True
          End Function

            通過一個例子可以更好理解上面代碼。首先我們創(chuàng)建一個要動態(tài)加載的庫函數(shù)文件。

          'C:\TestA.vbs
          Dim X 
          X = 2

            以下代碼演示ExecuteFileGlobal的使用方法

          '在全局區(qū)域加載testa.vbs
          ExecuteFileGlobal "C:\testa.vbs", False
          Msgbox X  '顯示 2
          X = X + 2

          '在全局區(qū)域加載testa.vbs,如果已經(jīng)加載則忽略
          ExecuteFileGlobal "C:\testa.vbs", False
          Msgbox X  '顯示4

          ''在全局區(qū)域重新加載testa.vbs
          ExecuteFileGlobal "C:\testa.vbs", True
          Msgbox X  '顯示 2

            問題 9-1. 如何動態(tài)定義全局變量

            有時我們需要動態(tài)在兩個或多個Action中共享變量值。使用加載庫函數(shù)文件的相同概念,我們可以在運(yùn)行時創(chuàng)建全局變量。

          Declare.vbs
           'C: \Declare.vbs
           Sub ExecuteGlobalCode (sStatement)
            ExecuteGlobalsStatement
           End Sub

          Action1:
           '在全局范圍執(zhí)行代碼
           ExecuteGlobalCode "Dim strText"
           strText = "TarunLalwani"

          Action2:
           '將顯示"TarunLalwani"
           MsgBoxstrText

            理解執(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í)行
          Execute GetActionStart()

          'Action相關(guān)的代碼

          '執(zhí)行任何需要在Action之后執(zhí)行的代碼
          Execute GetActionEnd()

            GetActionStart和GetActionEnd方法返回空值或者是需要執(zhí)行的一段代碼。下面是這兩個方法的實(shí)現(xiàn)。

          '每個Action之前調(diào)用的方法
          '這個方法允許在Action的本地作用域動態(tài)執(zhí)行代碼,需要按以下格式在Action開始時調(diào)用
          '執(zhí)行GetActionStart()
          Function GetActionStart()
           '缺省沒有執(zhí)行代碼
          GetActionStart = ""

           '獲取需要調(diào)用這個方法的Action名字
          sAction = LCase(Environment("ActionName"))
            If InStr(sAction,"main") Then
          GetActionStart = "ExecuteFilePathFinder.Locate(""Workaround.vbs"")"
            End If
          End Function

          '每個Action最后調(diào)用的方法
          '這個方法允許在Action的本地作用域動態(tài)執(zhí)行代碼,需要按以下格式在Action結(jié)束時調(diào)用
          '執(zhí)行GetActionEnd()
          Function GetActionEnd()
           '缺省沒有執(zhí)行代碼
          GetActionEnd = ""

          ''獲取需要調(diào)用這個方法的Action名
          sAction = Environment("ActionName")

           ''獲取需要調(diào)用這個方法的Action名
          sAction = LCase(Environment("ActionName"))
          。。。
            If InStr(sAction,"main") Then
          GetActionEnd = "ExecuteFilePathFinder.Locate(""Workaround.vbs"")"
            End If
          。。。

          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)鏈接:

          QTP自動化測試權(quán)威指南 連載(一)

          QTP自動化測試權(quán)威指南 連載(二)

          QTP自動化測試權(quán)威指南 連載(三)

          posted on 2013-06-19 10:55 順其自然EVO 閱讀(501) 評論(0)  編輯  收藏 所屬分類: qtp

          <2013年6月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 酒泉市| 兰西县| 牙克石市| 平乐县| 桐柏县| 开化县| 武乡县| 定远县| 甘肃省| 张家口市| 京山县| 澄迈县| 玛沁县| 高雄市| 徐汇区| 霍林郭勒市| 红安县| 三门峡市| 西华县| 岳西县| 军事| 楚雄市| 栾川县| 武邑县| 新宾| 恩施市| 拜泉县| 南皮县| 北碚区| 白城市| 璧山县| 崇礼县| 阳信县| 普兰县| 河东区| 兖州市| 五华县| 黔江区| 河池市| 靖边县| 渭南市|