函数可变参数简单来说, 测试框架是对一个被测试产品操作的一个封装和抽象.
比如说一个创建用户的界面, 测试框架封装了具体的UI操作,向上提供了一个接口 createUser(userData).
这样调用者就不需去关心具体的页面导航, 输入数据, 提交表单这些繁琐的操作, 一个调用就创建好了用户.
假如我们已经确定要提供CreateUser这样一个接口, 那么接下来的问题是, userData应该是什么样的? 一般来说, 这里有三种选择
1) 用参数序列. 比如createUser(name, age, phoneHome, phoneOffice)
这种方法简单直接, 适合简单的数据,大量的数据就不太合适了. 而且VBS不支持变长参数序列, 后续版本如果要增加参数那就简直是恶梦.
2) 用Map/Dictionary用Dictionary解决了上面的问题. 即能描述复杂数据, 且不会出现增加参数导致接口变化的问题. 比如
Set map = CreateObject("Scripting.Dictionary")
map("name") = "Jack"
map("age")=21
map("phone") = Array("12334", "22223")
createUser(map)
Dictionary完全能解决问题, 就是"卖相不太好". 它显得有点啰嗦. 一个调用竟然要写5行代码.对于我这样的完美主义者来说很难接受.
于是某些聪明人想出了新的主意, 就是用字符串来描述这个Dictionary结构. 参见
http://www.advancedqtp.com/knowl ... ptional-parameters/这个方法很棒, 我也一度使用过这个方法, 但是它的问题是描述能力有限. 对于比较复杂数据结构就无能为力了. 最终, 有了下面的方案三.
3) 基于字符串解释器本质上, 此方案同2), 只是字符串的数据描述能力得到了大幅的加强, 能够描述更为复杂的数据结构. 比如上面例子里的参数可以描述为下面的字符串.
"{name=Jack; age=21; phone=[12334, 22223]}".
看
到这样的字符串, 你一定想起了另外一个大名鼎鼎的东东"JSON", 没错. 这个方案语法部分借鉴了JSON, 不过根据QTP测试框架开发的实际,
大幅简化了. 只支持Map/Array/String三种类型. 你不用担心其描述能力, 根据我的实践,
这三种类型的组合可以满足绝大部分要求了.
所以最终版本的创建用户调用就像下面的样子. 看上去是不是好很多呢 :-)
createUser(PM( "name=Jack; age=21; phone=[12334, 22223]"))
' PM means parse map
关于TestData其
实这个字符串的引用范围不仅仅是解决"函数可变参数". 在某一个方向上, 它为DataDriven
Test里的TestData提供了一个通用的解决方法(另为一个方向是QTP的datatable). (题外话:
Manager和boss都喜欢DataDriven这样的概念
).
比如我现在开发的测试框架. 它提供了一个针对所有Input Data Screen(Edit Page, Wizard)的统一调用接口. 像下面的样子.
ScreenGo(screenName, screenDescription)
可以想见, screenDescription会是很复杂的, 必须需要字符串解释器这样的工具.
总的来说, 这个工具增强了测试框架对输入数据的处理能力, 更设计出更简单易用的接口. 所以我共享出来, 希望能对你有帮助.
[attach]67778[/attach]
关于解释器本身这是一个递归下降的程序, 阅读起来并不难. 而且注释良好.
其语法描述如下.
map : {} {members}
members : pair pair; members
pair : NULL # NULL means nothing. NULL will be ignored, e.g "a=1;;b=2" string = value #string will be trimmed
array : [] [elements]
elements: NULL # NULL means nothing. NULL will be ignored, e.g "abc,,def" value value, elements
value : NULL # "" string map ary
string : char chars
char normal # any char but not \ [ ] { } ; , = \[ \] \{ \} \= \; \, \\ \s # (32) \t # (9) \n # (10) \r # (13)
|
注: 本文同时发布在QTP讨论区 http://bbs.51testing.com/thread-371986-1-1.html