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

  (未完待续)

版权声明:51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像。51testing软件测试网欢迎与业内同行进行有益的合作和交流,如果有任何有关内容方面的合作事宜,请联系我们。

相关链接:

QTP自动化测试权威指南 连载(一)

QTP自动化测试权威指南 连载(二)

QTP自动化测试权威指南 连载(三)

posted on 2013-06-19 10:55 顺其自然EVO 阅读(493) 评论(0)  编辑  收藏 所属分类: qtp


只有注册用户登录后才能发表评论。


网站导航:
 
<2013年6月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜