昨天因?yàn)橐bwatir-webdriver的原因?qū)⒂昧丝煲荒甑膔uby1.8.6升級(jí)到了1.9。由于1.9是原生支持unicode編碼,所以我們可以使用中文進(jìn)行自動(dòng)化腳本的編寫工作。
做了簡(jiǎn)單的封裝后,我們可以實(shí)現(xiàn)如下的自動(dòng)化測(cè)試代碼。請(qǐng)注意,這些代碼是可以正確運(yùn)行并作為正式的自動(dòng)化測(cè)試用例的。這樣一來,自動(dòng)化測(cè)試腳本跟手工測(cè)試用例就非常相似了,大言不慚的說相似程度可以達(dá)到60%。
這樣做有什么好處呢?
■ 手工測(cè)試用例更加容易“翻譯”正自動(dòng)化測(cè)試用例:
測(cè)試瀏覽器 = Watir::Browser.new :firefox 測(cè)試瀏覽器.轉(zhuǎn)到 'www.google.com' 在(測(cè)試瀏覽器.的.text_field(:name, "q")).中.輸入 "qq" 點(diǎn)擊 測(cè)試瀏覽器.的.button(:name, "btnG") 等待(測(cè)試瀏覽器.的.div(:id, "resultStats")) 斷言 '測(cè)試通過' if 測(cè)試瀏覽器.的.text.包含('騰訊QQ') 關(guān)閉 測(cè)試瀏覽器 |
由于加入了符合自然語義的”的”及“在”函數(shù),整個(gè)測(cè)試用例的自然度得到大大提升,基本可以做到不熟悉自動(dòng)化代碼的人員可以大致猜測(cè)到用例的真實(shí)用例。讓用例自己說話,這比反復(fù)釋疑和解惑要好上一些;
■ 手工測(cè)試人員編寫用例的門檻相對(duì)降低:
由于代碼的靈活度及兼容性相對(duì)較大(ruby語言的特性)及測(cè)試api相對(duì)簡(jiǎn)單(watir的特性),手工測(cè)試人員應(yīng)該可以更加方便的理解和編寫代碼,這樣用例編寫的門檻降低;
■ 用例維護(hù)成本降低:
中文化的用例代碼可以很容易的進(jìn)行review。大家應(yīng)該有這樣的經(jīng)驗(yàn),在有些代碼中會(huì)出現(xiàn)一些隨意的ab, zb之類難以理解的變量或方法名。糾其原因無非是不好的編程習(xí)慣或詞窮的英文積淀。用上中文之后這些情況會(huì)有很大好轉(zhuǎn)。代碼本地化這項(xiàng)工作日本這些年一直在做,而且成果豐碩。我們完全可以通過ruby借鑒這一點(diǎn);
■ webdriver的強(qiáng)大特性
上面的測(cè)試代碼是基于watir-webdriver編寫的。由于webdriver支持多種瀏覽器,如ff,chrome,safiri,ie等,代碼的擴(kuò)展性非常強(qiáng)。在配置合理及框架支撐的前提下,基本可以做到一套腳本多瀏覽器運(yùn)行,這對(duì)回歸測(cè)試來說應(yīng)該是一個(gè)利好消息;
當(dāng)然,測(cè)試腳本中文化,自然化口語化也會(huì)帶來一些列的問題,這點(diǎn)我們也必須清楚認(rèn)識(shí)到。
1.用例編寫會(huì)相對(duì)費(fèi)時(shí)一些;中英文結(jié)合編碼在輸入速度上確實(shí)不如純英文;
2.對(duì)程序員來說上面的代碼會(huì)有些怪異或者是令人難以忍受的;對(duì)于完美主義者來說,上面的代碼是“不純粹”且有些難看的;
總結(jié)一下,個(gè)人的觀點(diǎn)如下:
對(duì)于產(chǎn)品代碼來說,中英文混編的風(fēng)格目前來說應(yīng)該是不合時(shí)宜的。但對(duì)于測(cè)試腳本來說,中文越多,用例可讀性越高,自動(dòng)化測(cè)試代碼越接近手動(dòng)用例,這反而應(yīng)該是一件不錯(cuò)的事情。這在里先拋磚引玉,希望有志同道合者可以一起研究,讓自動(dòng)化腳本更加的人性、自然、可讀、可維護(hù)。也許在不遠(yuǎn)的將來,手動(dòng)用例可以直接拿來當(dāng)自動(dòng)化用例執(zhí)行也未嘗不可能。
下面是用例的完整代碼,由于只是演示興致,因此只是隨意在Module層進(jìn)行了簡(jiǎn)單的可視化封裝,過于簡(jiǎn)陋和demo,還望磚家手下留情。
# encoding: utf-8 require 'rubygems' require 'watir-webdriver' module CWrap def 點(diǎn)擊(obj) obj.click rescue obj.class.to_s + '對(duì)象無法進(jìn)行點(diǎn)擊' end def 加載完畢() self end alias :中 :加載完畢 alias :的 :中 alias :應(yīng)該 :的 def 在(obj) obj end def 等待(obj) obj.wait_until_present rescue puts('該' + obj.class.to_s + '對(duì)象無法進(jìn)行等待操作') end def 關(guān)閉(obj) obj.close rescue puts('無法關(guān)閉這個(gè)' + obj.class.to_s + '對(duì)象') end def 輸入(text) self.set text rescue puts('這個(gè)' + self.class.to_s + '對(duì)象無法進(jìn)行輸入') end def 轉(zhuǎn)到(url) self.goto url rescue puts(self.class.to_s + '對(duì)象不是一個(gè)瀏覽器對(duì)象') end def 包含(text) self.include? text rescue puts self.class.to_s + '對(duì)象無法進(jìn)行包含操作' end def 斷言(text) puts text end end include CWrap 測(cè)試瀏覽器 = Watir::Browser.new :firefox 測(cè)試瀏覽器.轉(zhuǎn)到 'www.google.com' 在(測(cè)試瀏覽器.的.text_field(:name, "q")).中.輸入 "qq" 點(diǎn)擊 測(cè)試瀏覽器.的.button(:name, "btnG") 等待(測(cè)試瀏覽器.的.div(:id, "resultStats")) 斷言 '測(cè)試通過' if 測(cè)試瀏覽器.的.text.包含('騰訊QQ') 關(guān)閉 測(cè)試瀏覽器 |