51Testing软件测试论坛
标题:
想开发自己的测试框架? 也许这个工具会帮上忙
[打印本页]
作者:
lifr
时间:
2011-1-8 21:34
标题:
想开发自己的测试框架? 也许这个工具会帮上忙
本帖最后由 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会是很复杂的, 必须需要字符串解释器这样的工具.
总的来说, 这个工具增强了测试框架对输入数据的处理能力, 更设计出更简单易用的接口. 所以我共享出来, 希望能对你有帮助.
[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)
复制代码
作者:
TIB
时间:
2011-1-9 22:12
非常好
作者:
5555
时间:
2011-1-10 11:00
多谢,收藏学习
作者:
Jun_Li
时间:
2011-1-10 13:39
the technique helpful to me, Ths
作者:
testlab
时间:
2011-1-10 13:42
看看
作者:
rojer521
时间:
2011-1-10 22:07
先顶后学
作者:
Scott86
时间:
2011-1-11 10:53
学习中……顶楼主……
作者:
itmomo
时间:
2011-1-11 14:50
先存了...
作者:
wscqb
时间:
2011-2-17 11:22
高手啊
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2