qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          QTP自動化測試權威指南 連載(四)

          第九章庫函數文件

            庫函數文件是包含VBScript腳本的純文本格式文件,用來聲明方法,變量,類等。庫函數文件可以用任意后綴名,最常用的是VBS或者TXT。庫函數文件可以用來組織存放不同功能的代碼。它提供了在不同的QTP腳本中分享代碼的方法。下面兩節介紹加載庫函數文件的兩種方法。

            關聯一個全局庫函數文件

            通過這種方式庫函數文件的同一實例可以被當前測試的所有Action共享和訪問。如圖9-1,打開 Test->Settings… ->Resources (標簽頁),添加庫函數文件。

          圖9-1  Test Resource配置

            小提示1:多個庫函數文件加載順序是從下到上。如果有兩個庫函數文件包含相同函數,那么會使用更靠近頂部的。

            小提示2:如果庫函數文件B依賴庫函數文件A中的內容,庫函數文件A應在列表中更靠近底部。

            小提示3:QTP使用全路徑名存放庫函數文件。作為推薦選項,我們可以使用文件相對路徑,如"..\test.vbs"

            運行時動態加載本地庫函數文件

            QTP提供ExecuteFile方法可以在運行時動態加載庫函數文件。使用這種方法時庫函數文件及其內容只能在ExecuteFile執行的那個Action中可見。下面是一些例子:

          '通過絕對路徑加載庫函數文件
          ExecuteFile "C:\Test.vbs"

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

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

            小提示:如果ActionA和ActionB都通過ExecuteFile加載了test.vbs,同時ActionA調用ActionB,要注意他們對于所有test.vbs的變量和方法都只使用自己的副本和單獨實例。

            運行時動態加載全局庫函數文件

            如之前描述,在一個Action中直接使用ExectueFile方法只能使庫函數文件在當前Action可見。但是每個QTP測試腳本可能需要一組全局庫,使得對其中所有的Action都可用。取代直接在Action中使用ExecuteFile來加載庫的方法,我們在某個全局庫中加載庫函數文件,那么它將對所有Action可用。

          'C: \LibLoader.vbs
          Public Function ExecuteFileGlobal (ByValfileName)
          ExecuteFilefileName
          End Function

            我們可以將以上代碼保存在一個VBS文件中并跟測試關聯,使得在任意Action中都能通過調用ExecuteFileGlobal方法來加載文件。這樣加載的文件在所有Action中都可以使用。

          '在全局區域加載文件
          ExecuteFileGlobal "C:\Test.vbs"

            但是當多個Action反復調用ExecuteFileGlobal會使某個庫函數文件加載多次,這樣每次都會破壞當前庫函數文件中的全局變量的狀態。

          這個問題可用使用下面的方法解決。我們給ExecuteFileGlobal方法增加一個加載標記,當它為False時庫函數文件就不會加載。可以通過給所有使用ExecuteFileGlobal方法加載的庫函數文件創建一個全局字典來實現。庫函數文件的路徑用來判斷這個庫是否被加載過。

          'C: \LoadLibrary.vbs
          Dim loadedFiles
          Set loadedFiles = CreateObject("Scripting.Dictionary")
          loadedFiles.CompareMode = vbTextCompare

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

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

            通過一個例子可以更好理解上面代碼。首先我們創建一個要動態加載的庫函數文件。

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

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

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

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

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

            問題 9-1. 如何動態定義全局變量

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

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

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

          Action2:
           '將顯示"TarunLalwani"
           MsgBoxstrText

            理解執行作用域

            理解測試腳本中全局作用域和本地作用域的區別是很重要的。

            ● 全局作用域是QTP加載所有測試資源和場景恢復庫所在。測試腳本中的所有Action都可以訪問

            ● 本地作用域是指所有在Action中定義的作用區域,不可被此Action之外所訪問

           圖9-2描述了包含兩個Action的QTP腳本的作用域視圖,來表述QTP如何工作。

            ● 當腳本啟動時QTP創建全局作用域

            ● QTP首先添加所有場景恢復庫。按照關聯順序從上到下

            ● 場景恢復庫之后,QTP加載所有關聯在 Test->Settings…->Resource (標簽)下的文件。加載的順序是從下到上

            ● 之后QTP根據測試定義的工作流程按順序調用每個Action。針對每個Action,QTP創建一個私有的本地作用域。此作用域在每個Action周期建立和釋放

            ● 在Action1中定義的方法不會被其他Action或者全局作用域訪問到

          圖9-2  QTP運行作用域:本地和全局作用域

            小提示:如果多個全局庫中有同名方法,那么最后一個加載的那個庫中的方法會被調用。

            Option Explicit的適用性

            在庫函數文件頭部的"Option Explicit"聲明允許程序員對所有使用的變量做強制變量聲明。但我們可以看到即便在某些關聯的庫中有"Option Explicit"聲明,對于沒有聲明的變量也沒有拋出錯誤。

            這個出現的原因是源于全局作用域建立的機制。我們需要在所有全局作用域中而不能只在個別全局庫函數文件中使用"Option Explicit"。強制變量聲明"Option Explicit"需要放在所有使用的庫函數文件中,如果有遺漏,QTP就不會在全局域強制使用變量聲明。

            全局作用域內執行本地作用域代碼

            我們之前看過如何在本地作用域加載庫函數文件("運行時動態加載本地庫函數文件")以及如何從本地加載全局作用域庫函數文件("運行時動態加載全局庫函數文件")。

            有時為了維護腳本我們可能需要在Action之前或之后增加代碼。這種維護可能涉及多個數量的腳本。而QTP只允許一次打開一個腳本,所以編輯多個腳本是相當費時的工作。為了避免這種情形我們可以在所有Action中調用兩個特殊的方法,代碼如下:

          '反射任何需要在Action之前執行的代碼為語句并執行
          Execute GetActionStart()

          'Action相關的代碼

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

            GetActionStart和GetActionEnd方法返回空值或者是需要執行的一段代碼。下面是這兩個方法的實現。

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

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

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

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

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

          End Function

           ?。ㄎ赐甏m)

          版權聲明:51Testing軟件測試網及相關內容提供者擁有51testing.com內容的全部版權,未經明確的書面許可,任何人或單位不得對本網站內容復制、轉載或進行鏡像。51testing軟件測試網歡迎與業內同行進行有益的合作和交流,如果有任何有關內容方面的合作事宜,請聯系我們。

          相關鏈接:

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

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

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

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

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 仙桃市| 辽阳市| 铅山县| 罗平县| 桐梓县| 应城市| 巴里| 新丰县| 台中市| 樟树市| 南华县| 香港 | 民和| 罗平县| 咸阳市| 定日县| 泽库县| 霍城县| 伽师县| 昌宁县| 富源县| 奉化市| 汝州市| 平陆县| 合阳县| 广东省| 新沂市| 道孚县| 镇赉县| 江孜县| 长乐市| 双柏县| 石楼县| 贵州省| 沧源| 达拉特旗| 阳江市| 当阳市| 城步| 宁晋县| 全椒县|