软件测试自动化之测试脚本语言杂谈
我这个人比较喜欢把繁琐机械的事情自动化,而为很多小事情写C/C++程序还是比较麻烦的。因为是编译型语言,所以修改必须编译成二进制文件,除了二进制文件还要保留源码和工程。万一哪天找不到源码了又得重写。脚本语言则没有这些问题,写完了源码,直接丢给解释器执行即可,完全没有编译的烦恼。正是因为这些原因,我经常使用各种脚本语言。
有的时候,写脚本之前会犹豫,那么多脚本语言,用哪种好呢?常常是用某种写好了,过了些天觉得还是用另一种好,结果又写一遍。我想问题的关键在于很好的区别各种语言的优缺点,根据各自的特点觉得其适合于何种应用。所以正好今天有空 ,索性对各种脚本做个透彻的比较。
我用过的脚本语言主要是 Tcl/Tk, Perl, VBS/VBA这几种,以下一一描述吧。
Tcl/Tk
Tcl 的最大特点我觉得就其语法格式极其简单甚至可以说僵化,纯粹的 [命令 选项 参数] 形式,名副其实的 Tool Command Language。不过正因为如此,学习掌握起来就极为容易了,而且这种形式上的简单却大大简化了解析器的复杂性,使得对Tcl 脚本的支持非常容易实现,这些应该也是大多数EDA工具采用Tcl 为其脚本环境的原因吧。但另一方面说,这种形式的简单不太对一些很喜欢使用语法技巧的人的胃口。
Tcl 的另一特点就是通过Tk对跨平台用户界面的支持了,一来有丰富的用户界面元素,二来又可以跨平台。这两点合在一起就非常吸引人了,难怪很多流行的EDA工具也采用Tk来实现其用户界面了,比如Mentor的ModelSim。不过就ModelSim的使用经验来看,Tk界面似乎不太稳定,而且个人认为Tk 用户界面有些难看:p
效率方面,我觉得Tcl是很慢的,不过既然是脚本语言,这也是通病,就算比其他脚本慢一般也不会太在意。
Perl
Perl 我觉得是脚本语言当中,语法,功能,效率三方面的赢家。
Perl的语法源自C/C++,所以对于为数众多的C/C++程序员来说,上手非常容易。而且设计者在设计之初就特别考虑了语法的灵活性和多样性,目标就是使其能够媲美自然语言,正是这种考虑成就了今天Perl语法的灵活而多样。
在数据类型和动态性方面,Perl也支持的不错。
功能上,Perl的扩展模块之多可说是脚本之最,虽然Perl本身没有用户界面支持,但是通过Tk扩展包完美地嵌入了Tk,弥补了这方面的缺憾。
效率方面,Perl解释器的执行速度是比较快的,而且可以通过PerlCC等转为C程序编译为本地执行文件,这就大大超越了一般脚本所能提供的运行效率。
VBS/VBA
出于对VB语言的厌恶,我对VBS/VBA一直不怎么顺眼,我一直觉得拘泥于BASIC这种早期的语言衍生出来的Visual Basic天生就不会如C/C++般好用。也许很多人会强调VB的简易性,动态性和功能的丰富。但简易性和动态性,我可以去用脚本语言,功能的话,只能用在Win32平台上的VB能够走多远呢?而其运行效率更是不能和C/C++相比。所以说VB其实就是编译型语言和脚本语言结合的产物。若不是微软的大力推广,这门语言很难到达现在这个高度。
VBS是VB的一个脚本化版本,弥补命令行功能的缺陷。VBA则是作为诸如 Office 之类的应用程序当中的脚本环境。我对他们的评价如同VB。这两种语言都只能用于特定环境,远不及Tcl的通用性。
总结一下以上的叙述,我觉得选脚本语言的时候要考虑几个方面:
1. 是否需要某种特殊的功能?
文字处理是否复杂?如果很复杂,Perl是最好的字处理语言,如果不太复杂,Tcl足够处理了。
是否需要用户界面?需要的话,Tcl/Tk是唯一选择,不过既然Perl可以内嵌Tk,那用Perl也没问题。
是否需要通过OLE操作其他软件?OLE的最佳排档是VB,但是Perl也通过Win32::OLE包提供了完整的OLE支持。
2。使用环境是否有要求?
如果在某个应用程序内部使用,自然是使用其支持的脚本环境最为方便了。比如要操作Office文档,用其内部提供的VBA是最方便的。不过如果程序能够提供外部接口,比如Office文档也可以通过外部OLE接口操作,功能等同VBA,这时这个要求就不是那么重要了。
3。语言的通用性
我想大多数人还是希望只用一种语言解决所有问题的,个人觉得担当这个人物的最佳人选是Perl。尽管Perl本身不支持界面,不支持OLE,但是他提供的丰富的Package足以对付各种应用。而且我最习惯用的就是Perl,毕竟写了多年的C/C++, 所以还是Perl的语法写来舒服一些。
不过Tcl的地位仍然无法被取代,芯片领域几乎所有的EDA工具都只提供了Tcl脚本环境,而且不提供诸如OLE的外部接口。对于这些应用,Tcl是唯一可选的语言。至于VBS/VBA, 我在发现其可以被Perl替代之后就再也没有用过他们,可以抛弃。
所以,最终结论:在日常应用当中,Perl是王者。但专用领域,如EDA工具环境中,Tcl无可替代。