SilkPerformer的十一宗罪(上)

以前写过 一些文章痛批当下流行测试软件的自动化功能。比如 Segue的 SilkPerformer(现在是Borland的了), Mercury Interactive的 Quick Test Professional(QTP),和Segue的SilkTeset。最近CSDN上诸多老大推荐这些工具。俺觉得有必要旧话重提。毕竟我们有更好的选择。所以改写了一下那些文章,在这里帖出来。今天先聊SilkPerformer。以前 这篇文章谈到对Web应用的测试自动化工具的要求,而这里我们可以看看SilkPerformer是怎么与那些要求背道而驰的。
SilkPerformer的脚本语言叫BDL,Benchmarking Definition Language。这个语言就像一帮30年前的业余程序员设计的玩具,毫无章法。每次用BDL写测试代码,我都一边奇怪自己上辈子造了什么孽,以至于横遭BDL凌虐,一边想找块豆腐撞死,还一边感叹祥林嫂其实没那么可怜。当时我和同事一致抱怨,测试不是人啊?凭什么用那么下作的编程语言?
用SilkPerformer在线帮助的话来说,BDL是一款用于负载测试的动态语言。我就不明白,BDL到底“动态”在哪里?它是解释语言?它提供了一点,哪怕一点动态语言的特性,以便我们能够轻松写出测试用例?它支持动态类型,有利快速开发?Nah, 通通天方夜谈。BDL代码被执行前得编译为BEX文件。BDL没有提供任何70年代Pascal以外的特性,遑论常见的动态语言特性。BDL只支持类似标准Pascal的静态类型,而且继承了标准Pascal的类型系统的毛病。BDL还有很多其它限制,让写BDL代码的测试员极其痛苦。BDL的缺陷至少有十一条,排名不分先后:
§    BDL 不支持表达式嵌套。也就是说,诸如 foo(bar())这样的写法都不行。我们必须写成 x = bar(); foo(x)。怎一个丑字了得。
§    BDL 的类型规则愚蠢无比。如前所说,BDL有1980年前Pascal的血统。很明显BDL的设计人没有读过 Brian Kernighan's的著名文章,   Why Pascal Is Not My Favorite Language, 尤其是第2.1节。于是,新世纪最SB的类型规则粉墨登场:数组长度是数组类型的一部分!也就是说, array[10] of string 和 array[5] of string 是两种不同的类型。更搞笑的是,BDL不提供数组间的类型转换。所以我们不用指望把一个长度为5的数组传给一个类型为10个元素的数组变量。当然,我们可以用其它办法解决这个问题。但这个特性本身就是对我们智力的侮辱(上个世纪不是,这个世纪绝对是)。
§    BDL的句法前后不一致。比如说,定义一个函数时,参数列表用分号隔开。到了使用这个函数时,参数列表就得用逗号了。比如说,我们定义函数foo时用 function foo(a: number; b: number), but但调用foo时就得写成 foo(a,b)。让人吐到死啊。除了Segue没有能力写出一个合格的解析器以外,我想不出为什么会有这个让人脑组织坏死的规则。
§    BDL 编译器的出错信息聊胜于无。很多出错信息就一句话,告诉你某行有个语法错误。比我写的第一个编译器还原始。
§    BDL 不支持static变量,但支持头文件(叫BDH,Benchmarking Definition Header)。也就是说,一个头文件里的全局变量也就是所有包含这个头文件的代码的全局标量。为了避免变量冲突,我们只有不采用本不必要的命名规则。很显然,Segue从没想过怎么帮助用户搭建大型的测试库。
§     BDL 不支持复合数据结构。不用说我们常用的list, map这类东西了。连struct都没有!令人发指啊。给一个字典数据结构很难么?Segue的程序员搞了一个叫form的古怪结构出来。我们可以在一个form里添加和更改键值对。所以form多少和一个多键map相似。问题是,所有的form都只能申明为全局变量。操作form的函数也丑陋无比。现在我们就来欣赏其中一个:WebFormValueGet()。先猜一下这个函数干嘛的,有几个参数?如果你是像俺一样的普通人,多半猜到这个函数类似于Java里的Map#get(Object key),根据一个给出的键取出对应的值。对吧?错!伟大的Segue哪能容忍这么简单的函数。WebFormValueGet()有七个参数!这个函数可以用来取得一个值,取得一个键,取得一个键值对,或者根据上一次运行的历史做出相应的操作。而且取出的值没有被返回,而是放进一个被标记为 in的参数里。显然这个SB函数是用COM提供的。这么一个函数都不能用BDL本身实现,也算天大的笑话。更夸张的是,取出某个值以前,我们还得告诉这个函数那个值的大小。Segue的程序员N年如一日地抵制高粘度(high cohesion)原则,也算是业界一大奇观了。
累死了。休息一下先。
 

你可能感兴趣的:(数据结构,测试,语言,pascal,Borland,benchmarking)