在我还没正规接触过自动化相关的测试时,一直没有使用过脚本语言,都是偏C和C++较多,当我在第一个项目接触了TCL之后,发现这个脚本语言虽然不是太多人用,但是非常实用而且很方便.(由于刚开博,所以东西比较少,后续发技术相关的会更细节些)
个人总结我工作中实用脚本语言处理的几个任务:处理文本,I/O输入输出,正则表达式,数据匹配,和内嵌html网页语言.
第一个处理文本是tcl的强项,他能够通过seek关键来获取你的文本光标所在的位置,可以对你想要的部分进行处理.用得最多的地方就是取你想要的日志.执行动作前获取光标的位置,执行动作后再一次获取光标位置,然后就可以把其中这2个位置之间的信息拷贝出来,进行日志分析.相关指令:
可以使用seek命令来改变文件的访问点:
seekfileIdoffset?origin?把fileId标识的文件的访问点设置为相对于origin偏移量为offset的位置。origin可以是start,current,end,默认是start。命令的返回值是一空字符串。
例如:seekfileId2000改变fieleId标识的文件访问点,以便下次读写开始于文件的第2000个字节。
seek的第三个参数说明偏移量从哪开始计算。第三个参数必为start,current或end中的一个。start是默认值:即偏移量是相对文件开始处计算。current是偏移量从当前访问位置计算。end是偏移量从文件尾开始计算。
tellfileId返回fileId标识的文件的当前访问位置。
eoffileId如果到达fileId标识的文件的末尾返回1,否则返回0。
处理文本中,tcl还有个强大的打开文件功能,这里我们经常用来记录日志是非常不错的:
下面介绍上述过程中用到的几个基本的文件输入输出命令。
openname?access?
open命令以access方式打开文件name。返回供其他命令(gets,close等)使用的文件标识。如果name的第一个字符是“|”,管道命令被触发,而不是打开文件。
文件的打开方式和我们熟悉的C语言类似,有以下方式:
r只读方式打开。文件必须已经存在。这是默认方式。
r+读写方式打开,文件必须已经存在。
w只写方式打开文件,如果文件存在则清空文件内容,否则创建一新的空文件。
w+读写方式打开文件,如文件存在则清空文件内容,否则创建新的空文件。
a只写方式打开文件,文件必须存在,并把指针指向文件尾。
a+读写方式打开文件,并把指针指向文件尾。如文件不存在,创建新的空文件。
而下面所说的I/O输入输出,大家要弄清楚一个理念,无论是执行进程,执行telnet,执行文本处理,都要有通道的概念,把一切读写的东西都归类为一种东西,这样你就更好的处理以下的东西了,所以大家需要掌握的就很简单了:put,read,after…..然后注意封装每个不同情况的处理就行了。
正则表达式和数据匹配大多用来判断结果和作为比较语句用比较多,给一个建议,能尽量不用正则表达式就不用,因为对于测试脚本来说,他的风险相对较大,一般情况下尽量用string:
string命令的语法:stringoptionarg?arg...?
string命令具有强大的操作字符串的功能,其中的option选项多达20个。下面介绍其中常用的部分。
1.1.1stringcompare ?-nocase??-length int? string1 string2
把字符串string1和string2进行比较,返回值为-1、0或1,分别对应string1小于、等于或大于string2。如果有-length参数,那么只比较前int个字符,如果int为负数,那么这个参数被忽略。如果有-nocase参数,那么比较时不区分大小写。
1.1.2stringequal ?-nocase??-lengthint?string1string2
把字符串string1和string2进行比较,如果两者相同,返回值为1,否则返回0。其他参数与8.5.1同。
1.1.3stringfirststring1string2?startindex?
在string2中从头查找与string1匹配的字符序列,如果找到,那么就返回匹配的第一个字母所在的位置(0-based)。如果没有找到,那么返回-1。如果给出了startindex变量,那么将从startindex处开始查找。例如:
% string first abdefabc
3
% string first abdefabc4
-1
1.1.4stringindexstringcharIndex
返回string中第charIndex个字符(0-based)。charIndex可以是下面的值:
整数n:字符串中第n个字符(0-based)
end :最后一个字符
end-整数n:倒数第n个字符。string index "abcd" end-1返回字符'c'
如果charIndex小于0,或者大于字符串string的长度,那么返回空。
例如:
% string index abcdef2
c
% string index abcdefend-2
d
1.1.5stringlaststring1 string2?startindex?
参照8.5.3.唯一的区别是从后往前查找
1.1.6stringlengthstring
返回字符串string的长度.
1.1.7stringmatch ?-nocase?patternstring
如果pattern匹配string,那么返回1,否则返回0.如果有-nocase参数,那么就不区分大小写.
在pattern中可以使用通配符:
*匹配string中的任意长的任意字符串,包括空字符串.
?匹配string中任意单个字符
[chars]匹配字符集合chars中给出的任意字符,其中可以使用A-Z这种形式
\x匹配单个字符x,使用'\'是为了让x可以为字符*,-,[,].
例子:
%string match * abcdef
1
% stringmatch a*abcdef
1
stringmatcha?cdefabcdef
1
% string match {a[b-f]cdef}abcdef//注意一定药用'{',否则TCL解释器会把b-f当作命令名
1//从而导致错误
% string match {a[b-f]cdef}accdef
1
1.1.8stringrangestringfirstlast
返回字符串string中从第first个到第last个字符的子字符串(0-based)。如果first<0,那么first被看作0,如果last大于或等于字符串的长度,那么last被看作end,如果first比last大,那么返回空。
1.1.9stringrepeatstringcount
返回值为:重复了string字符串count次的字符串。例如:
% string repeat "abc"2
abcabc
1.1.10stringreplacestringfirstlast?newstring?
返回值为:从字符串string中删除了第first到第last个字符(0-based)的字符串,如果给出了newstring变量,那么就用newstring替换从第first到第last个字符。如果first<0,那么first被看作0,如果last大于或等于字符串的长度,那么last被看作end,如果first比last大或者大于字符串string的长度或者last小于0,那么原封不动的返回string。
1.1.11stringtolowerstring?first??last?
返回值为:把字符串string转换成小写后的字符串,如果给出了first和last变量,就只转换first和last之间的字符。
1.1.12stringtoupperstring?first??last?
同8.5.11。转换成大写。
1.1.13stringtrimstring?chars?
返回值为:从string字符串的首尾删除掉了字符集合chars中的字符后的字符串。如果没有给出chars,那么将删除掉spaces、tabs、newlines、carriage returns这些字符。例如:
% string trim "abcde"{a d e}
bc
% string trim"def
> "
def
1.1.14stringtrimleftstring?chars?
同8.5.13。不过只删除左边的字符。
1.1.15stringtrimrightstring?chars?
同8.5.13。不过只删除右边的字符。
最后总结:本人第一次能够完全做测试持续集成的过程包括:自动化检测安装包,自动拷贝和卸载安装,自动执行很多用例,自动出结果,把失败用例邮件发给各个关注的人都是全自动每日定时跑的,其中90%都是用tcl完成,虽然只是项目的代码实施者,但是后续有机会把tcl用在新的项目中,试着作为架构搭建的角色完成一个自动化项目,还是一个不错的脚本后盾。