Hi, 如果有任何想法与我沟通, 请用: lifr_nj 在 msn.com

QTP框架设计: 字符串解释器

上一篇 / 下一篇  2011-01-08 21:41:22 / 个人分类:TestAutomation

函数可变参数
简单来说, 测试框架是对一个被测试产品操作的一个封装和抽象.
比如说一个创建用户的界面, 测试框架封装了具体的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

TAG:

 

评分:0

我来说两句

Open Toolbar