TCL/Expect交互式自动化测试概要 - - ITeye技术网站
TCL/Expect交互式自动化测试概要 - - ITeye技术网站
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”回车即可
OpenLDAP安装、错误解决及Python下的LDAP认证 | ACGso
TCL/Expect交互式自动化测试概要 - - ITeye技术网站的更多相关文章
- iBATIS 3 试用手记 - The FUTURE - ITeye技术网站
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站
总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站 极分享:高质分享+专业互助=没有难做的软件+没有不得已的加班 极分享:高质分享+专业互助=没有 ...
- 阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房) - agapple - ITeye技术网站
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房) - agapple - ITeye技术网站 阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
- Mysql 官方Memcached 插件初步试用感受 - schweigen - ITeye技术网站
Mysql 官方Memcached 插件初步试用感受 - schweigen - ITeye技术网站 Mysql 官方Memcached 插件初步试用感受
- python 内存泄露的诊断 - 独立思考 - ITeye技术网站
python 内存泄露的诊断 - 独立思考 - ITeye技术网站 python 内存泄露的诊断 博客分类: 编程语言: Python Python多线程Blog.net 对于一个用 python ...
- http_load安装与测试参数分析 - 追求自由自在的编程 - ITeye技术网站
http_load安装与测试参数分析 - 追求自由自在的编程 - ITeye技术网站 http_load -p 50 -s 120 urls
- ibatis参数传递小技巧 - 疯狂的菠菜 - ITeye技术网站
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- JAVA中浅复制与深复制 - coolmist - ITeye技术网站
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- Apache Shiro 使用手册(一)Shiro架构介绍 - kdboy - ITeye技术网站
转载 原文地址 http://kdboy.iteye.com/blog/1154644 一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理 ...
随机推荐
- 转ATL对象类型
http://hi.baidu.com/rural_child/item/d91ce5d8fba9c8e73cc2cbf9 1.Objects a.Simple Object:用于实现业务逻辑,无用户 ...
- Django admin site(二)ModelAdmin methods
ModelAdmin methods save_model(request, obj, form, change) 此方法为admin界面用户保存model实例时的行为.request为HttpReq ...
- Spring Data JPA教程, 第三部分: Custom Queries with Query Methods(翻译)
在本人的Spring Data JPA教程的第二部分描述了如何用Spring Data JPA创建一个简单的CRUD应用,本博文将描述如何在Spring Data JPA中使用query方法创建自定义 ...
- JVM学习笔记(一)------基本结构
从Java平台的逻辑结构上来看,我们可以从下图来了解JVM: 从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别 对于JVM自身的物理结构,我们可以从下图鸟瞰一下: 对于J ...
- [Codeforces137B]Permutation(贪心?思路?,水题)
题目链接:http://codeforces.com/contest/137/problem/B 给n个数字,要求修改成1~n的全排列数中的一个,修改的次数尽可能少,问最少需要修改几个数. 记下数组里 ...
- sublime安装插件
今天因为某些原因,把 sublime 卸载掉了,然后来安装的时候,发现 Package Control 无法安装了,或者安装好后运行 ctrl + shift + p,会报 错误,截图如下: 然后就 ...
- 转载:Unobtrusive JavaScript in ASP.NET MVC 3 隐式的脚本在MVC3
Unobtrusive JavaScript 是什么? <!--以下是常规Javascript下写出来的Ajax--> <div id="test"> &l ...
- UVALive 4043 Ants(二分图完美匹配)
题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠.现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求.输出的第 i 行表示第 i 个蚁群 ...
- WPF如何在同一个区域依次叠加显示多张图片呢?
正如标题的问题,有时需要在已显示的图片的右上角(或其他区域)显示小图标,譬如下图的患者头像右上角显示病情图标:(这里不采用事先用PS编排成一个图片文件的方式,因为此方式普适性不好) 解决方案:绘制该复 ...
- 构建属于自己的ORM框架之二--IQueryable的奥秘
上篇文章标题乱起,被吐槽了,这次学乖了. 上篇文章中介绍了如何解析Expression生成对应的SQL语句,以及IQueryable的一些概念,以及我们所搭建的框架的思想等.但还没把它们结合并应用起来 ...