《tcl脚本测试入门》由会员分享,可在线阅读,更多相关《tcl脚本测试入门(9页珍藏版)》请在金锄头文库上搜索。
1、tcl脚本测试入门Tcl 简介Tcl 是一种非常简单的编程语言,如果你以前曾经学过编程,那么你只 要学习几个小时就可以编写出一些有趣的Tcl 程序。 本文将对 Tcl 的功能做一个 大概的 介绍。一般来说,读完本文之后,你就可以开始独立的编写一些简单的 Tcl 脚本了;不过,要想获得更全面的认识,我们建议你还是去参考几本目前已 经出版的Tcl 书籍。基本语法Tcl 脚本由一些被换行符或是分号分开的命 令所组成。 命令都有相同的基本格式, 如下面的例子所示: expr 20 + 10 该命 令计算 20 加 10 的和,并返回结果 30。你可以把这个例子以及本文中的所有其 它的例子键入到 tcl
2、sh这样的 Tcl 应用程序中来验证它们;在一个命令结束后, tclsh将打印出它的结果。每个 Tcl 命令都含有一个或多个被空格分开的单词, 在这个例子中有 4 个单词: expr,20,+,和 10。第一个单词是一个命令名,其余 的单词是这个命令的参数。所有的 Tcl 命令都含有一些单词,但不同的命令对 他们的参数有不同的处理方式。expr 命令把它的所有参数看作是一个算术表达 式,计算表达式的结果,并以字符串的形式返回结果。在expr 命令中,单词之 间的分隔不是很重要:同样的命令你可以写成这种形式:expr 20+10 不过, 对大部分的命令来说,单词的结构是很重要的。每个单词都会用于
3、不同的目的。 所有的 Tcl 命令都返回结果。 如果一个命令产生了没有意义的结果,那么它将返 回一个空字符串作为它的结果。变量Tcl 允许你在变量中保存数值,并且可 以在后续的命令中使用这些数值。set 命令用于对变量进行读写操作。比如,下 面的命令对变量 x 赋值为 32。set x 32 这个命令返回变量的新值。你可以 让 set 只带一个参数来读出变量的数值:set x 你不需要在 Tcl 中声明变量: 变量在第一次 set 的时候被自动创建。 Tcl 变量没有类型:任何值可以赋给任何 变量。要想在一个命令中使用变量的值,可以采用变量替代, 如下例所示:e xpr $x*3 当一个字符
4、$出现在一个命令中的时候,Tcl 把跟在它后面的字母和 数字看作是一个变量名并且将其替换成变量的值。在这个例子中,expr 命令接 收到的实际参数将是 32*3(假设变量 x 在前面的例子中被set 过)。你可以在 任何命令的任何单词中使用变量替代,甚至对一个单词多次使用:set cmd e xpr set x 11 $cmd $x*$x 命令替代你也可以在一个命令的参数中使用另一 个命令的结果。 这被称之为命令替代:set a 44 set b expr $a*4 当中括 号出现在一个命令中的时候, Tcl 把中括号之间的所有语句看作是一组Tcl 命令。 Tcl 对这组命令进行解释,并用结果
5、替代中括号之间的文字。上面的例子中,第 二个 set 命令的第二个参数将为176。双引号和大括号双引号允许你指定包含 空格的单词。我们看下面的这个例子:set x 24 set y 18 set z “$x + $y is expr $x + $y“ 在这三个命令都被解释后, 变量 z 的值将是 24+18 is 42 。 双引号之间的所有语句作为一个单词传给set 命令。此处需要注意几点(a)引 号之间的命令和变量替代仍起作用,(b)引号自身不会被传给命令。如果没有 引号的话, set 命令会得到 6 个参数,这将引起错误。花括号对单词提供另外 一种组合信息的方式。它与双引号的不同之处在于:
6、花括号内的替代不起作 用:set z $x + $y is expr $x +$y 这个命令把变量 z 赋值为“ $x + $y is expr $x +$y“。控制结构Tcl 提供一整套控制结构包括条件,循 环和过程。 Tcl 的控制结构只是一些将Tcl 脚本作为参数的命令。下面的示例创 建了一个叫做 power 的 Tcl 的过程,实现对一个数求它的n 次方:proc powe r base p set result 1 while $p 0 set result expr $result * $b ase set p expr $p- 1 return $result 这个脚本由一个简单
7、的命令 proc 所组成,这个 proc 命令有 3 个参数:过程名,参数名列表和过程体。过程 体是一个 Tcl 脚本。需要注意的是,第一行末尾的花括号和最后一行花括号之 间的语句都被逐字逐句的作为一个参数传给proc。proc 命令创建了一个新的叫 做 power 的具有两个参数的 Tcl 命令。你 可以这样来调用power:power 2 6power 1.15 5 当 power 被调用的时候,过程体就被解释了。当过程体执行的 时候,它可以变量的形式进入它的参数中:base 获得第一个参数, p 获得第二个 参数。power过程体中包含 3 个 Tcl 命令: set,while和 re
8、turn 。while 命令 完成了这个过程中的大部分工作。它有两个参数,一个表达式($ p0)和一个 Tcl 脚本写的主体。while 命令使用与 C语言相似的规则来解释它的表达式参数。 如果结果是真(非零),那么它将把函数体作为脚本来执行。他不断的重复这 个过程,直到最后表达式的值变为假(零)。在这个例子中,while 命令的函数 体将 result的值与 base 相乘,然后减少 p 的 值。当 p 的值减到零的时候,结 果就包含了需要的base 的 n 次方值。return命令的作用是退出过程,同时将变 量 result的值作为过程的结果返回。命令是如何运作的?正如你所见到的, Tcl
9、 中所有有趣的功能都是靠命令来描述的。声明是命令,表达式由可执行命令 来解释,控制结构是命令,过程也是命令。Tcl 命令由 3 种方式来创建。一组 命令由 Tcl 解释器自身来提供。 这些命令称之为内建命令, 他们包括到现在为止 你已经看到的命令和更多其他的命令(见下面)。内建命令出现在所有的Tcl 应用程序中。第二组命令使用 Tcl 扩展机制来创建。 Tcl 提供许多 API 接口, 允许你用 C或 C+ 编写一个命令过程来创建一个新的命令。然后你可以通过Tcl 解释器来通知 Tcl 过程实现的命令名,来注册命令过程。以后只要那个特定的 名称被当作 Tcl 命令来使用, Tcl 就会调用你的
10、命令过程来执行这个命令。其实 内建命令也是使用同样的扩展机制来执行的,只不过它们的命令过程是Tcl 库 中的一部分。当 Tcl 用于嵌入到一个应用程序中的时候,应用程序使用扩展机 制把它的主要功能和Tcl 结合起来,这样一来那些可用的Tcl 命令就因程序的不 同而不同。还有大量的扩展包可以和Tcl 应用程序组合起来使用。 Tk 是最著名 的扩展之一, 它提供了许多强大的创建图形用户界面的工具。而其他的扩展则提 供了面向对象的编程,数据库访问,更多的图形功能,及其他的一些特性。用 Tcl 来创建完整的应用程序的优势之一是它可以很方便的进行扩展,从而可以组 合进新的功能或与其它的资源进行通信。 第
11、三组命令是一些由proc 命令创建的 过程。比如上面创建的power 命令。通常,扩展用于较低层的功能,用C语言实 现比较方便;而过程用于较高层的功能, 用 Tcl 实现比较方便。其它的功能T cl 除了前面的例子中所使用的命令外,还有许多其它的命令,这里举例给出一 些内建的 Tcl 命令所具有的功能:更多的控制结构,如if,for,foreach 和 switch 字符串操作,包括一个强大的规则表达式匹配工具。不定长字符 串可以像数字一样被传递和操作 I/O 输入输出包括磁盘,网络通信通道, 和类似串口的设备中的文件。Tcl 为在 Internet上进行通信提供了非常方便的 工具文件管理:
12、Tcl 提供许多命令来操作文件名,读写文件属性,复制文 件,删除文件,创建目录,等等分支过程的实现:你可以使用exec 命令来运行其他程序,并且可以在它们的运行过程中和它们进行通信 Lists Tc l 使创建数值的集合变得很容易,并且可以用许多方式来对它们进行操 作数组 你可以创建有成对的名称数值组成的结构化数值,同时可以使用 不定长字符串来定义这些名称和数值可以对时间和日期进行操作 Ev ents 允许等待一定的事件发生后再触发Tcl 脚本,比如一段时间的延迟或是网 络通信中输入的数据变为有效Expect简介一个叫做fsck 的 Unix文件系统检查程序,可以从 Shell里面用 -y 或
13、者 -n 选项来执行。在手册 1 里面, -y 选项的定义是象这样的。“ 对于 fsck 的所有问题都假定一个“yes” 响应;在这样使用的时候,必须特别的小心,因为它实际上允许程序无条件的继续运行,即使是遇到了一些非常严重的错误”相比之下, -n 选项就安全的多,但它实际上几乎一点用都没有。这种接口非常的糟糕,但是却有许多的程序都是这种风格。文件传输程序ftp 有一个选项可以禁止交互式的提问,以便能从一个脚本里面运行。但一旦发生了错误,它没有提供的处理措施。Expect是一个控制交互式程序的工具。他解决了fsck 的问题,用非交互的方式实现了所有交互式的功能。Expect不是特别为fsck
14、设计的,它也能进行类似ftp 的出错处理。fsck 和 ftp 的问题向我们展示了象sh,csh和别的一些shell提供的用户接口的局限性。Shell没有提供从一个程序读和象一个程序写的功能。这意味着shell可以运行fsck 但只能以牺牲一部分fsck 的灵活性做代价。有一些程序根本就不能被执行。比如说,如果没有一个用户接口交互式的提供输入,就没法运行下去。其他还有象Telnet,crypt,su,rlogin等程序无法在shell脚本里面自动执行。还有很多其他的应用程序在设计是也是要求用户输入的。Expect被设计成专门针和交互式程序的交互。一个 Expect程序员可以写一个脚本来描述程序
15、和用户的对话。接着 Expect程序可以非交互的运行“ 交互式 ” 的程序。写交互式程序的脚本和写非交互式程序的脚本一样简单。 Expect还可以用于对对话的一部分进行自动化,因为程序的控制可以在键盘和脚本之间进行切换。Tcl 安装配置1 安装 ActiveTcl 8.4 (包括 Expect扩展)下载地址:http:/ 下载 twapi 下载地址: http:/ 8.4 安装目录下的lib 文件夹。使用 tcl ,Expect在 VC 环境测试 C/C+函数1 利用 Visual C+ 建立一个控制台程序的工程,工程的名字为TclTest 。2 把下面代码拷贝到TclTest.h #include “tcl.h“ #define RET_ERR false #define RET_OK true #define MAX_WORD_LEN 32 int GetWordFromStr(const char* pStrSource,char * pDestStr,int len); / 这里更改为你好测试的函数定义。int Tcl_EXGetWord(ClientData clientData, Tcl_Interp * interp, int argc, char* argv); int Tcl_Ap