现在的位置: 首页 > 综合 > 正文

TCL/EXPECT自动化测试脚本实例二 — 主程序

2013年02月13日 ⁄ 综合 ⁄ 共 3382字 ⁄ 字号 评论关闭
现在介绍一下测试主程序: test.exp。
为了方便加入新的测试项目,主程序采用了一种灵活的机制,它根据需要通过source命令调用相应的子测试程序。这样一来,每个测试点都可以单独放到一个文件中,然后被主程序引用。
先看一下代码:

#! /usr/bin/expect --

# $Id$
# Usage:
#    ./test [-uuser] [-ppassward] [-iip_address]  test_001 ...
# or ./test [-uuser] [-ppassward] [-iip_address] [-ccommand_file] cmd
# or ./test [-uuser] [-ppassward] [-iip_address] [-sscript_file] script

source global.exp
source commonLib.exp

# initialize variables
set cmdFile ""
set tList $argv
set execScript ""

# process options
set endOptIndex -1
foreach arg $argv {
    if {![string match "-/[a-zA-Z]*" $arg]} {
        break
    }

    # inc end option index
    incr endOptIndex

    # get option flag and option value
    set optFlg [string range $arg 1 1]
    set optVal [string range $arg 2 end]
    dbgLog "$optFlg $optVal"
    if {$optVal == ""} {
        dbgLog "option value is null: -$optFlg"
        return -1
    }

    switch $optFlg {
        "u" {
            set g_user $optVal
            dbgLog "user: $g_user"
        }
        "p" {
            set g_passwd $optVal
            dbgLog "password: $g_passwd"
        }
        "i" {
            set g_devip $optVal
            dbgLog "devip: $g_devip"
        }
        "c" {
            set cmdFile $optVal
            dbgLog "cmdFile: $cmdFile"
        }
        "s" {
            set execScript $optVal
            dbgLog "execScript: $execScript"
        }
        default {
            puts "unknown option: -$optFlg"
            return -1
        }
    } ;# end switch
} ;# end foreach

# remove options from list
if {$endOptIndex != -1} {
    set tList [lreplace $argv 0 $endOptIndex]
}

dbgLog "tList is: $tList"

# create log dir
if { !

|| ! } {
    puts "please create directory /"log/""
    return -1
}

# read current time
set clicks [clock clicks]
set tstr [clock format $clicks -format "%y%m%d%I%M%S"]

# open log file
log_file "log/vLog$tstr.log"

# open brief log file
set g_bLogFd [open "log/bLog.log" w]

# start testing
foreach tItem $tList {
    switch $tItem {
        "sys_001" { ;# test group sys_001
            source snmp.exp
        }
        "cmd" { ;# exec cmd file
            source tCmd.exp
        }
        "script" { ;# exec script file
            if {$execScript == ""} {
                puts "Please specify script name using -s option"
                return -1
            }
            source $execScript
        }

        default {
            puts "do you want to test /"$tItem/"/?"
        }
    }
}

close $g_bLogFd

在程序开始,通过source导入两个文件,其中global.exp中主要存放了一些全局变量的定义,因为这些全局变量对每台测试设备可能各不相同,所以把它们提取出来。commonLib.exp文件中存放着一些通用子程序,可供各测试程序调用。我们前面介绍过的login子程序,就放在此文件中。
接下来,分析命令行参数,首先提取出所有的选项参数,目前支持的命令行选项包括:
-u :此选项用来更改登录的用户名
-p :此选项用来更改登录的密码
-i :此选项用来更改telnet的IP地址
-c :此选项用来指明批处理文件的文件名,用法在后面描述
-s :此选项用来指明脚本文件的文件名,用法在后面描述

最后,命令行参数中所有非选项的部分,都被做为测试项,分别对这些测试项进行测试。
例如测试项test_001,会使用source命令调用snmp.exp脚本,进行snmp community方面的测试。
可以根据需要自行添加测试项目。

有两个特别的测试项名称,分别为cmd和script。
cmd测试项,会调用cmd.exp脚本,这个脚本在后面介绍,它的主要功能是执行一个文本文件里的所有命令。文本文件名由-c选项提供。
script测试项,它会调用source命令,执行$execScript脚本。可以使用-s选项为$execScript变量赋值。

这个测试脚本提供了两种日志,一种是详细的日志(vLog*),包括了telnet的所有交互过程;另外一种是简单的日志,只包含程序中使用errLog输出的信息。日志文件被放在子目录log中,其文件名中包含了脚本执行的时间,方便查找。
本脚本中使用dbgLog,以及以后将用到的errLog,都是定义在commonLib.exp文件中的子函数,代码如下:

#************************************************
# debug output routine
#
# @PARAMS
# arg - variable length arguments
#************************************************
proc dbgLog arg {
    global g_dbgFlag

    if {$g_dbgFlag} {
        puts $arg
    }
}

#************************************************
# error output routine
#
# @PARAMS
# arg - variable length arguments
#************************************************
proc errLog arg {
    global g_bLogFd
    global g_dbgFlag

    if {$g_dbgFlag} {
        puts $arg
    }

    if { $g_bLogFd != 0 } {
        puts $g_bLogFd $arg
    }
}

抱歉!评论已关闭.