如何進(jìn)行自動(dòng)化測(cè)試和手工測(cè)試
首先抽象地描述一下項(xiàng)目背景,這個(gè)項(xiàng)目是一個(gè)面向消費(fèi)者的Web系統(tǒng)(以下簡(jiǎn)稱(chēng)系統(tǒng)A)。用戶訪問(wèn)系統(tǒng)A,輸入數(shù)據(jù),系統(tǒng)A 接收數(shù)據(jù),然后調(diào)用系統(tǒng)B 的REST接口返回處理過(guò)的數(shù)據(jù)給用戶。其中系統(tǒng)B 是由另一個(gè)團(tuán)隊(duì)開(kāi)發(fā)和維護(hù)的。描述地夠抽象的吧,不過(guò)你可以想象,比如一個(gè)電商網(wǎng)站。
該項(xiàng)目采用Java,框架是Spring,構(gòu)建工具是Maven,技術(shù)不算很新啦。
好了,要說(shuō)到自動(dòng)化測(cè)試,肯定得先說(shuō)說(shuō)我們是如何按照需求進(jìn)行開(kāi)發(fā)的。
首先,我們不是按照一份全面的12頁(yè)的需求說(shuō)明文檔來(lái)開(kāi)發(fā),那樣的話,無(wú)休止的前期的設(shè)計(jì)討論會(huì)、數(shù)據(jù)庫(kù)設(shè)計(jì)、代碼框架設(shè)計(jì)、架構(gòu)討論會(huì),再加上編碼和測(cè)試的時(shí)間,等全部功能都開(kāi)發(fā)出來(lái)都已經(jīng)是一個(gè)月以后了。對(duì)我們這個(gè)面向消費(fèi)者的互聯(lián)網(wǎng)應(yīng)用來(lái)說(shuō),一個(gè)月太長(zhǎng)了。等到一個(gè)月以后,這些一個(gè)月以前收集的需求和實(shí)現(xiàn)的功能,對(duì)消費(fèi)者還有沒(méi)有價(jià)值,都不一定呢。
我們的工作是價(jià)值拉動(dòng)的,所以我們要快速響應(yīng)變化,我們的哲學(xué)是:“先把應(yīng)用跑起來(lái),完成一小部分可以使用的業(yè)務(wù)功能,看看反饋再說(shuō)”。
所以我們按照故事點(diǎn)來(lái)劃分需求,比如這三天我們就開(kāi)發(fā)”登錄功能“,這里面包括頁(yè)面的登錄框,頁(yè)面JS校驗(yàn),后臺(tái)邏輯校驗(yàn),數(shù)據(jù)庫(kù)表字段調(diào)整,調(diào)用系統(tǒng)B 的驗(yàn)證接口等。這樣,三天以后,團(tuán)隊(duì)就能給產(chǎn)品經(jīng)理/Boss演示“登錄功能”,接受產(chǎn)品經(jīng)理/Boss的反饋,并在第四天就開(kāi)始改進(jìn),第五天就可以再給產(chǎn)品經(jīng)理/Boss演示改進(jìn)后的“登錄功能”了。
而不像傳統(tǒng)的軟件開(kāi)發(fā)方式,團(tuán)隊(duì)跟產(chǎn)品經(jīng)理/Boss說(shuō),“一個(gè)月以后你才能看到全部功能中的登錄功能,到時(shí)候你要是不滿意,走需求變更流程,需要再等一個(gè)月!”。
那么,這個(gè)“登錄功能”包括頁(yè)面的登錄框,頁(yè)面JS校驗(yàn),后臺(tái)邏輯校驗(yàn),數(shù)據(jù)庫(kù)表字段調(diào)整,調(diào)用系統(tǒng)B 的驗(yàn)證接口,這些都是可以自動(dòng)化驗(yàn)證的。頁(yè)面的登錄框我們用Selenium驗(yàn)證,JS校驗(yàn)邏輯我們用Jasmine驗(yàn)證,后臺(tái)邏輯校驗(yàn)我們用JUnit驗(yàn)證,數(shù)據(jù)庫(kù)表字段調(diào)整,我們用DBUnit驗(yàn)證,調(diào)用系統(tǒng)B 的接口,我們用Mockito來(lái)mock接口調(diào)用驗(yàn)證。
當(dāng)開(kāi)發(fā)人員對(duì)測(cè)試人員說(shuō),我們已經(jīng)開(kāi)發(fā)完成了“登錄功能”,測(cè)試人員會(huì)問(wèn),“如何證明你們已經(jīng)開(kāi)發(fā)完成了登錄功能?給我看下你們的自動(dòng)化測(cè)試代碼!”
是的,只有通過(guò)自動(dòng)化測(cè)試的代碼,才能證明功能是正確開(kāi)發(fā)完成的。因?yàn)槿绻麤](méi)有這些自動(dòng)化測(cè)試,兩個(gè)星期之后,代碼被多處修改,當(dāng)時(shí)寫(xiě)的代碼還能不能工作,都不一定呢。
沒(méi)錯(cuò),這些自動(dòng)化測(cè)試代碼都是開(kāi)發(fā)人員寫(xiě)的。我們的哲學(xué)是:“You build it, You test it!”
看到這里,你可能會(huì)問(wèn),Selenium 驗(yàn)證,Jasmine 驗(yàn)證,JUnit驗(yàn)證, DBUnit和 Mockito 驗(yàn)證,寫(xiě)了這么多的自動(dòng)化測(cè)試代碼,該怎么運(yùn)行呢?
沒(méi)問(wèn)題,我們的構(gòu)建工具是用的Maven嘛,這些測(cè)試都有對(duì)應(yīng)的Maven插件,我們把這些測(cè)試都集成到了Maven的構(gòu)建腳本里,這樣,在本地命令行,僅僅運(yùn)行 “mvn clean install” 就能挨個(gè)運(yùn)行這些測(cè)試了,當(dāng)運(yùn)行到Selenium測(cè)試時(shí),我們的腳本還會(huì)在本地把Jetty服務(wù)器運(yùn)行起來(lái),打開(kāi)本地的Firefox進(jìn)行Web UI測(cè)試,運(yùn)行完畢后退出Firefox,關(guān)閉Jett服務(wù)器。如果中途有測(cè)試失敗的話,腳本就會(huì)給出失敗提示。
下面是我們項(xiàng)目中實(shí)際的自動(dòng)化測(cè)試代碼,在powershell中的運(yùn)行截圖:
上圖是我們項(xiàng)目目前總共的532個(gè)JUnit測(cè)試運(yùn)行結(jié)果。
上圖是76個(gè)Jasmine測(cè)試運(yùn)行結(jié)果
那么測(cè)試人員如何做測(cè)試?
開(kāi)發(fā)人員都開(kāi)始寫(xiě)自動(dòng)化測(cè)試代碼了,那么測(cè)試人員干什么呢?
我們是這么做的,測(cè)試人員負(fù)責(zé)故事點(diǎn)的測(cè)試策略分析,比如“登錄功能”有一個(gè)要求是:“密碼必須包含字母和數(shù)字”。
那么測(cè)試人員會(huì)事先設(shè)計(jì)至少三個(gè)測(cè)試用例:
1)密碼全部是字母,不通過(guò)
2)密碼全部是數(shù)字,不通過(guò)
3)密碼有部分字母,部分?jǐn)?shù)字,通過(guò)
當(dāng)開(kāi)發(fā)人員開(kāi)始開(kāi)發(fā)“登錄功能”時(shí),測(cè)試人員會(huì)和他說(shuō),這里有三個(gè)測(cè)試用例,你的開(kāi)發(fā)完成時(shí),我需要看到至少三個(gè)自動(dòng)化測(cè)試覆蓋這三種情況。開(kāi)發(fā)人員說(shuō),沒(méi)問(wèn)題。
當(dāng)開(kāi)發(fā)人員開(kāi)發(fā)完畢,測(cè)試人員看到了這三個(gè)自動(dòng)化測(cè)試用例后,測(cè)試人員說(shuō),“可以了,我再進(jìn)行一些登錄的手工測(cè)試和探索性測(cè)試,你給我一個(gè)測(cè)試環(huán)境吧。”
那么開(kāi)發(fā)人員如何給測(cè)試人員準(zhǔn)備測(cè)試環(huán)境呢?
這也好辦,我們不是有持續(xù)集成服務(wù)器(以下簡(jiǎn)稱(chēng)CI)嘛,開(kāi)發(fā)人員提交代碼到SVN后,CI檢測(cè)到有代碼提交,會(huì)自動(dòng)運(yùn)行一遍“mvn clean install”, 如果結(jié)果是Success,CI會(huì)生成一個(gè)構(gòu)建號(hào)碼,比如“1292”。
開(kāi)發(fā)人員會(huì)對(duì)測(cè)試人員說(shuō),“我的功能代碼對(duì)應(yīng)的CI構(gòu)建號(hào)是1292,你去把1292號(hào)版本發(fā)布到測(cè)試環(huán)境吧。”
這里先說(shuō)明一下,我們的環(huán)境分為DEV,SYS,UAT等。這幾個(gè)環(huán)境的配置大都是一樣的,只是給不同的人使用。其中,DEV是給開(kāi)發(fā)人員開(kāi)發(fā)用的,SYS是給測(cè)試人員測(cè)試用的,UAT是給產(chǎn)品經(jīng)理和BOSS演示用的。
這時(shí)候,就是自動(dòng)化帶來(lái)的威力了。
如上圖,測(cè)試人員訪問(wèn)CI服務(wù)器,會(huì)看到這樣的構(gòu)建流水線,1292號(hào)版本已經(jīng)在CI上運(yùn)行通過(guò)(第一個(gè)綠色),并且被部署到DEV環(huán)境中(第二個(gè)綠色),SYS和UAT還沒(méi)有部署1292號(hào)版本(藍(lán)色)。
由于我們事先已經(jīng)在CI上配置好了把代碼部署到測(cè)試環(huán)境的腳本,用Groovy寫(xiě)的,所以測(cè)試人員只需要在“1292”號(hào)版本的sys環(huán)境上點(diǎn)擊一個(gè)按鈕(上圖中紅色框所示),就能把代碼發(fā)布到測(cè)試環(huán)境了。
上圖就是一個(gè)已經(jīng)發(fā)布到測(cè)試環(huán)境的版本。我們也可以用同樣的辦法發(fā)布某個(gè)特定版本到UAT環(huán)境,隨時(shí)給BOSS做演示。
幾分鐘之后,測(cè)試人員就開(kāi)始Happy地進(jìn)行手工測(cè)試和探索性測(cè)試了。
新功能發(fā)布到測(cè)試環(huán)境后,如果測(cè)試人員發(fā)現(xiàn)功能不對(duì),想手工驗(yàn)證下當(dāng)前測(cè)試環(huán)境的版本,也是可以的。只需要在瀏覽器輸入“http://應(yīng)用地址/appcheck.jsp”,就能得到如下頁(yè)面,
其中的信息包括:應(yīng)用的maven版本號(hào),CI服務(wù)器(我們用的是免費(fèi)的Jenkins)構(gòu)建號(hào)碼,SVN提交版本號(hào),構(gòu)建時(shí)間等信息。
如果測(cè)試人員又發(fā)現(xiàn)了一些Bug,就會(huì)和開(kāi)發(fā)人員一起嘗試著再寫(xiě)一些自動(dòng)化測(cè)試代碼,以此保證一些重復(fù)的驗(yàn)證都由便宜又聽(tīng)話的機(jī)器去做,測(cè)試人員則抽出他們寶貴的精力來(lái)關(guān)注測(cè)試策略和探索性測(cè)試。
好了,三天以后,具有自動(dòng)化測(cè)試代碼的“登錄功能”OK了,產(chǎn)品經(jīng)理/Boss看后非常滿意,說(shuō)可以發(fā)布到產(chǎn)品環(huán)境了。
那么,我們是怎么發(fā)布到產(chǎn)品環(huán)境,我們的上線流程是怎么樣的呢?
還有和系統(tǒng)B 的聯(lián)調(diào),我們是怎么做的呢?
未完待續(xù),敬請(qǐng)期待。。。
posted on 2012-07-31 10:40 順其自然EVO 閱讀(2993) 評(píng)論(3) 編輯 收藏 所屬分類(lèi): selenium and watir webdrivers 自動(dòng)化測(cè)試學(xué)習(xí)