51Testing软件测试论坛
标题:
能否让Library里面的Function直接调用主脚本里的变量?
[打印本页]
作者:
eightants
时间:
2007-9-18 08:48
标题:
能否让Library里面的Function直接调用主脚本里的变量?
我有一个很长的QTP脚本已经指定调用了一个vbs文件(Library)。请问有没有方法让vbs文件里面的Function 不通过正常的Function变量传递而直接调用主脚本里面Public的变量。
因为,我要修改这个脚本,添加一些新的功能,比如自动建立测试报告等。在Library里面的Function要调用很多变量,其中有的变量还要被好多个Function公用。如果只使用Function CreatReport (X1, X2, X3, X4,.....)中的X1, X2, X3, X4,.....的方法传递变量,有许多局限性。能不能使用类似下面的方法去调用变量:
主脚本:
...
Public A
A=10
CreatReport X1, X2, X3
...
Library:
...
Function CreatReport (X1, X2, X3)
For i=1 to A
...
Next
...
End Function
...
我已经测试过,QTP 8.2是不支持这种用法的。可惜QTP也不支持include方法,不知道各位高手能不能提供一个好的解决方案?
作者:
yabest
时间:
2007-9-18 10:44
问题不是这样的!
VB/QTP基本知识:
1、变量一般要先定义后使用,不过VB支持自动定义变量,就是变量不用定义,直接在第一次使用时自动定义。
2、函数外定义的变量将被定义为全局变量,函数里定义的变量将被定义为局部变量。
3、QTP运行时,先按顺序编译执行Resource-Library里的文件,然后再编译执行Action里的代码
所以,在你的例子里:
先编译执行Library里的代码,函数CreatReport里的A因未定义,所以被当作自动定义变量,是函数里的局部变量。
后编译执行Action里的代码,这时候Public A定义的是全局变量。
所以两个地方的A变量是两个独立的变量了,所以使用起来肯定出问题!
解决方法:要在编译执行Function Library文件前,先定义A为全局变量。
1、将A的定义放在另外一个独立Library文件中,并且加载顺序要在Function Library前
2、将A的定义放在同一Function Library文件的开头
3、放弃Resource-Library方式来加载Libray,改用在Action里"ExecuteFile LibraryFilePath“方式加载Library,并且ExecuteFile要在变量A定义之后
其实说来说去,用全局变量的方式传递大量参数,并不是好的方法!
用函数参数的方式还是比较好的!
你可以将很多个变量放都定义在一个class里,然后将此class变量当作一个函数参数进行传递,这样就不会觉得函数的参数太多,写起来很麻烦了!
[
本帖最后由 yabest 于 2007-9-18 10:46 编辑
]
作者:
yuandjing
时间:
2007-9-18 11:11
楼主可以试一下 byref方法,传地址调用
作者:
hsjzfling
时间:
2007-9-18 11:43
楼主如果想要用自己的方式,那么只要将需要在vbs文件中使用的变量定义为环境变量即可
File->settings(8.2 中是Test->settings)->Environment 选 User-defined,添加环境变量,比如A,Value可以为空,可在代码中对其赋值,使用方式为Environment("A")
作者:
eightants
时间:
2007-9-19 11:35
非常感谢大家的帮助,问题已经解决。最后采用的是设置环境变量的方法。因为那个脚本太长了,光Library里引用的vbs就有将近2000行代码。我只是需要添加几个function,实在懒得从头分析所有的内容。不过通过这次的问题,我学到了一些QTP工作的基础知识。本来还想当然的以为QTP是先执行主脚本,只有当调用相关程序的时候才会运行Library。sdlkfj1
这里特别感谢yabest详尽的回答,以及hsjzfling和yuandjing的帮助。在51Testing论坛里使我学到了很多的知识。
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2