|
本帖最后由 lifr 于 2011-1-8 21:39 编辑
函数可变参数
简单来说, 测试框架是对一个被测试产品操作的一个封装和抽象.
比如说一个创建用户的界面, 测试框架封装了具体的UI操作,向上提供了一个接口 createUser(testData).
这样调用者就不需去关心具体的页面导航, 输入数据, 提交表单这些繁琐的操作, 一个调用就创建好了用户.
假如我们已经确定要提供CreateUser这样一个接口, 那么接下来的问题是, testData应该是什么样的? 一般来说, 这里有三种选择
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会是很复杂的, 必须需要字符串解释器这样的工具.
总的来说, 这个工具增强了测试框架对输入数据的处理能力, 更设计出更简单易用的接口. 所以我共享出来, 希望能对你有帮助.
关于解释器本身
这是一个递归下降的程序, 阅读起来并不难. 而且注释良好.
其语法描述如下.
-
- 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)
复制代码 |
|