利用腳本測試程序
注:本文原本相關代碼可以在github gist找到,鏈接。如果想要文件形式的,我也上傳了一份到CSDN(不知道爲啥不能設置免積分下載),鏈接
前言:最近第一次作業,用殘酷的事實告訴了我測試的重要性。平時測試的時候,經常自己一個個情況測,每測一次都要重新輸入一次,費時費力效果差,所以下定決心學一下如何利用腳本進行簡單的程序測試,下面記錄一下一下用到的語法。
基本概念
以Mac爲例,新建一個腳本的基本流程爲
- 新建腳本文件(後綴爲sh)
touch script.sh
- 打開並修改腳本文件
open script.sh
oremacs -nw script.sh
- 修改腳本文件的權限
chmod +x script.sh
注意事項:
- 腳本是對空格敏感的,如
a="Hello World"
是合法的(聲明瞭一個變量),而a = "Hello World"
是不合法的(等號兩邊多了一個空格)
輸出一段話
- 利用
echo
向屏幕輸出一段話
向控制檯輸出Hello World
echo Hello World
變量
- 利用
$
符號引用一個變量
利用一個變量,向控制檯輸出Hello World
a="Hello World"
echo $a
變量運算
修改一個變量的值(4種方法)
let i+=1;
((i++));
i=$[$i+1];
i=$(($i+1))
變量輸出格式控制
- 可以通過printf來控制變量輸出的格式(如固定5位,多餘的補0)
- 還可以將printf的結果保存到一個變量內方便使用
# printf in binary
printf "%05d\n" `echo "obase=2;$var" | bc`
# printf in decimal
printf "%05d" "$var")
# store the result of printf into a variable
var=$(printf "%05d\n" `echo "obase=2;$var" | bc`);
echo $var
從命令行讀入指令
- 利用
read
指令從命令行讀入數據(保存在一個變量內)
從命令行讀入一個字符串,並原樣輸出
read readAll
echo you enter $readAll
循環(for)
- 注意for循環有兩層括號
- 要打引號
;
循環向控制檯輸出 30 個 Hello World
for((i=0;i<30;i++));
do
echo Hello World $i
done
數組
- 利用括號聲明一個數組,數組元素之間用空格隔開
- 利用
${list[index]}
訪問數組元素
將整個數組輸出到命令行
story_list=(hello0 hello1 hello2)
for((i=0;i<3;i++));
do
echo ${story_list[$i]}
done
for i in {0..3};
do
echo ${story_list[$i]}
done
條件判斷(if-else)
- 條件判斷需要兩個中括號
- 用
then
和fi
來表示if-else的範圍
讀入一個字符,並作出判斷
echo "do you...?(y/n):"
read readAll
if [[ $readAll = "y" ]]; then
echo yes
else
echo "no"
fi
讀取文件
cat
指令:以文本形式輸出文件內容
逐行讀取並輸出文件內容
cat filename.txt | while read line
do
echo $line
done
寫入文件
- 利用插入符
>>
寫入文件 - 利用
$FILE
來指定某個文件
打開一個文件,寫入一個變量和一串字符
a="Hello world"
FILE="./filename.txt"
echo $a >> $FILE
echo "----------------------" >> $FILE
簡單的運行一個可執行程序
- rand_story 是一個編譯好的可執行程序,story.txt,words.txt和3是這個程序接受的三個輸入參數
運行程序rand_story
./rand_story story.txt words.txt 3
將可執行程序的輸出寫入到文件內
- 注意第一行用的是 ` 而不是單引號 ’
運行程序rand_story,並將程序輸出寫入到指定文件
cmd=`./rand_story story.txt words.txt 3`
a=${cmd}
FILE="./output.txt"
echo "$a" >> $FILE
簡易版自動化測試腳本
- 利用循環更改數字類參數
- 利用循環 + 數組更改字符串類參數
- 將所有結果寫入.txt文件
# file name
FILE="./output.txt"
# clear the file content
echo "" > $FILE
echo "-----------test start-----------" >> $FILE
# modify number parameter
for i in {0..30};
do
echo =====testcase $i===== >> $FILE
cmd=`./rand_story story.txt words.txt $i`
a=${cmd}
echo $a >> $FILE
done
story_list=(story.txt story1.txt story2.txt)
# modify string parameter
for i in {0..2};
do
echo =====testcase $i===== >> $FILE
cmd=`./rand_story ${story_list[$i]} words.txt 1`
a=${cmd}
echo $a >> $FILE
done