这个问题可用使用下面的方法解决。我们给 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 |
理解执行作用域
理解测试脚本中全局作用域和本地作用域的区别是很重要的。
1)全局作用域是QTP加载所有测试资源和场景恢复库所在。测试脚本中的所有Action都可以访问
2)本地作用域是指所有在Action中定义的作用区域,不可被此Action之外所访问
图9-2描述了包含两个Action的QTP脚本的作用域视图,来表述QTP如何工作。
1)当脚本启动时QTP创建全局作用域
2)QTP首先添加所有场景恢复库。按照关联顺序从上到下
3)场景恢复库之后,QTP加载所有关联在 Test->Settings…->Resource (标签)下的文件。加载的顺序是从下到上
4)之后QTP根据测试定义的工作流程按顺序调用每个Action。针对每个Action,QTP创建一个私有的本地作用域。此作用域在每个Action周期建立和释放
5)在Action1中定义的方法不会被其他Action或者全局作用域访问到
图9-2 QTP运行作用域:本地和全局作用域
小提示:如果多个全局库中有同名方法,那么最后一个加载的那个库中的方法会被调用。
Option Explicit的适用性
在库函数文件头部的"Option Explicit"声明允许程序员对所有使用的变量做强制变量声明。但我们可以看到即便在某些关联的库中有"Option Explicit"声明,对于没有声明的变量也没有抛出错误。
这个出现的原因是源于全局作用域建立的机制。我们需要在所有全局作用域中而不能只在个别全局库函数文件中使用"Option Explicit"。强制变量声明"Option Explicit"需要放在所有使用的库函数文件中,如果有遗漏,QTP就不会在全局域强制使用变量声明。
原文转自:http://www.uml.org.cn/Test/201307084.asp