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


    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 "

    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 "; exp_continue}

    "~# " {puts "------break----"}

    }

    意思是发送“sudo -s”命令后,有两种可能的输出,如果输出为“password:“,则执行后面所跟的”{}“中的命令,发送密码并跳出此次循环,直到输出结果为”~# “才跳出整个expect循环。另外,expect与if/else等也可循环嵌套使用。



    四、过程

    某些代码有时是需要重复操作的,比如手机在某些特定的情况下可能需要反复重启等,此时我们可以将其写在某一个过程中,直接调用该过程,以减少和简化代码。

    proc restartPhone {x} {

    if {$x == 1} {

    spawn adb shell

    expect "~# "

    send "reboot "

    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 " "

    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

  • 相关阅读:
    笨方法学python中执行argv提示ValueError: not enough values to unpack (expected 4, got 1)
    VMware workstation安装
    Redis bigkey分析
    MySQL drop table 影响及过程
    MySQL 大表硬连接删除
    ES elasticsearch 各种查询
    ES elasticsearch 各种聚合
    ES elasticsearch 聚合统计
    ES elasticsearch 实现 count单字段,分组取前多少位,以地理位置中心进行统计
    MySQL行溢出、varchar最多能存多少字符
  • 原文地址:https://www.cnblogs.com/lexus/p/5288175.html
Copyright © 2020-2023  润新知