`
lhq1013
  • 浏览: 87535 次
  • 性别: Icon_minigender_2
  • 来自: 丽水
社区版块
存档分类
最新评论

TCL/Expect交互式自动化测试概要

阅读更多
expect是一种基于TCL,能与交互式程序进行“可程序化”会话的脚本语言,是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。
expect由一系列expect-send对组成:expect等待输出中输出特定的字符,然后发送特定的响应。
安装expect:sudo apt-get install expect
expect相关软件包版本有多个,如expect-tcl8.3、expectk、expect-dev等,可根据自身需求选择安装。
(文中涉及的例子请参考 http://lhq1013.iteye.com/blog/907759)

一、示例:
#!/usr/bin/expect
spawn sudo -s
expect "password: "
send "vmkid\r"
expect "~# "
expect eof
解释:首行“#!“声明此为expect脚本,具有可执行权限,路径需正确指明Expect解释程序的位置。
“spawn"该命令用来来启动脚本和命令的会话,这里启动的是sudo命令,实际上命令是以衍生子进程的方式来运行的。
“expect"对执行command后的输出进行匹配检测,可使用正则表达式和通配符等。
“send”用例发送command。
“expect eof"检测到文件结尾,退出。

二、语法与需注意的点
脚本都有相似之处,Expect是基于TCL的,有以下几个地方需要注意:
1)“{”与前面的字符必须空一格,否则会被解释器认为是与前面字符是同一个词。
2)一条命令结尾的“;”是可有可无的,但如果同一行写来多条命令,则必须以“;”分隔,否则会被误认为只有一条命令。
3)expect检测的双引号中的字符串,若有多行,除前引号后面的那行外,其余的均需要顶格写,否则空格也会被匹配进去,或者前面用通配符“*”来匹配也行。
4)如果发现脚本挂在了某个点上,可以试着在前一个send前面增加一小会儿sleep时间。因为在提到提示后,一系列的程序(rn, ksh,zsh,telnet,etc.)和设备抛弃或忽略的按键等响应的“太快”了。
5)某些程序每次产生的结果都是不一样的,此时最好用通配符来匹配。

三、流程控制
expect既然是“分支和嵌套结构”的,那么它必须提供相应的功能。除了基于TCL的if/else等条件判断外,其自身也提供来expect流程控制的功能,示例如下:
send "sudo -s"
expect {"password: " {send "vmkid\r"; exp_continue}
"~# " {puts "------break----"}
}
意思是发送“sudo -s”命令后,有两种可能的输出,如果输出为“password:“,则执行后面所跟的”{}“中的命令,发送密码并跳出此次循环,直到输出结果为”~# “才跳出整个expect循环。另外,expect与if/else等也可循环嵌套使用。

四、过程
某些代码有时是需要重复操作的,比如手机在某些特定的情况下可能需要反复重启等,此时我们可以将其写在某一个过程中,直接调用该过程,以减少和简化代码。
proc restartPhone {x} {
if {$x == 1} {
spawn adb shell
expect "~# "
send "reboot\r"
expect "*"
} else {

}
}
如上,在需求重启手机时,我们只要调用”restartPhone 1"便可以了。

五、list
测试过程中,往往需要顺序执行多个测试计划,逐一写的话,用例一多就较为麻烦且不便于管理,在java中对此我们常用for循环读取数组等方式来进行,tcl也可以,但tcl中用数组相较于java来说稍显麻烦,需要分别指定数组下标进行赋值,数组大小与下标没有必然关系,故本人选择了list来协作for来完成这一任务。示例如下:
set a {Java VM Performance Android}
for {set i [expr [llength $a] - 1]} {$i >= 0} {incr i -1}  {
set b "start --plan "
lappend b [lindex $a $i]
send $b
send "\r"
expect "Test summary:*pass*fail*timeOut*omitted*notExecuted*Total"
sleep 10
}
解释:set arg value:将“{}”中的所有值赋给a,a是列表变量,列表中的每个值以空格隔开。
$a:变量置换,若a在之前以及被赋值,则可以用“$“加上变量名来调用。
incr:递增,上例中意思为每循环一次,就对变量i递增(-1)。
set i [expr 1+2+$x]:命令置换,由[]括起来的TCL命令及参数,会倒置某一命令的所有或部分单词被另一个命令的结构代替,可嵌套使用。如:若x的值为3,则输出结果为6。
lappend varname value? value……?:将value作为一个元素附加到变量varname后面:如:set a 1;lappend a 2,其输出结果为12。
lindex list index:返回list的第index个元素。如:lindex {10 9 8 7 6} 2,其返回结果为8。
sleep 10:睡眠10秒钟。

六、timeout
expect的timeout时间, 是以秒为单位, 如果设置为0, 是根本就不等待, 设置为-1, 是永远等待.
set timeout 30

七、match_max
expect patlist1 action1 patlist2 action2..... 
该命令一直等到当前进程的输出和以上的某一个模式相匹配,或者等到时间超过一个特定的时间长度,或者等到遇到了文件的结束为止
每一个patlist都由一个模式或者模式的表(lists)组成。如果有一个模式匹配成功,相应的action就被执行。执行的结果从expect返回。被精确匹配的字符串(或者当超时发生时,已经读取但未进行匹配的字符串)被存贮在变量expect_match里面。模式必须匹配当前进程的从上一个expect或者interact开始的所有输出(所以统配符*使用的非常)的普遍。但是,一旦输出超过2000个字节(默认值),前面的字符就会被忘记,这可以通过设定match_max的值来改变。
set match_max 3500

八、参数
1)#!/usr/bin/expect -f
-f  参数指定从哪个文件中读取命令。当被用在#!指示(见上)中时此参数是可选的,所以其它参数可在命令行中提供。
-i  参数使expect交互地提示输入命令,而不是从文件中读命令。命令提示行通过exit命令或一个eof字符结束。
2)expect [[-opts] pat1 body1] ... [-opts] patn [bodyn]
-re  强制string按regexp模式解释。
-nocase  使输出中的大写字符也按小写字符匹配。

更多参数的使用,参见man expect。


九、autoexpect
autoexpect是Expect的一个工具,可以帮助你很快地生成script。但缺点是自动生成的脚本通用性不强,采用的是完全匹配,需要自行做修改,且布局也比较凌乱,最好也是手工修改下。
安装:sudo apt-get install expect-dev
Expect开发版本5.44.1.15-1,此版本中已经包含了autoexpect这一工具,较低的版本可能不包含此功能,可在系统——>系统管理——>新立得软件包管理器中查看相关信息。
启动autoexpect的方式大致有如下几种:
1)终端输入“autoexpect”回车启动并开始录制,默认会在当前目录下产生名为script.exp的脚本,
2)autoexpect后面直接跟命令语句启动
如autoexpect ssh tester@10.5.176.86
3)启动时指定脚本的名字
autoexpect -f name.exp
退出录制只需在终端输入“exit”回车即可。
1
0
分享到:
评论

相关推荐

    #!/usr/bin/expect

    Expect 还可以与其他工具结合使用,如Ansible的`shell`模块配合`expect`模块来处理需要交互的场景,或者在CI/CD流程中进行自动化测试。 5. **注意事项**: - 安全性:尽管 Expect 脚本能提高效率,但存储明文密码...

    expect交互式执行网络命令

    expect实现 shell 交互式网络命令,插件安装: tar xzvf expect5.45.tar.gz cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-...ln -s /usr/tcl/bin/expect /usr/expect/bin/expect

    Tcl/Expect

    Tcl/Expect学习心得:等待操作是很有用的及COM通讯脚本

    TCL_Expect_deja.zip_Exploring.Expect.pdf_deja gnu_tcl_tcl语言_自动化测

    Expect库是TCL中的一个强大工具,专为自动化交互式程序设计而生。它允许脚本模拟终端会话,自动处理预期的输出,然后根据预期的结果作出反应。这对于自动化测试网络服务、Unix命令行工具或者任何需要用户输入响应的...

    Tcl/tk 宝典之一 - Expect讲解

    通过使用Expect,用户可以模拟人类与系统的交互过程,实现对各种应用程序或服务的自动化测试和管理。 #### 二、Expect中的关键命令 在Expect中,有几个核心命令是必不可少的,包括`spawn`、`expect`和`exp_send`。...

    expect5.43.0和tcl8.4.11.zip

    `Expect`是建立在`TCL`基础上的一个扩展,专为自动交互式应用程序设计,如SSH、telnet等。` Expect5.43.0`和`TCL8.4.11`是这两个工具的特定版本,它们可能包含了对某些功能的优化和改进。 首先,`TCL(Tool Command...

    tcl.rar_.tcl_tcl_tcl tk_tcl/tk_tcl_tk

    8. **应用领域**:TCL/TK不仅用于快速开发小型GUI应用,还在网络管理、科学计算、自动化测试等领域有广泛应用,例如 Expect工具用于自动应答终端交互。 在压缩包内的文件“tcl”可能是包含这些示例代码的脚本文件,...

    Tcl.And.Tk.rar_tcl/tk

    Tcl/Tk社区提供了丰富的扩展和库,如Tkinter(Python的GUI库,基于Tk)、Expect(用于自动化交互式程序)、BLT(扩展图形和图表功能)等,这些扩展进一步增强了Tcl/Tk的功能和适用性。 **学习资源** 这个“Tcl.And...

    tcl864安装包

    tcl脚本语言安装包,要安装expect脚本,必须先安装tcl。 一)Tcl 安装 ... 下载地址: http://www.tcl.tk/software/tcltk/downloadnow84.tml 1.下载源码包 ...ln -s /usr/tcl/bin/expect /usr/expect/bin/expect

    Tcl/expect sms gateway-开源

    - Expect是Tcl的一个扩展,专门用于自动化交互式程序,如telnet、ssh、ftp等。它通过匹配模式来响应程序的输出,从而实现自动化控制。 - 在SMS网关中,Expect库用于模拟用户与短信服务提供商的交互,例如登录、...

    expect交互式ssh登陆交换机实现自动备份

    bash 调用expect ssh到cisco设备,通过tftp方式备份配置 已经测试通过,并上到生产服务器 前提要先架设好TFTP服务器并测试通过

    tcl-expect

    Expect是由Don Libes开发的一个基于TCL的自动化测试工具,用于自动交互式程序。Expect可以用来模拟终端用户的操作,从而实现自动化测试、配置管理等任务。 **特点概述:** - **TCL扩展**:Expect是作为TCL的一个...

    tcl和expect配置.zip

    接下来,Expect是基于TCL的扩展,主要用于自动化交互式应用程序,如telnet、ftp、passwd等。Expect由Don Libes在1993年开发,它通过模拟用户输入并响应程序输出,使得脚本能够自动控制这些程序的流程。 Expect5.45.4...

    expect5.43.0_tcl8.4.11.zip

    Expect是一个由Dennis Rylands开发的开源工具,它基于TCL语言,专门设计用来自动化与交互式程序的通信。在许多场景下,例如SSH登录、脚本自动化测试、系统管理等,我们可能需要模拟用户输入来与程序进行交互。Expect...

    Tcl.rar_scripting_tcl/tk_脚本 解释

    2. **测试脚本**:在软件开发中,Tcl被广泛用于编写测试脚本,例如在自动化测试框架如Expect中,Tcl用于模拟用户与程序的交互。 3. **教学和研究**:由于其简洁性和易于理解,Tcl常被用于计算机科学的教学和科学...

    经典的Tcl/tk的学习教程

    6. **模块和扩展**:Tcl有一个庞大的第三方模块库,如Tkinter(Python中的Tk接口)、Expect(自动化交互式程序)等,学习如何利用这些扩展增强功能。 7. **脚本编写和程序设计**:如何组织代码,编写清晰、可维护的...

    linux下tcl和expect安装说明及安装包

    在Linux环境中,TCL(Tool Command Language)和Expect是两种非常实用的脚本语言,尤其在自动化测试、系统管理以及远程服务器交互等方面有着广泛的应用。本文将详细介绍如何在Linux系统中安装TCL和Expect,同时提供...

    针对linux服务器交互式自动化脚本实现与研究.pdf

    "Linux服务器交互式自动化脚本实现与研究" 本文主要介绍了在Linux服务器集群之间实现无密码...通过 Expect 实现无密码登录的自动化,提高服务器之间的交互式自动化,减少人工的干预,提高服务器之间的安全性和可靠性。

    expect5.43 + tcl8.4.11

    Expect 是一个由 Don Libes 创建的Unix/Linux环境下的程序,它扩展了Tcl语言,主要用于自动化交互式任务。 Expect 的主要功能是模拟用户与命令行或终端的交互,比如登录系统、执行命令、响应提示等。通过编写Expect...

Global site tag (gtag.js) - Google Analytics