在我還沒正規接觸過自動化相關的測試時,一直沒有使用過腳本語言,都是偏C和C++較多,當我在第一個項目接觸了TCL之後,發現這個腳本語言雖然不是太多人用,但是非常實用而且很方便.(由於剛開博,所以東西比較少,後續發技術相關的會更細節些)
個人總結我工作中實用腳本語言處理的幾個任務:處理文本,I/O輸入輸出,正則表達式,數據匹配,和內嵌html網頁語言.
第一個處理文本是tcl的強項,他能夠通過seek關鍵來獲取你的文本光標所在的位置,可以對你想要的部分進行處理.用得最多的地方就是取你想要的日誌.執行動作前獲取光標的位置,執行動作後再一次獲取光標位置,然後就可以把其中這2個位置之間的信息拷貝出來,進行日誌分析.相關指令:
可以使用seek命令來改變文件的訪問點:
seek fileId offset ?origin? 把fileId標識的文件的訪問點設置爲相對於origin偏移量爲offset的位置。origin可以是start,current,end,默認是start。命令的返回值是一空字符串。
例如:seek fileId 2000 改變fieleId標識的文件訪問點,以便下次讀寫開始於文件的第2000個字節。
seek的第三個參數說明偏移量從哪開始計算。第三個參數必爲start,current或end中的一個。start是默認值:即偏移量是相對文件開始處計算。current是偏移量從當前訪問位置計算。end是偏移量從文件尾開始計算。
tell fileId 返回fileId標識的文件的當前訪問位置。
eof fileId 如果到達fileId標識的文件的末尾返回1,否則返回0。
處理文本中,tcl還有個強大的打開文件功能,這裏我們經常用來記錄日誌是非常不錯的:
下面介紹上述過程中用到的幾個基本的文件輸入輸出命令。
open name?access?
open命令以access方式打開文件name。返回供其他命令(gets,close等)使用的文件標識。如果name的第一個字符是“|”,管道命令被觸發,而不是打開文件。
文件的打開方式和我們熟悉的C語言類似,有以下方式:
r 只讀方式打開。文件必須已經存在。這是默認方式。
r+ 讀寫方式打開,文件必須已經存在。
w 只寫方式打開文件,如果文件存在則清空文件內容,否則創建一新的空文件。
w+ 讀寫方式打開文件,如文件存在則清空文件內容,否則創建新的空文件。
a 只寫方式打開文件,文件必須存在,並把指針指向文件尾。
a+ 讀寫方式打開文件,並把指針指向文件尾。如文件不存在,創建新的空文件。
而下面所說的I/O輸入輸出,大家要弄清楚一個理念,無論是執行進程,執行telnet,執行文本處理,都要有通道的概念,把一切讀寫的東西都歸類爲一種東西,這樣你就更好的處理以下的東西了,所以大家需要掌握的就很簡單了:put,read,after…..然後注意封裝每個不同情況的處理就行了。
正則表達式和數據匹配大多用來判斷結果和作爲比較語句用比較多,給一個建議,能儘量不用正則表達式就不用,因爲對於測試腳本來說,他的風險相對較大,一般情況下儘量用string:
string命令的語法:string option arg?arg...?
string命令具有強大的操作字符串的功能,其中的option選項多達20個。下面介紹其中常用的部分。
1.1.1 stringcompare ?-nocase? ?-length int? string1 string2
把字符串string1和string2進行比較,返回值爲-1、0或1,分別對應string1小於、等於或大於string2。如果有-length參數,那麼只比較前int個字符,如果int爲負數,那麼這個參數被忽略。如果有-nocase參數,那麼比較時不區分大小寫。
1.1.2 string equal ?-nocase? ?-length int?string1string2
把字符串string1和string2進行比較,如果兩者相同,返回值爲1,否則返回0。其他參數與8.5.1同。
1.1.3 string firststring1string2?startindex?
在string2中從頭查找與string1匹配的字符序列,如果找到,那麼就返回匹配的第一個字母所在的位置(0-based)。如果沒有找到,那麼返回-1。如果給出了startindex變量,那麼將從startindex處開始查找。例如:
% string first ab defabc
3
% string first ab defabc 4
-1
1.1.4 string indexstringcharIndex
返回string中第charIndex個字符(0-based)。charIndex可以是下面的值:
整數n:字符串中第n個字符(0-based)
end :最後一個字符
end-整數n:倒數第n個字符。string index "abcd" end-1返回字符'c'
如果charIndex小於0,或者大於字符串string的長度,那麼返回空。
例如:
% string index abcdef 2
c
% string index abcdef end-2
d
1.1.5 string last string1 string2 ?startindex?
參照8.5.3.唯一的區別是從後往前查找
1.1.6 string length string
返回字符串string的長度.
1.1.7 stringmatch ?-nocase?patternstring
如果pattern匹配string,那麼返回1,否則返回0.如果有-nocase參數,那麼就不區分大小寫.
在pattern中可以使用通配符:
* 匹配string中的任意長的任意字符串,包括空字符串.
? 匹配string中任意單個字符
[chars] 匹配字符集合chars中給出的任意字符,其中可以使用A-Z這種形式
\x 匹配單個字符x,使用'\'是爲了讓x可以爲字符*,-,[,].
例子:
% string match * abcdef
1
% string match a* abcdef
1
string match a?cdef abcdef
1
% string match {a[b-f]cdef} abcdef //注意一定藥用'{',否則TCL解釋器會把b-f當作命令名
1 //從而導致錯誤
% string match {a[b-f]cdef} accdef
1
1.1.8 string range stringfirst last
返回字符串string中從第first個到第last個字符的子字符串(0-based)。如果first<0,那麼first被看作0,如果last大於或等於字符串的長度,那麼last被看作end,如果first比last大,那麼返回空。
1.1.9 string repeat string count
返回值爲:重複了string字符串count次的字符串。例如:
% string repeat "abc" 2
abcabc
1.1.10string replace string first last?newstring?
返回值爲:從字符串string中刪除了第first到第last個字符(0-based)的字符串,如果給出了newstring變量,那麼就用newstring替換從第first到第last個字符。如果first<0,那麼first被看作0,如果last大於或等於字符串的長度,那麼last被看作end,如果first比last大或者大於字符串string的長度或者last小於0,那麼原封不動的返回string。
1.1.11string tolower string ?first? ?last?
返回值爲:把字符串string轉換成小寫後的字符串,如果給出了first和last變量,就只轉換first和last之間的字符。
1.1.12string toupper string ?first? ?last?
同8.5.11。轉換成大寫。
1.1.13string trim string ?chars?
返回值爲:從string字符串的首尾刪除掉了字符集合chars中的字符後的字符串。如果沒有給出chars,那麼將刪除掉spaces、tabs、newlines、carriage returns這些字符。例如:
% string trim "abcde" {a d e}
bc
% string trim " def
> "
def
1.1.14string trimleft string?chars?
同8.5.13。不過只刪除左邊的字符。
1.1.15string trimright string ?chars?
同8.5.13。不過只刪除右邊的字符。
最後總結:本人第一次能夠完全做測試持續集成的過程包括:自動化檢測安裝包,自動拷貝和卸載安裝,自動執行很多用例,自動出結果,把失敗用例郵件發給各個關注的人都是全自動每日定時跑的,其中90%都是用tcl完成,雖然只是項目的代碼實施者,但是後續有機會把tcl用在新的項目中,試着作爲架構搭建的角色完成一個自動化項目,還是一個不錯的腳本後盾。