Tcl/Expect学习心得之一:等待操作是很有用的。
测 试 七月 25th, 2007最近在做测试自动化方面的工作,主要测试产品就是防火墙。防火墙有web和CLI2种管理方式,以前都是手工使用SecureCRT等软件,通过串口登录上去进行操作,现在既然要做自动化,以前手工的方式自然就不适合了。
这几天自己琢磨了一下,用Tcl/Expect写了一个脚本(如下所示),实现的功能很简单,就是通过串口登陆防火墙设备并删除3.3.3.3这个IP。
0001: package require Expect
0002:
0003: set serial [open com1: r+]
0004:
0005: fconfigure $serial -mode “9600,n,8,1″
0006: fconfigure $serial -blocking 0 -buffering none
0007: #设置串口
0008: puts -nonewline $serial “\r”
0009:
0010: puts “[read $serial]“
0011: expect “*login:”
0012: puts -nonewline $serial “admin\r”
0013:
0014: puts “[read $serial]“
0015: expect “Password:”
0016: puts -nonewline $serial “firewall\r”
0017: #登陆防火墙
0018: puts “[read $serial]“
0019: expect “secgate>”
0020: puts -nonewline $serial “sysip del 3.3.3.3\r”
0021: #删除IP 3.3.3.3
0022: puts “[read $serial]“
0023: expect “*>”
0024: puts -nonewline $serial “quit\r”
0025: #退出防火墙
0026: close $serial
这个脚本能够成功删除IP;我觉得脚本中Expect并没有起多大作用,就把脚本改了一下,删除了其中的Expect相关的代码(如下所示),运行后却不能删除IP。
0001: set serial [open com1: r+]
0002:
0003: fconfigure $serial -mode “9600,n,8,1″
0004: fconfigure $serial -blocking 0 -buffering none
0005: #设置串口
0006: puts -nonewline $serial “\r”
0007:
0008: puts -nonewline $serial “admin\r”
0009:
0010: puts -nonewline $serial “firewall\r”
0011:
0012: #登陆防火墙
0013:
0014: puts -nonewline $serial “sysip del 3.3.3.3\r”
0015: #删除IP 3.3.3.3
0016:
0017: puts “quit\r”
0018: #退出防火墙
0019:
0020: close $serial
一直没想明白,后来经过jameszhang指点,在命令中加一些等待操作,就可以删除IP了,如下所示:
0001: set serial [open com1: r+]
0002:
0003: fconfigure $serial -mode “9600,n,8,1″
0004: fconfigure $serial -blocking 0 -buffering none
0005: #设置串口
0006: puts -nonewline $serial “\r”
0007: after 1000
0008: puts -nonewline $serial “admin\r”
0009: after 1000
0010: puts -nonewline $serial “firewall\r”
0011: after 1000
0012: #登陆防火墙
0013:
0014: puts -nonewline $serial “sysip del 3.3.3.3\r”
0015: #删除IP 3.3.3.3
0016: after 1000
0017: puts “quit\r”
0018: #退出防火墙
0019: after 1000
0020: close $serial
七月 29th, 2007 at 11:50 下午
不知道楼主为什么认为expect没有用?我没有用过expect,但是我认为它和你的after 1000的作用是一样的,就是等待交换机回答之后,再进行下面的操作。你用after 1000也是可以的,但是会产生一定的延时,比如交换机回答只需要500ms,而你等待了1000ms,则有多余的500ms延时。
八月 1st, 2007 at 9:58 上午
to fangtclchina:
我说得Expect没有用是指:需要用到Expect时一般是用它来控制命令交互,而这个地方进行交互我觉得没有必要。不过
八月 8th, 2007 at 4:25 下午
高飞你好,我也是做自动化测试的,是做通信终端产品功能自动化测试的,最近刚接触TCL,学的一头雾水,看了你的博客,觉的你对TCL了解的满多的,望你能指点指点啊。
我想在中VC调用TCL脚本并执行,一直不知道怎么做,不知你有没有这方面的经验啊。
八月 8th, 2007 at 7:02 下午
to 毕朝师:
我接触Tcl的时间也不久,对于VC调用Tcl脚本这个问题,我没有实际做过,不过这里有
八月 8th, 2007 at 10:27 下午
为什么说Expect没用呢?
做久了automation,你就会发现expect是个好东西,没有expect,几乎很多事情都作不了,正是expect把人从繁琐的手工过程中解脱出来的。呵呵
不过我搞了4年自动化测试自动化(TCL+Expect),发现对expect特别是expect_output($buffer)的认识还是十分肤浅的。
八月 9th, 2007 at 10:33 上午
to ricky:
呵呵,我不是说Expect没用,不然也不会特地买一本《Exploring Expect》来学
八月 15th, 2007 at 3:15 下午
to xugaofei 你好:请教你一个问题
例在一个list中存有02 4D 61 03 24 34 45 03这些数据,如果想把这些数据按十六进制的形式(0×02 0×4D…..)写入串口,该如何处理,请指点。
如果是写固定的一些数据利用下面一些语句就可以搞定,但是如果写的数据不固定,也就是要写的数据都存在list中,如何把这这些数据串成如“\x02\x4D…”形式然后写入串口,请你指点一下。
set a “\x02\x4D\x01\x00\x03″
set serial [open com1 RDWR]
fconfigure $serial -mode “38400,n,8,2″
fconfigure $serial -blocking 0 -buffering none
after 200
puts -nonewline $serial $a
read -nonewline $serial
八月 16th, 2007 at 8:42 下午
试一试正则表达式替换中的regsub命令,另外join命令也可能可以
三月 18th, 2009 at 3:04 下午
看你很多Tcl方面的资料,我刚开始接触Tcl 遇到一个问题 不知道你有没有遇到过.
建包的时候windows e:\tcl\bin
我想建一个package在这个目录下e:\tcl\lib\ftp2.3 http://ftp.tcl
用pkg_mkIndex 命令是总会提示当前目录无法转到e:\tcl\lib\ftp2.3 http://ftp.tcl 不知道你有没有什么好办法
三月 18th, 2009 at 4:04 下午
To Rena:
我没有遇到这种情况,你代码贴出来看看吧
三月 19th, 2009 at 9:40 上午
谢谢你这么快就回复
问题是这样的windows e: clin clsh84.exe
建一个package在这个目录下e: cllibftp2.3
用pkg_mkIndex 命令是总会提示当前目录无法转到e: cllibftp2.3 代码如下
% pkg_mkIndex ../lib/ftp2.3空格ftp.tcl
couldn’t change working directory to “../lib/ftp2.3″: no such file or directory
后来 这样就可以了 我不清楚问题出在那里
%global auto_path
%set auto_path
e:/Tcl/lib/tcl8.4 e:/Tcl/lib
%pkg_mkIndex E:/Tcl/lib/tcl8.4/ftp2.3空格ftp.tcl