在以前项目上根据项目的需要写了个shell的测试框架,在这里分享一下。
这个框架式用来测试一些需要人机交互的应用功能测试,在框架中集成了expect 工具来实现人机交互功能需要。
项目的大概目录结构如下:
data/
lib/python
lib/tcl
lib/sh
lib/utils_check
log/run_log
result/result
testcase/
regression.sh
start_test.sh
下面是几个核心代码文件的样例:
start_test.sh
cd /home/jason/testcase_sh
time ./regression.sh >> ./result/result
regression.sh
#!/bin/sh
Run_Dir=`pwd`
case_num=0
pass_case_num=0
fail_case_num=0
export auto_test_path=$Run_Dir
echo "auto_tes path is " $auto_test_path
find_file()
{
file_dir=$1
if [ -d $file_dir ]
then
find $file_dir |grep sh$|sort >>$Run_Dir"/data/"testcase_list
fi
}
find_testcase()
{
str_dir="`pwd`/testcases"
if [ -z "$1" ]
then
echo "run all testcase "
else
echo "run all testcase for module " $1
str_dir=$str_dir/$1
fi
find_file $str_dir
}
execute_file()
{
file_name=$1
echo "testcase_name:" $1
if [ -f $file_name ]
then
echo "" >>$Run_Dir"/log/run_log"
echo "TESTCASE:" $file_name >>$Run_Dir"/log/run_log"
if [ -n "`ls $file_name|grep py$|grep -v grep`" ]
then
echo "run a python script "
time python $file_name >>$Run_Dir"/log/run_log"
elif [ -n "`ls $file_name|grep exp$|grep -v grep`" -o -n "`ls $file_name|grep tcl$|grep -v grep`" ]
then
echo "run a tcl script "
time tcl $file_name >>$Run_Dir"/log/run_log"
else
echo "run a shell script "
time sh $file_name >>$Run_Dir"/log/run_log"
fi
fi
case_status=0
case_status_line=`grep ^Testcase $Run_Dir"/log/run_log" |tail -1`
#echo "status line:" $case_status_line
testcase_name=`echo $case_status_line|awk '{print $2}'`
#echo "testcase_name:" $testcase_name
testcase_statu=`echo $case_status_line|awk '{print $4}'`
echo "Test_status:" $testcase_statu
echo " "
echo " "
if [ -z $testcase_name -o -z $testcase_statu ]
then
#echo "test status..."
case_status=1
elif [ `echo $testcase_statu | awk '{printf("%d\n", match($0,"FAIL"));}'` -ne 0 ]
then
#echo "test status "
case_status=1
fi
#get some useful information according to the project
echo "**********detail result log**************" >> $Run_Dir"/log/run_log"
grep ^/ out |grep -v Welcome>> $Run_Dir"/log/run_log"
echo " " >> $Run_Dir"/log/run_log "
}
Output_print(){
Time=`date '+%Y-%m-%d %H:%M'`
str_line=`uname -a`
Machine=`echo $str_line|awk '{print $2}'`
OS=`echo $str_line|awk '{print $1" "$3}'`
echo " ===============The result of Regression testing for Delica Project============">>$Run_Dir"/result/result"
echo " Test set : "$1 >>$Run_Dir"/result/result"
echo " Machine : "$Machine >>$Run_Dir"/result/result"
echo " OS : "$OS >>$Run_Dir"/result/result"
echo " Time : "$Time >>$Run_Dir"/result/result"
echo " ==============================================================================">>$Run_Dir"/result/result"
echo " ">>$Run_Dir"/result/result"
echo " ">>$Run_Dir"/result/result"
}
#initial log and execute list
testcase_list=$Run_Dir"/data/testcase_list"
>$testcase_list
testcase_log=$Run_Dir"/log/run_log"
>$testcase_log
>$Run_Dir"/result/result"
if [ -z $1 ]
then
Output_print "ALL"
else
Output_print $1
fi
find_testcase $1
if [ -s $testcase_list ]
then
for line in `cat $testcase_list`
do
if [ "$line" == "" ]
then
echo "don't find any file "
exit 0
fi
if [ -f $line ]
then
#echo "file : "$line
execute_file $line
case_num=`expr $case_num + 1`
#echo "testcase name is " $testcase_name "status is " $case_status
if [ $case_status -eq 0 ]
then
pass_case_num=`expr $pass_case_num + 1`
else
fail_case_num=`expr $fail_case_num + 1`
fi
fi
done
else
echo "don't find any file to execute"
fi
echo "There are "$case_num" testcase be run"
echo "----------PASS CASE: "$pass_case_num
echo "--------- FAIL CASE: "$fail_case_num
echo " "
echo " "
echo " "
echo "================================Detail Information============================ "
cat log/run_log
./lib/python/mail1.py
run_cmd.exp
#!/tools/bin/expect
set workPath "/home/jason/080811";
set file "$workPath/file";
set file1 "$workPath/file1";
set master [lindex $argv 0];
set master_port [lindex $argv 1];
set dataserver_port [lindex $argv 2];
set cmds [lindex $argv 3] ;
set i 0;
puts "this is insid test"
puts $cmds ;
#puts [llength $cmds];
set timeout 300 ;
spawn $workPath/src/test/DelicaTest -s $master -p $master_port -q $dataserver_port ;
# mkdir
set i 0 ;
set j [llength $cmds];
while {$i<=$j} {
expect "$" {send "[lindex $cmds $i]\n"};
incr i
}
expect "$" {send "quit\n"}
expect eof