TCL、Python 和软件测试自动化
1
TCL 脚本语言
目录
TCL 脚本语言 ................................................................................................................................... 1
了解它,一小时之内! ........................................................................................................... 5
启动解释器 ....................................................................................................................... 6
变量和表达式 ................................................................................................................... 7
定义函数 ........................................................................................................................... 8
循环和控制 ....................................................................................................................... 8
列表和数组 ..................................................................................................................... 10
输入输出 ......................................................................................................................... 11
类和面向对象 ................................................................................................................. 11
函数库程序包 ................................................................................................................. 13
总结 ................................................................................................................................. 14
基本词法和概念 ..................................................................................................................... 15
一切都是命令和及其参数 ............................................................................................. 15
单词、引号、括号 ......................................................................................................... 17
解释执行过程 ................................................................................................................. 18
脚本注释 ......................................................................................................................... 20
没有 do...while?自己实现............................................................................................. 21
置换:TCL 的灵魂 ................................................................................................................. 23
变量置换 ......................................................................................................................... 23
命令置换 ......................................................................................................................... 25
反斜线置换 ..................................................................................................................... 26
subst 置换 ........................................................................................................................ 27
数学计算,怎么这么烦? ..................................................................................................... 29
语法描述 ......................................................................................................................... 29
操作符 ............................................................................................................................. 30
操作数 ............................................................................................................................. 31
数学函数 ......................................................................................................................... 32
类型、精度 ..................................................................................................................... 32
字符串计算 ..................................................................................................................... 33
计算性能方面的考虑 ..................................................................................................... 33
简单变量和字符串处理 ......................................................................................................... 35
作者:雷雨后
Email: leiyuhou010@gmail.com
TCL、Python 和软件测试自动化
2
创建和删除变量 ............................................................................................................. 35
string:一般处理 ............................................................................................................ 36
format:格式化 ............................................................................................................... 42
scan:解析扫描 .............................................................................................................. 46
Chr()和 Ord() ........................................................................................................ 47
列表和数组:高效强大的数据结构 ..................................................................................... 49
列表 ................................................................................................................................. 49
数组 ................................................................................................................................. 60
正则表达式 ............................................................................................................................. 67
正则表达式语法 ............................................................................................................. 67
正则表达式匹配查找 ..................................................................................................... 74
正则表达式匹配替换 ..................................................................................................... 76
控制结构 ................................................................................................................................. 79
Boolean 类型 ................................................................................................................... 79
条件判断 ......................................................................................................................... 79
循环控制 ......................................................................................................................... 82
break、continue ............................................................................................................... 85
异常处理 ......................................................................................................................... 86
执行字符串 ..................................................................................................................... 90
使用 assert ....................................................................................................................... 97
过程和变量 ............................................................................................................................. 99
定义过程 ......................................................................................................................... 99
全局、局部 ................................................................................................................... 100
参数默认值 ................................................................................................................... 102
可变数量参数列表 ....................................................................................................... 102
处理选项参数 ............................................................................................................... 105
传引用还是传值? ....................................................................................................... 110
再说 return ..................................................................................................................... 111
过程更名、删除 ........................................................................................................... 112
变量跟踪 ....................................................................................................................... 113
名字空间 ............................................................................................................................... 117
创建名字空间 ............................................................................................................... 117
variable 命令 ................................................................................................................. 119
名字和名字解析 ........................................................................................................... 120
引入命令 ....................................................................................................................... 122
输出命令 ....................................................................................................................... 123
其他名字空间命令 ....................................................................................................... 125
面向对象编程 ....................................................................................................................... 129
作者:雷雨后
Email: leiyuhou010@gmail.com
TCL、Python 和软件测试自动化
3
定义类 ........................................................................................................................... 129
使用类和对象 ............................................................................................................... 135
继承 ............................................................................................................................... 138
虚函数 ........................................................................................................................... 139
find:查找类和对象 ..................................................................................................... 140
程序库和程序包 ................................................................................................................... 143
source:TCL 中的#include ........................................................................................... 143
unknow 方法 ................................................................................................................. 143
auto_load:加载程序库 ................................................................................................ 144
创建程序库(library) ................................................................................................. 146
交互模式下执行命令 ................................................................................................... 150
程序包(package) ...................................................................................................... 152
事件驱动 ............................................................................................................................... 165
after 命令 ....................................................................................................................... 165
vwait 进入事件循环 ..................................................................................................... 166
输入输出系统 ....................................................................................................................... 169
操作文件系统 ............................................................................................................... 169
读写文件 ....................................................................................................................... 175
匿名管道 ....................................................................................................................... 188
作者:雷雨后
Email: leiyuhou010@gmail.com
TCL、Python 和软件测试自动化
5
了解它,一小时之内!
TCL 语言非常简单,下面我们通过一个简单的例子,让我们对 TCL 有一个大概的映象
和了解。如果你会使用 C Shell 脚本或者有过 C/C++的经验,那么 TCL 对你而言,应该非常
容易。先看看下面的程序 complex.TCL:
#File complex.TCL
#
package require Itcl
package require control
itcl::class Complex {
public variable m_r
public variable m_i
;#实数
;#虚数
constructor {r i} {
set m_r $r
set m_i $i
}
public method + { c } {
;#复数的加法
set r [expr "$m_r + [$c cget -m_r]"]
set i [expr "$m_i + [$c cget -m_i]"]
return [code [Complex #auto $r $i]]
}
public method GetReal { } { ;#复数的减法
return $m_r
}
public method GetImag { } {
return $m_i
}
public method - { c }
}
作者:雷雨后
Email: leiyuhou010@gmail.com
TCL、Python 和软件测试自动化
6
itcl::body Complex::- {c} {
set r [expr "$m_r - [$c cget -m_r]"]
set i [expr "$m_i - [$c cget -m_i]"]
return [itcl::code [Complex #auto $r $i]]
}
pro main {} {
;#定义了过程 main
set r 100;set i 200
Complex a $r $i
Complex b 50 50
set c [a - b]
control::control assert enabled 1
puts “c.real = [$c GetReal] ; c.imag = [$c GetImag]”
control::assert "[$c GetReal]==50"
control::assert "[$c GetImag]==150"
}
main
;#调用过程 main
上面的代码实现了一个简单的复数类,并且实现了几个成员函数,完成加法和减法操作。
最后的代码创建两个对象,并且相减得到另外一个对象。然后使用 assert 来断定我们的操作
是正确的。
启动解释器
我们可以在 Dos 提示符中输入命令 tclsh 来启动 TCL 解释器,并且进入交互式模式,然
后使用 source 命令来执行我们刚才创建的脚本,如下:
C:\>tclsh
% cd e:/work/script
% source complex.TCL
c.real = 50 ; c.imag = 150
%
交互式模式下,我们每输入一次命令,TCL 解释器就执行这命令,然后把命令的执行结
果给打印出来。如果出现了语法错误或者异常,就把异常信息给打印出来。
我们也可以在 DOS 提示符下输入 tclsh e:/work/script 直接执行我们的脚本,如下:
作者:雷雨后
Email: leiyuhou010@gmail.com
TCL、Python 和软件测试自动化
7
C:\>tclsh e:/work/script/complex.tcl
c.real = 50 ; c.imag = 150
C:\>
ActiveTCL 软件包中还有一个程序 tkCon,可以在启动菜单中找到。这是一个使用 TCL/Tk
开发的图形界面的脚本解释器,使用起来更加方便。
变量和表达式
TCL 中也存在变量的概念,我们可以创建变量,赋值,引用,删除变量,比如上面的代
码中:
% set r 100;set i 200
200
% Complex m $r $i
m
%
;#创建了两个变量 r 和 i,并且初始化为 100 和 200
;#引用变量 r 和 i,创建了一个 Complex 对象
TCL 中的变量没有类型,或者我们换一种说法,所有的变量都是同一种类型:“字符串”
类型。比如上面例子种的变量 r 和 i,他们的值分别是 100 和 200,这里 100 和 200 都是字符
串,没有整数这么一说。可能我们会迷惑了,如果我要计算这两个数的和,怎么办?
% set sum $r+$i
;#企图计算 r 和 i 两个变量的和,但是事与愿违;
100+200
% set sum [expr $r+$i]
;#只有这样才行
300
%
看看上面的例子就明白了,第一种方法计算 sum,结果 sum 的值是字符串“100+200”。
只有通过第二种方式,使用 expr 命令来计算表达式$r+$i,sum 的值才是我们期望的 300。在
TCL 中,所有的数学计算都是通过 expr 命令来实现的。例如通过计算正弦来得到 2 的平方
根:
% set PI 3.1415926535897932
3.1415926535897932
% expr "cos($PI/4)*2"
1.41421356237
% expr "sqrt(2)"
1.41421356237
;#创建变量 PI
;#计算得到 sqrt(2)
;#直接计算得到 sqrt(2)
作者:雷雨后
Email: leiyuhou010@gmail.com
TCL、Python 和软件测试自动化
8
TCL 中表达式的写法和 C 语言是比较类似的,并且支持常用的数学函数。
定义函数
Pascal、VB 语言中存在函数和过程的区别,并且函数和过程的定义方式不一样。在 TCL
语言中,函数和过程的定义方式没有差别,就像 C/C++一样,所以后面的章节中针对 TCL
而言,“函数”和“过程”两种提法是等价的。TCL 中的过程分成两类:
1. TCL 语言自带的核心命令。
2. 用户编写的扩展命令。
TCL 的核心命令只有 80 多条,比如 set 命令;我们还可以使用 TCL 脚本定义自己的过
程,也可以使用 C/C++语言来实现一些和操作系统等紧密相关的过程。前面的例子代码中,
我们就定义了一个过程 main;下面是另外一个过程定义:
#过程 Factorial,计算参数 n 的阶乘。
proc Factorial {n} {
if {$n<=1} {
return 1
}
return [expr $n*[Factorial [expr $n-1]]]
}
puts "10! = [Factorial 10]"
puts "5! = [Factorial 5]"
;#调用过程 Factorial,计算 10!
;#调用过程 Factorial,计算 5!
可见,TCL 中的过程是可以递归调用的。
循环和控制
TCL 的核心命令中提供了常见的控制结构。而且 TCL 和其他语言相比很大的不同是:
你甚至可以编写你自己的控制结构!这是后话。TCL 中循环结构包括 for 循环和 while 循环,
例如:
#使用 for 循环实现阶乘
proc Factorial1 {n} {
set result 1
for {set i 1} {$i<=$n} {incr i} {
set result [expr $result*$i]
}
作者:雷雨后
Email: leiyuhou010@gmail.com