日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

自動化測試的7個步驟

 心之所指 2006-03-28
自動化測試的7個步驟
文章出處:www.51 作者:Bret Pettichord 譯者:王威 發(fā)布時間:2005-10-19
 

【摘要】 我們對自動化測試充滿了希望,然而,自動化測試卻經(jīng)常帶給我們沮喪和失望。雖然,自動化測試可以把我們從困難的環(huán)境中解放出來,在實(shí)施自動化測試解決問題的同時,又帶來同樣多的問題。在開展自動化測試的工作中,關(guān)鍵問題是遵循軟件開發(fā)的基本規(guī)則。本文介紹自動化測試的 7 個步驟:改進(jìn)自動化測試過程,定義需求,驗(yàn)證概念,支持產(chǎn)品的可測試性,具有可延續(xù)性的設(shè)計(jì)( design for sustainability ),有計(jì)劃的部署和面對成功的挑戰(zhàn)。按照以上 7 個步驟,安排你的人員、工具和制定你的自動化測試項(xiàng)目計(jì)劃,你將會通往一條成功之路。

一個故事 :

我在很多軟件公司工作過,公司規(guī)模有大有小,也和來自其他公司的人員交流,因此經(jīng)歷過或者聽說過影響自動化測試效果的各種各樣的的問題。本文將提供若干方法規(guī)避可能在自動化測試中出現(xiàn)的問題。我先給大家講一個故事,以便各位了解自動化測試會出現(xiàn)哪些問題。

以前,我們有一個軟件項(xiàng)目,開發(fā)小組內(nèi)所有的人都認(rèn)為應(yīng)該在項(xiàng)目中采用自動化測試。軟件項(xiàng)目的經(jīng)理是 Anita Delegate 。她評估了所有可能采用的自動化測試工具,最后選擇了一種,并且購買了幾份拷貝。她委派一位員工 ——Jerry Overworked 負(fù)責(zé)自動化測試工作。 Jerry 除了負(fù)責(zé)自動化測試工作,還有其他的很多任務(wù)。他嘗試使用剛剛購買的自動化測試工具。當(dāng)把測試工具應(yīng)用到軟件產(chǎn)品測試中的時候,遇到了問題。這個測試工具太復(fù)雜,難于配置。他不得不給測試工具的客戶支持熱線打了幾個電話。最后, Jerry 認(rèn)識到,他需要測試工具的技術(shù)支持人員到現(xiàn)場幫助安裝測試工具,并找出其中的問題。在打過幾個電話后,測試工具廠商派過來一位技術(shù)專家。技術(shù)專家到達(dá)后,找出問題所在,測試工具可以正常工作了。這還算是順利了。但是,幾個月后,他們還是沒有真正實(shí)現(xiàn)測試自動化, Jerry 拒絕繼續(xù)從事這個項(xiàng)目的工作,他害怕自動化測試會一事無成,只是浪費(fèi)時間而已。

項(xiàng)目經(jīng)理 Anita 把項(xiàng)目重新指派給 Kevin Shorttimer ,一位剛剛被雇傭來做軟件測試的人員。 Kevin 剛剛獲得計(jì)算機(jī)科學(xué)的學(xué)位,希望通過這份工作邁向更有挑戰(zhàn)性的、值得去做的工作。 Anita 送 Kevin 參加工具培訓(xùn),避免 Kevin 步 Jerry 的后塵 —— 由于使用測試工具遇到困難而變得沮喪,導(dǎo)致放棄負(fù)責(zé)的項(xiàng)目。 Kevin 非常興奮。這個項(xiàng)目的測試需要重復(fù)測試,有點(diǎn)令人討厭,因此,他非常愿意采用自動化測試。一個主要的版本發(fā)布后, Kevin 準(zhǔn)備開始全天的自動化測試,他非??释玫揭粋€機(jī)會證明自己可以寫非常復(fù)雜的,有難度的代碼。他建立了一個測試庫,使用了一些技巧的方法,可以支持大部分的測試,這比原計(jì)劃多花費(fèi)了很多時間,不過, Kevin 使整個測試工作開展的很順利。他用已有的測試套測試新的產(chǎn)品版本,并且確實(shí)發(fā)現(xiàn)了 bug 。接下來, Kevin 得到一個從事軟件開發(fā)職位的機(jī)會,離開了自動化的崗位。

Ahmed Hardluck 接手 Kevin 的工作,從事自動化測試執(zhí)行工作。他發(fā)現(xiàn) Kevin 留下的文檔不僅少,并且沒有太多的價值。 Ahmed 花費(fèi)不少時間去弄清楚已有的測試設(shè)計(jì)和研究如何開展測試執(zhí)行工作。這個過程中, Ahmed 經(jīng)歷了很多失敗,并且不能確信測試執(zhí)行的方法是否正確。測試執(zhí)行中,執(zhí)行失敗后的錯誤的提示信息也沒有太多的參考價值,他不得不更深的鉆研。一些測試執(zhí)行看起來仿佛永遠(yuǎn)沒有結(jié)束。另外一些測試執(zhí)行需要一些特定的測試環(huán)境搭建要求,他更新測試環(huán)境搭建文檔,堅(jiān)持不懈地工作。后來,在自動化測試執(zhí)行中,它發(fā)現(xiàn)幾個執(zhí)行失敗的結(jié)果,經(jīng)過分析,是回歸測試的軟件版本中有 BUG ,導(dǎo)致測試執(zhí)行失敗,發(fā)現(xiàn)產(chǎn)品的 BUG 后,每個人都很高興。接下來,他仔細(xì)分析測試套中的內(nèi)容,希望通過優(yōu)化測試套使測試變得更可靠,但是,這個工作一直沒有完成,預(yù)期的優(yōu)化結(jié)果也沒有達(dá)到。按照計(jì)劃,產(chǎn)品的下一個發(fā)布版本有幾個主要的改動, Ahmed 立刻意識到產(chǎn)品的改動會破壞已有的自動化測試設(shè)計(jì)。接下來,在測試產(chǎn)品的新版本中,絕大多數(shù)測試用例執(zhí)行失敗了, Ahmed 對執(zhí)行失敗的測試研究了很長時間,然后,從其他人那里尋求幫助。經(jīng)過商討,自動化測試應(yīng)該根據(jù)產(chǎn)品的新接口做修改,自動化測試才能運(yùn)轉(zhuǎn)起來。最后,大家根據(jù)新接口修改自動化測試,測試都通過了。產(chǎn)品發(fā)布到了市場上。接下來,用戶立刻打來投訴電話,投訴軟件無法工作。大家才發(fā)現(xiàn)自己改寫了一些自動化測試腳本,導(dǎo)致一些錯誤提示信息被忽略了。雖然,實(shí)際上測試執(zhí)行是失敗的,但是,由于改寫腳本時的一個編程錯誤導(dǎo)致失敗的測試執(zhí)行結(jié)果被忽略了。這個產(chǎn)品終于失敗了。

這是我的故事。或許您曾經(jīng)親身經(jīng)歷了故事當(dāng)中某些情節(jié)。不過,我希望你沒有這樣的相似結(jié)局。本文將給出一些建議,避免出現(xiàn)這樣的結(jié)局。

問題

這個故事闡明了幾個使自動化測試項(xiàng)目陷入困境的原因:

自動化測試時間不充足:根據(jù)項(xiàng)目計(jì)劃的安排,測試人員往往被安排利用自己的個人時間或者項(xiàng)目后期介入自動化測試。這使得自動化測試無法得到充分的時間,無法得到真正的關(guān)注。

缺乏清晰的目標(biāo):有很多好的理由去開展自動化測試工作,諸如自動化測試可以節(jié)省時間,使測試更加簡單,提高測試的覆蓋率,可以讓測試人員保持更好的測試主動性。但是,自動化測試不可能同時滿足上述的目標(biāo)。不同的人員對自動化測試有不同的希望,這些希望應(yīng)該提出來,否則很可能面對的是失望。

缺乏經(jīng)驗(yàn):嘗試測試自己的程序的初級的程序員經(jīng)常采用自動化自動化測試。由于缺乏經(jīng)驗(yàn),很難保證自動化測試的順利開展。

更新?lián)Q代頻繁( High turnover ):測試自動化往往需要花費(fèi)很多時間學(xué)習(xí)的,當(dāng)自動化測試更新?lián)Q代頻繁的時候,你就喪失了剛剛學(xué)習(xí)到的自動化測試經(jīng)驗(yàn)。

對于絕望的反應(yīng):在測試還遠(yuǎn)沒有開始的時候,問題就已經(jīng)潛伏在軟件中了。軟件測試不過是發(fā)現(xiàn)了這些潛伏的問題而已。就測試本身而言,測試是一件很困難的工作。當(dāng)在修改過的軟件上一遍接一遍的測試時,測試人員變得疲勞起來。測試什么時候后結(jié)束?當(dāng)按照計(jì)劃的安排,軟件應(yīng)該交付的時候,測試人員的絕望變得尤其強(qiáng)烈。如果不需要測試,那該有多好呀!在這種環(huán)境中,自動化測試可能是個可以選擇的解決方法。但是,自動化測試卻未必是最好的選擇,他不是一個現(xiàn)實(shí)的解決方法,更像是一個希望。

不愿思考軟件測試:很多人發(fā)現(xiàn)實(shí)現(xiàn)產(chǎn)品的自動化測試比測試本身更有趣。在很多軟件項(xiàng)目發(fā)生這樣的情況,自動化工程師不參與到軟件測試的具體活動中。由于測試的自動化與測試的人為割裂,導(dǎo)致很多自動化對軟件測試并沒有太大的幫助。

關(guān)注于技術(shù):如何實(shí)現(xiàn)軟件的自動化測試是一個很吸引人的技術(shù)問題。不過,過多的關(guān)注如何實(shí)現(xiàn)自動化測試,導(dǎo)致忽略了自動化測試方案是否符合測試需要。

遵守軟件開發(fā)的規(guī)則

你可能了解 SEI (軟件工程研究所)提出的 CMM (能力成熟度模型)。 CMM 分為 5 個界別,該模型用來對軟件開發(fā)組織劃分等級。 Jerry Weinberg (美國著名軟件工程專家)也創(chuàng)建了自己的一套軟件組織模型,在他的組織模型中增加了一個額外的級別,他稱之為零級別。很顯然,一個零模式的組織實(shí)際上也是開發(fā)軟件;零模式組織中,在開發(fā)人員和用戶之間沒有差別 [Weinberg 1992] 。恰恰在這類組織環(huán)境中,經(jīng)常采用自動化測試方法。因此,把資源用于自動化測試,并且把自動化測試當(dāng)作一個軟件開發(fā)活動對待,把軟件測試自動化提升到一級。這是解決測試自動化的核心的方案。我們應(yīng)該像運(yùn)作其他的開發(fā)項(xiàng)目一樣來運(yùn)作軟件自動化測試項(xiàng)目。

像其他軟件開發(fā)項(xiàng)目一樣,我們需要軟件開發(fā)人員專注于測試自動化的開發(fā)任務(wù);像其他軟件開發(fā)項(xiàng)目一樣,自動化測試可以自動完成具體的測試任務(wù),對于具體的測試任務(wù)來說,自動化開發(fā)人員可能不是這方面的專家,因此,軟件測試專家應(yīng)該提供具體測試任務(wù)相關(guān)的咨詢,并且提供測試自動化的需求;像其他軟件開發(fā)項(xiàng)目一樣,如果在開發(fā)編碼之前,對測試自動化作了整體設(shè)計(jì)有助于測試自動化開發(fā)的順利開展。像其他軟件開發(fā)項(xiàng)目一樣,自動化測試代碼需要跟蹤和維護(hù),因此,需要采用源代碼管理。像其他軟件開發(fā)項(xiàng)目一樣,測試自動化也會出現(xiàn) BUG ,因此,需要有計(jì)劃的跟蹤 BUG ,并且對修改后的 BUG 進(jìn)行測試。像其他軟件開發(fā)項(xiàng)目一樣,用戶需要知道如何使用軟件,因此,需要提供用戶使用手冊。

本文中不對軟件開發(fā)做過多講述。我假定您屬于某個軟件組織,該組織已經(jīng)知道采用何種合理的、有效的方法開發(fā)軟件。我僅僅是推動您在自動化測試開發(fā)過程中遵守已經(jīng)建立的軟件開發(fā)規(guī)則而已。本文按照在軟件開發(fā)項(xiàng)目中采用的標(biāo)準(zhǔn)步驟組織的,重點(diǎn)關(guān)注測試自動化相關(guān)的事宜和挑戰(zhàn)。

•  改進(jìn)軟件測試過程

•  定義需求

•  驗(yàn)證概念

•  支持產(chǎn)品的可測試性

•  可延續(xù)性的設(shè)計(jì)( design for sustainability )

•  有計(jì)劃的部署

•  面對成功的挑戰(zhàn)

步驟一:改進(jìn)軟件測試過程

如果你負(fù)責(zé)提高一個商業(yè)交易操作的效率,首先,你應(yīng)該確認(rèn)已經(jīng)很好的定義了這個操作的具體過程。然后,在你投入時間和金錢采用計(jì)算機(jī)提供一套自動化的商業(yè)交易操作系統(tǒng)之前,你想知道是否可以采用更簡單、成本更低的的方法。同樣的,上述過程也是用于自動化測試。我更愿意把 “ 測試自動化 ” 這個詞解釋成能夠使測試過程簡單并有效率,使測試過程更為快捷,沒有延誤。運(yùn)行在計(jì)算機(jī)上的自動化測試腳本只是自動化測試的一個方面而已。

例如,很多測試小組都是在回歸測試環(huán)節(jié)開始采用測試自動化的方法。回歸測試需要頻繁的執(zhí)行,再執(zhí)行,去檢查曾經(jīng)執(zhí)行過的有效的測試用例沒有因?yàn)檐浖淖儎佣鴪?zhí)行失敗?;貧w測試需要反復(fù)執(zhí)行,并且單調(diào)乏味。怎樣才能做好回歸測試文檔化的工作呢?通常的做法是采用列有產(chǎn)品特性的列表,然后對照列表檢查。這是個很好的開始,回歸測試檢查列表可以告訴你應(yīng)該測試哪些方面。不過,回歸測試檢查列表只是合于那些了解產(chǎn)品,并且知道需要采用哪種測試方法的人。

在你開始測試自動化之前,你需要完善上面提到的回歸測試檢查表,并且,確保你已經(jīng)采用了確定的的測試方法,指明測試中需要什么樣的數(shù)據(jù),并給出設(shè)計(jì)數(shù)據(jù)的完整方法。如果測試掌握了基本的產(chǎn)品知識,這會更好。確認(rèn)可以提供上面提到的文檔后,需要明確測試設(shè)計(jì)的細(xì)節(jié)描述,還應(yīng)該描述測試的預(yù)期結(jié)果,這些通常被忽略,建議測試人員知道。太多的測試人員沒有意識到他們?nèi)鄙偈裁?,并且由于害怕尷尬而不敢去求助。這樣一份詳細(xì)的文檔給測試小組帶來立竿見影的效果,因?yàn)椋F(xiàn)在任何一個具有基本產(chǎn)品知識的人根據(jù)文檔可以開展測試執(zhí)行工作了。在開始更為完全意義上的測試自動化之前,必須已經(jīng)完成了測試設(shè)計(jì)文檔。測試設(shè)計(jì)是測試自動化最主要的測試需求說明。不過,這時候千萬不要走極端去過分細(xì)致地說明測試執(zhí)行的每一個步驟,只要確保那些有軟件基本操作常識的人員可以根據(jù)文檔完成測試執(zhí)行工作既可。但是,不要假定他們理解那些存留在你頭腦中的軟件測試執(zhí)行的想法,把這些測試設(shè)計(jì)的思路描述清楚就可以了。

我以前負(fù)責(zé)過一個軟件模塊的自動化測試工作。這個模塊的一些特性導(dǎo)致實(shí)現(xiàn)自動化非常困難。當(dāng)我了解到這項(xiàng)工作無需在很短的時間內(nèi)完成后,決定制定一個詳細(xì)回歸測試設(shè)計(jì)方案。我仔細(xì)地檢查了缺陷跟蹤庫中與該模塊相關(guān)的每個已經(jīng)關(guān)閉的缺陷,針對每個缺陷,我寫了一個能夠發(fā)現(xiàn)該問題的測試執(zhí)行操作。我計(jì)劃采用這種方法提供一個詳細(xì)的自動化需求列表,這可以告訴我模塊的那一部分最適合自動化測試。在完成上述工作后,我沒有機(jī)會完成測試自動化的實(shí)現(xiàn)工作。不過,當(dāng)我們需要對這個模塊做完整回歸測試的時候,我將上面提到的文檔提供給若干只了解被測試產(chǎn)品但是沒有測試經(jīng)驗(yàn)的測試人員。依照文檔的指導(dǎo),幾乎不需要任何指導(dǎo)的情況下,各自完成了回歸測試,并且發(fā)現(xiàn)了 BUG 。從某種角度看,這實(shí)際上是一次很成功的自動化測試。在這個項(xiàng)目中,我們與其開發(fā)自動化測試腳本,還不如把測試執(zhí)行步驟文檔化。后來,在其它項(xiàng)目中,我們開發(fā)了自動化測試腳本,發(fā)現(xiàn)相關(guān)人員只有接受相關(guān)培訓(xùn)才能理解并執(zhí)行自動化測試腳本,如果測試自動化設(shè)計(jì)的很好,可能會好一些。不過,經(jīng)過實(shí)踐我們總結(jié)出完成一份設(shè)計(jì)的比較好的測試文檔,比完成一份設(shè)計(jì)良好的測試腳本簡單的多。

另外一個提高測試效率的簡單方法是采用更多的計(jì)算機(jī)。很多測試人員動輒動用幾臺計(jì)算機(jī),這一點(diǎn)顯而易見。我之所以強(qiáng)調(diào)采用更多的計(jì)算機(jī)是因?yàn)?,我曾?jīng)看到一些測試人員被誤導(dǎo)在單機(jī)上努力的完成某些大容量的自動化測試執(zhí)行工作,這種情況下由于錯誤的使用了測試設(shè)備、測試環(huán)境,導(dǎo)致測試沒有效果。因此,自動化測試需要集中考慮所需要的支撐設(shè)備。

針對改進(jìn)軟件測試過程,我的最后一個建議是改進(jìn)被測試的產(chǎn)品,使它更容易被測試,有很多改進(jìn)措施既可以幫助用戶更好的使用產(chǎn)品,也可以幫助測試人員更好的測試產(chǎn)品。稍后,我將討論自動化測試的可測試需求。這里,我只是建議給出產(chǎn)品的改進(jìn)點(diǎn),這樣對手工測試大有幫助。

一些產(chǎn)品非常難安裝,測試人員在安裝和卸載軟件上花費(fèi)大量的時間。這種情況下,與其實(shí)現(xiàn)產(chǎn)品安裝的自動化測試,還不如改進(jìn)產(chǎn)品的安裝功能。采用這種解決辦法,最終的用戶會受益的。另外的一個處理方法是考慮開發(fā)一套自動安裝程序,該程序可以和產(chǎn)品一同發(fā)布。事實(shí)上,現(xiàn)在有很多專門制作安裝程序的商用工具。

另一些產(chǎn)品改進(jìn)需要利用工具在測試執(zhí)行的日志中查找錯誤。采用人工方法,在日志中一頁一頁的查詢報(bào)錯信息很容易會讓人感到乏味。那么,趕快采用自動化方法吧。如果你了解日志中記錄的錯誤信息格式,寫出一個錯誤掃描程序是很容易的事情。如果,你不能確定日志中的錯誤信息格式,就開始動手寫錯誤掃描程序,很可能面臨的是一場災(zāi)難。不要忘記本文開篇講的那個故事中提到的測試套無法判斷測試用例是否執(zhí)行失敗的例子。最終用戶也不愿意采用通過搜索日志的方法查找錯誤信息。修改錯誤信息的格式,使其適合日志掃描程序,便于掃描工具能夠準(zhǔn)確的掃描到所有的錯誤信息。這樣,在測試中就可以使用掃描工具了。

通過改進(jìn)產(chǎn)品的性能對測試也是大有幫助的。很顯然的,如果產(chǎn)品的性能影響了測試速度,鑒別出性能比較差的產(chǎn)品功能,并度量該產(chǎn)品功能的性能,把它作為影響測試進(jìn)度的缺陷,提交缺陷報(bào)告。

上面所述的幾個方面可以在無需構(gòu)建自動化測試系統(tǒng)的情況下,大幅度的提高測試效率。改進(jìn)軟件測試過程會花費(fèi)你構(gòu)建自動化測試系統(tǒng)的時間,不過改進(jìn)測試過程無疑可以使你的自動化測試項(xiàng)目更為順利開展起來。

步驟二:定義需求

在前面的故事中,自動化工程師和自動化測試的發(fā)起者的目標(biāo)存在偏差。為了避免這種情況,需要在自動化測試需求上保持一致。應(yīng)該有一份自動化測試需求,用來描述需要測試什么。測試需求應(yīng)該在測試設(shè)計(jì)階段詳細(xì)描述出來,自動化測試需求描述了自動化測試的目標(biāo)。很多人認(rèn)為自動化測試顯然是一件好事情,但是,他們不愿意對自動化測試的目標(biāo)給出清晰的描述。下面是人們選用自動化測試的幾個原因:

•  加快測試進(jìn)度從而加快產(chǎn)品發(fā)布進(jìn)度

•  更多的測試

•  通過減少手工測試降低測試成本

•  提高測試覆蓋率

•  保證一致性

•  提高測試的可靠性

•  測試工作可以由技術(shù)能力不強(qiáng)測試人員完成

•  定義測試過程,避免過分依賴個人

•  測試變得更加有趣

•  提高了編程技能

開發(fā)管理、測試管理和測試人員實(shí)現(xiàn)自動化測試的目標(biāo)常常是有差別的。除非三者之間達(dá)成一致,否則很難定義什么是成功的自動化測試。

當(dāng)然,不同的情況下,有的自動化測試目標(biāo)比較容易達(dá)到,有的則比較難以達(dá)到。測試自動化往往對測試人員的技術(shù)水平要求很高,測試人員必須能理解充分的理解自動化測試,從而通過自動化測試不斷發(fā)現(xiàn)軟件的缺陷。不過,自動化測試不利于測試人員不斷的積累測試經(jīng)驗(yàn)。不管怎么樣,在開始自動化測試之前應(yīng)該確定自動化測試成功的標(biāo)準(zhǔn)。

手工測試人員在測試執(zhí)行過程中的一些操作能夠發(fā)現(xiàn)不引人注意的問題。他們計(jì)劃并獲取必要的測試資源,建立測試環(huán)境,執(zhí)行測試用例。測試過程中,如果有什么異常的情況發(fā)生,手工測試人員立刻可以關(guān)注到。他們對比實(shí)際測試結(jié)果和預(yù)期測試結(jié)果,記錄測試結(jié)果,復(fù)位被測試的軟件系統(tǒng),準(zhǔn)備下一個軟件測試用例的環(huán)境。他們分析各種測試用例執(zhí)行失敗的情況,研究測試過程可疑的現(xiàn)象,尋找測試用例執(zhí)行失敗的過程,設(shè)計(jì)并執(zhí)行其他的測試用例幫助定位軟件缺陷。接下來,他們寫作缺陷報(bào)告單,保證缺陷被修改,并且總結(jié)所有的缺陷報(bào)告單,以便其他人能夠了解測試的執(zhí)行情況。

千萬不要強(qiáng)行在測試的每個部分都采用自動化方式。尋找能夠帶來最大回報(bào)的部分,部分的采用自動化測試是最好的方法?;蛟S你可能發(fā)現(xiàn)采用自動化執(zhí)行和手動確認(rèn)測試執(zhí)行結(jié)果的方式是個很好的選擇,或許你可以采用自動化確認(rèn)測試結(jié)果和手工測試執(zhí)行相結(jié)合和方式。我聽到有人講,除非測試的各個環(huán)節(jié)都采用自動化方式,否則不是真正意義上的自動化測試,這真是胡言亂語。如果僅僅是為了尋找挑戰(zhàn),可以嘗試在測試的每個環(huán)節(jié)都采用自動化方法。但是,如果尋找成功測試的方法,請關(guān)注那些可以快速建立的,可以反復(fù)利用的自動化測試。

定義自動化測試項(xiàng)目的需求要求我們?nèi)娴?、清楚地考慮各種情況,然后給出權(quán)衡后的需求,并且可以使測試相關(guān)人員更加合理的提出自己對自動化測試的期望。通過定義自動化測試需求,距離成功的自動化測試近了一步。

步驟三:驗(yàn)證概念

在前面的故事當(dāng)中,那個自動化測試人員在對測試方向一片茫然的情況下一頭扎進(jìn)了自動化測試項(xiàng)目中。不過,在項(xiàng)目的進(jìn)行中,他得到了來自各個方面的支持。

你可能還沒有認(rèn)識到這一點(diǎn),不過,你必須驗(yàn)證自動化測試項(xiàng)目的可行性。驗(yàn)證過程花費(fèi)的時間往往比人們預(yù)期的要長,并且需要來自你身邊的各種人的幫助。

很多年前,我從事一個測試自動化項(xiàng)目的工作,參加項(xiàng)目的人員有各種各樣的好點(diǎn)子。我們設(shè)計(jì)了一個復(fù)雜的自動化測試系統(tǒng),并且非常努力工作去實(shí)現(xiàn)系統(tǒng)的每個模塊。我們定期的介紹測試自動化的設(shè)計(jì)思路和工作進(jìn)度,甚至演示已經(jīng)完成的部分功能。但是,我們沒有演示如何利用該套測試自動化系統(tǒng)如何開展實(shí)際的測試工作。最后,整個項(xiàng)目被取消了,此后,我再也沒有犯這個錯誤。

你需要盡可能快地驗(yàn)證你采用的測試工具和測試方法的可行性,站在產(chǎn)品的角度驗(yàn)證你所測試的產(chǎn)品采用自動化測試的可行性。這通常是很困難的,需要盡快地找出可行性問題的答案,需要確定你的測試工具和測試方法對于被測試的產(chǎn)品和測試人員是否合適。你需要做是驗(yàn)證概念 —— 一個快速、有說服力的測試套可以證明你選在測試工具和測試方法的正確性,從而驗(yàn)證了你的測試概念。你選擇的用來驗(yàn)證概念的測試套是評估測試工具的最好的方式。

對于很多人來說,自動化測試意味著 GUI 自動化測試,我不同意這種觀點(diǎn)。我曾經(jīng)做過 GUI 和非 GUI 自動化測試,并驚奇的發(fā)現(xiàn)這兩類測試的測試計(jì)劃有很大的互補(bǔ)性。不過, GUI 測試工具很昂貴、并且過分講究。選擇合適的 GUI 測試工具是很重要的,因?yàn)?,如果沒有選擇合適的測試工具,你會遇到很多不可預(yù)測的困難。 Elisabeth Hendrickson 曾經(jīng)寫過一篇關(guān)于選擇測試的工具的指導(dǎo)性文章 [Hendrickson 1999] 。我建議在評估測試工具中,找出能夠驗(yàn)證你的想法的證據(jù)是很重要的環(huán)節(jié)。這需要測試工具至少有一個月試用期,你可能打算現(xiàn)在購買一份測試工具,然后直到評估完成后再購買更多份。你需要在付出大筆金錢購買測試工具的之前,找出工具存在的問題。這樣,你可以從測試工具供應(yīng)商得到更好的幫助,當(dāng)你打算更換工具的時候,你不會感覺很為難。

下面是一些候選的驗(yàn)證概念的試驗(yàn):

回歸測試:你準(zhǔn)備在每個版本運(yùn)行同樣的測試用例嗎?回歸測試是最宜采用自動化測試的環(huán)節(jié)。

配置測試:你的軟件支持多少種不同的平臺?你打算在所有支持的平臺上測試執(zhí)行所有的測試用例嗎?如果是的,那么采用自動化測試是有幫助的。

測試環(huán)境建立:對于大量不同的測試用例,可能需要相同的測試環(huán)境搭建過程。在開展自動化測試執(zhí)行之前,先把測試環(huán)境搭建實(shí)現(xiàn)自動化。

非 GUI 測試:實(shí)現(xiàn)命令行和 API 的測試自動化比 GUI 自動化測試容易的多。

無論采用什么測試方法,定義一個看得見的目標(biāo),然后集中在這個目標(biāo)上。驗(yàn)證你自動化測試概念可以使自動化更進(jìn)一步邁向成功之路。

步驟四:支持產(chǎn)品的可測試性

軟件產(chǎn)品一般會用到下面三種不同類別的接口:命令行接口( command line interfaces ,縮寫 CLIs) 、應(yīng)用程序接口( API )、圖形用戶接口( GUI )。有些產(chǎn)品會用到所有三類接口,有些產(chǎn)品只用到一類或者兩類接口,這些是測試中所需要的接口。從本質(zhì)上看, API 接口和命令行接口比 GUI 接口容易實(shí)現(xiàn)自動化,去找一找你的被測產(chǎn)品是否包括 API 接口或者命令行接口。有些時候,這兩類接口隱藏在產(chǎn)品的內(nèi)部,如果確實(shí)沒有,需要鼓勵開發(fā)人員在產(chǎn)品中提供命令行接口或者 API 接口,從而支持產(chǎn)品的可測試性。

下面,更多多的講解 GUI 自動化測試相關(guān)內(nèi)容。這里有幾個原因?qū)е?GUI 自動化測試比預(yù)期的要困難。第一個原因是需要手工完成部分腳本。絕大多數(shù)自動化測試工具都有 “ 錄制回放 ” 或者 “ 捕捉回放 ” 功能,這確實(shí)是個很好的方法??梢允止?zhí)行測試用例,測試工具在后臺記住你的所有操作,然后產(chǎn)生可以用來重復(fù)執(zhí)行的測試用例腳本。這是一個很好的方法,但是很多時候卻不能奏效。很多軟件測試文章的作者得出結(jié)論 “ 錄制回放 ” 雖然可以生成部分測試腳本,但是有很多問題導(dǎo)致 “ 錄制回放 ” 不能應(yīng)用到整個測試執(zhí)行過程中。 [Bach 1996, Pettichord 1996, Kaner 1997, Linz 1998, Hendrickson 1999, Kit 1999, Thomson 1999, Groder 1999]. 結(jié)果, GUI 測試還是主要由手工完成。

第二個原因,把 GUI 自動化測試工和被測試的產(chǎn)品有機(jī)的結(jié)合在一起需要面臨技術(shù)上的挑戰(zhàn)。經(jīng)常要在采用眾多專家意見和最新的 GUI 接口技術(shù)才能使 GUI 測試工具正常工作。這個主要的困難也是 GUI 自動化測試工具價格昂貴的主要原因之一。非標(biāo)準(zhǔn)的、定制的控件會增加測試的困難,解決方法總是有的,可以采用修改產(chǎn)品源代碼的方式,也可以從測試工具供應(yīng)商處升級測試工具。另外,還需要分析測試工具中的 BUG ,并且給工具打補(bǔ)丁。也可能測試工具需要做相當(dāng)?shù)亩ㄖ?,以便能有效地測試產(chǎn)品界面上的定制控件。 GUI 測試中,困難總是意外出現(xiàn),讓人驚奇。你也可能需要重新設(shè)計(jì)你的測試以規(guī)避那些存在問題的界面控件。

第三個原因, GUI 設(shè)計(jì)方案的變動會直接帶來 GUI 自動化測試復(fù)雜度的提高。在開發(fā)的整個過程中,圖形界面經(jīng)常被修改或者完全重設(shè)計(jì),這是出了名的事情。一般來講,第一個版本的圖形界面都是很糟糕。如果處在圖形界面方案不停變動的時候,就開展 GUI 自動化測試是不會有任何進(jìn)展的,你只能花費(fèi)大量的時間修改測試腳本,以適應(yīng)圖形界面的變更。不管怎樣,即便界面的修改會導(dǎo)致測試修改腳本,你也不應(yīng)該反對開發(fā)人員改進(jìn)圖形界面。一旦原始的設(shè)計(jì)完成后,圖形界面接口下面的編程接口就固定下來了。

上面提到的這些原因都是基于采用 GUI 自動化測試的方法完成產(chǎn)品的功能測試。圖形界面接口當(dāng)然需要測試,可以考慮實(shí)現(xiàn) GUI 測試自動化。不過,你也應(yīng)該考慮采用其他方法測試產(chǎn)品的核心功能,并且這些測試不會因?yàn)閳D形界面發(fā)生變化而被中斷,這類測試應(yīng)該采用命令行接口或者 API 接口。我曾經(jīng)看到有人選擇 GUI 自動化測試,因?yàn)椋麄儾淮蛩阈薷谋粶y試產(chǎn)品,但是,最終他們認(rèn)識到必須對產(chǎn)品做修改,以保證 GUI 測試自動化可以正常工作。無論你選擇哪種方法,自動化都需要對被測試的產(chǎn)品做修改。因此,采用可編程的接口是最可靠的。

為了讓 API 接口測試更為容易,應(yīng)該把接口與某種解釋程序,例如 Tcl 、 Perl 或者 Python 綁定在一起。這使交互式測試成為可能,并且可以縮短自動化測試的開發(fā)周期。采用 API 接口的方式,還可以實(shí)現(xiàn)獨(dú)立的產(chǎn)品模塊的單元測試自動化。

一個關(guān)于隱藏可編程接口的例子是關(guān)于 InstallShield—— 非常流行的制作安裝盤的工具。 InstallShield 有命令行選項(xiàng),采用這種選項(xiàng)可以實(shí)現(xiàn)非 GUI 方式的安裝盤,采用這種方式,從提前創(chuàng)建好的文件中讀取安裝選項(xiàng)。這種方式可能比采用 GUI 的安裝方式更簡單更可靠。

另一個例子是關(guān)于如何避免基于 WEB 軟件的 GUI 自動化測試。采用 GUI 測試工具可以通過瀏覽器操作 WEB 界面。 WEB 瀏覽器是通過 HTTP 協(xié)議與 WEB 服務(wù)器交互的,所以直接測試 HTTP 協(xié)議更為簡單。 Perl 可以直接連接 TCP/IP 端口,完成這類的自動化測試。采用高級接口技術(shù),譬如客戶端 JAVA 或者 ActiveX 不可能利用這種方法。但是,如果在合適的環(huán)境中采用這種方式,你將發(fā)現(xiàn)這種方式的自動化測試比 GUI 自動化測試更加便宜更加簡單。

我曾經(jīng)受雇在一家公司負(fù)責(zé)某個產(chǎn)品 GUI 相關(guān)的自動化測試,該產(chǎn)品也提供命令行接口,不過,他們已經(jīng)實(shí)現(xiàn)了 GUI 的自動化測試。經(jīng)過一段時間的研究,我發(fā)現(xiàn)找到圖形界面中的 BUG 并不困難,不過,用戶并不關(guān)注圖形界面,他們更喜歡使用命令行。我還發(fā)現(xiàn)我們還沒有針對最新的產(chǎn)品功能(這些功能即可通過 GUI 的方式,也可以通過命令行的方式使用)實(shí)現(xiàn)自動化測試。我決定推遲 GUI 自動化測試,擴(kuò)展命令行測試套,測試新增的產(chǎn)品功能?,F(xiàn)在回過頭看這個決定,我沒有選擇 GUI 自動化測試是最大的成功之處,如果采用了 GUI 自動化測試所有的時間和努力都會浪費(fèi)在其中。他們已經(jīng)準(zhǔn)備好做 GUI 自動化測試了,并且已經(jīng)購買了一套測試工具和其他需要的東西,但我知道在開展具體的 GUI 自動化測試活動中,會遇到各種各樣的困難和障礙。

無論你需要支持圖形界面接口、命令行接口還是 API 接口,如果你盡可能早的在產(chǎn)品設(shè)計(jì)階段提出產(chǎn)品的可測試性設(shè)計(jì)需求,未來的測試工作中,你很可能成功。盡可能早的啟動自動化測試項(xiàng)目,提出可測試性需求,會使您走向自動化測試成功之路。

步驟五:具有可延續(xù)性的設(shè)計(jì)

在開篇的故事中,我們看到由于自動化工程師把注意力僅僅集中在如何使自動化運(yùn)轉(zhuǎn)起來,導(dǎo)致測試自動化達(dá)不到預(yù)期的效果。自動化測試是一個長期的過程,為了與產(chǎn)品新版本的功能和其他相關(guān)修改保持一致,自動化測試需要不停的維護(hù)和擴(kuò)充。自動化測試設(shè)計(jì)中考慮自動化在未來的可擴(kuò)充性是很關(guān)鍵的,不過,自動化測試的完整性也是很重要的。如果自動化測試程序報(bào)告測試用例執(zhí)行通過,測試人員應(yīng)該相信得到的結(jié)果,測試執(zhí)行的實(shí)際結(jié)果也應(yīng)該是通過了。其實(shí),有很多存在問題的測試用例表面上執(zhí)行通過了,實(shí)際上卻執(zhí)行失敗了,并且沒有記錄任何錯誤日志,這就是失敗的自動化。這種失敗的自動化會給整個項(xiàng)目帶來災(zāi)難性的后果,而當(dāng)測試人員構(gòu)建的測試自動化采用了很糟糕的設(shè)計(jì)方案或者由于后來的修改引入了錯誤,都會導(dǎo)致這種失敗的測試自動化。失敗的自動化通常是由于沒有關(guān)注自動化測試的性能或者沒有充分的自動化設(shè)計(jì)導(dǎo)致的。

性能: 提高代碼的性能往往增加了代碼的復(fù)雜性,因此,會威脅到代碼的可靠性。很少有人關(guān)心如何對自動化本身加以測試。通過我對測試套性能的分析,很多測試套都是花費(fèi)大量的時間等候產(chǎn)品的運(yùn)行。因此,在不提高產(chǎn)品運(yùn)行性能的前提下,無法更有效的提高自動化測試執(zhí)行效率。我懷疑測試自動化工程師只是從計(jì)算機(jī)課程了解到應(yīng)該關(guān)注軟件的性能,而并沒有實(shí)際的操作經(jīng)驗(yàn)。如果測試套的性能問題無法改變,那么應(yīng)該考慮提高硬件的性能;測試套中經(jīng)常會出現(xiàn)冗余,也可以考慮取出測試套中的冗余或者減少一個測試套中完成的測試任務(wù),都是很好的辦法。

便于分析: 測試自動化執(zhí)行失敗后應(yīng)該分析失敗的結(jié)果,這是一個棘手的問題。分析執(zhí)行失敗的自動化測試結(jié)果是件困難的事情,需要從多方面著手,測試上報(bào)的告警信息是真的還是假的?是不是因?yàn)闇y試套中存在缺陷導(dǎo)致測試執(zhí)行失???是不是在搭建測試環(huán)境中出現(xiàn)了錯誤導(dǎo)致測試執(zhí)行失???是不是產(chǎn)品中確實(shí)存在缺陷導(dǎo)致測試執(zhí)行失???有幾個方法可以幫助測試執(zhí)行失敗的結(jié)果分析,某些方法可以找到問題所在。通過在測試執(zhí)行之前檢查常見的測試環(huán)境搭建問題,從而提高測試套的可靠性;通過改進(jìn)錯誤輸出報(bào)告,從而提高測試自動化的錯誤輸出的可分析性;此外,還可以改進(jìn)自動化測試框架中存在的問題。訓(xùn)練測試人員如何分析測試執(zhí)行失敗結(jié)果。甚至可以找到那些不可靠的、冗余的或者功能比較獨(dú)立的測試,然后安全地將之刪除。上面這些都是減少自動化測試誤報(bào)告警、提高測試可分析性的積極有效的方法。另外,有一種錯誤的測試結(jié)果分析方法,那就是采用測試結(jié)果后處理程序?qū)y試結(jié)果自動分析和過濾,盡管也可以采用這種測試結(jié)果分析方法,不過這種方法會使自動化測試系統(tǒng)復(fù)雜化,更重要的是,后處理程序中的 BUG 會嚴(yán)重?fù)p害自動化測試的完整性。如果由于自動化測試本身存在的缺陷誤把產(chǎn)品中的正常功能視為異常,那該怎么辦?我曾經(jīng)看到測試小組花費(fèi)開發(fā)測試自動化兩倍的時間來修改測試腳本,并且不愿意開展培訓(xùn)過程。那些僅僅關(guān)注很淺層次測試技術(shù)的測試管理者對這種方法很感興趣,他們排斥采用隱藏測試復(fù)雜度的方法。

綜上所述,應(yīng)該集中精力關(guān)注可以延續(xù)使用的測試套,從以下幾方面考慮,測試的可檢視性、測試的可維護(hù)性、測試的完整性、測試的獨(dú)立性、測試的可重復(fù)性。

可讀性: 很多情況下,在測試人員開始測試項(xiàng)目之前,公司已經(jīng)有了一套測試腳本,并且已經(jīng)存在很多年了。我們可以稱之為 “ 聰明的橡樹 ”(wise oak tree)[Bach 1996] 。大家很依賴它,但是并不知道它是什么。由于 “ 聰明的橡樹 ” 類型的測試腳本缺乏可讀性,在具體應(yīng)用中,那些腳本常常沒有多大的實(shí)用價值,越來越讓人迷惑。因此,測試人員很難確定他們實(shí)際在測試什么,反而會導(dǎo)致測試人員對自身的測試能力有過高的估計(jì)。測試人員能夠檢視測試腳本,并且理解測試腳本究竟測試了什么,這是很關(guān)鍵的。好的文檔是解決問題的手段之一,對測試腳本全面分析是另外一個手段。由上面兩種方法可以引申出其它的相關(guān)方法,我曾經(jīng)在一個項(xiàng)目中使用過引申之后的方法。在測試腳本中插樁,把所有執(zhí)行的產(chǎn)品相關(guān)的命令記錄到日志里。這樣,當(dāng)分析日志確定執(zhí)行了哪些產(chǎn)品命令,命令采用了何種參數(shù)配置時,可以提供一個非常好的測試記錄,里面記錄了自動化測試執(zhí)行了什么,沒有執(zhí)行什么。如果測試腳本可讀性不好,很容易變得過分依賴并沒有完全理解的測試腳本,很容易認(rèn)為測試腳本實(shí)際上做的工作比你想象中的還要多。測試套的可讀性提高后,可以更容易的開展同行評審活動。

可維護(hù)性: 在工作中,我曾經(jīng)使用過一個測試套,它把所有的程序輸出保存到文件中。然后,通過對比輸出文件內(nèi)容和一個已有的輸出文件內(nèi)容的差別,可以稱已有的輸出文件為 “ 標(biāo)準(zhǔn)文件 ” ( “gold file” )。在回歸測試中,用這個方法查找 BUG 是不是明智之舉。這種方法太過于敏感了,它會產(chǎn)生很多錯誤的警告。隨著時間的推移,軟件開發(fā)人員會根據(jù)需要修改產(chǎn)品的很多輸出信息,這會導(dǎo)致很多自動化測試失敗。很明顯,為了保證自動化測試的順利進(jìn)行,應(yīng)該在對 “ 標(biāo)準(zhǔn)文件 ” 仔細(xì)分析的基礎(chǔ)上,根據(jù)開發(fā)人員修改的產(chǎn)品輸出信息對之做相應(yīng)的修改。比較好的可維護(hù)性方法是,每次只檢查選定的產(chǎn)品的某些特定輸出,而不是對比所有的結(jié)果輸出。產(chǎn)品的接口變動也會導(dǎo)致原來的測試無法執(zhí)行或者執(zhí)行失敗。對于 GUI 測試,這是一個更大的挑戰(zhàn)。研究由于產(chǎn)品接口變化引起的相關(guān)測試修改,并研究使測試修改量最小的方法,測試中采用庫是解決問題的方法。當(dāng)產(chǎn)品發(fā)生變化的時候,只需要修改相關(guān)的庫,保證測試與產(chǎn)品的變動同步修改即可。

完整性: 當(dāng)自動化測試執(zhí)行后,報(bào)告測試執(zhí)行通過,可以斷定這是真的嗎?這就是我稱之為測試套的完整性。在前面的故事中,當(dāng)沒有對自動化測試完整性給予應(yīng)有的關(guān)注的時候,發(fā)生了富有喜劇性的情況。我們應(yīng)該在多大程度上相信自動化化測試執(zhí)行結(jié)果?自動化測試執(zhí)行中的誤報(bào)告警是很大的問題。測試人員特別討厭由于測試腳本自身的問題或者是測試環(huán)境的問題導(dǎo)致測試執(zhí)行失敗,但是,對于自動化測試誤報(bào)告警的情況,大家往往無能為力。你期望自己設(shè)計(jì)的測試對 BUG 很敏感、有效,當(dāng)測試發(fā)現(xiàn)異常的時候,能夠報(bào)告測試執(zhí)行失敗。有的測試框架支持對特殊測試結(jié)果的分類方法,分類包括 PASS , FAIL 和第三種測試結(jié)果 NOTRUN 或者 UNRESOLVED 。無論你怎么稱呼第三種測試結(jié)果,它很好的說明了由于某些測試失敗導(dǎo)致其他測試用例無法執(zhí)行而并非執(zhí)行失敗的情況。得到正確的測試結(jié)果是自動化測試完整性定義的一部分,另一部分是能夠確認(rèn)執(zhí)行成功的測試確確實(shí)實(shí)已經(jīng)執(zhí)行過了。我曾經(jīng)在一個測試隊(duì)列中發(fā)現(xiàn)一個 BUG ,這個 BUG 引起測試隊(duì)列中部分測試用例被跳過,沒有執(zhí)行。當(dāng)測試隊(duì)列運(yùn)行完畢后,沒有上報(bào)任何錯誤,我不得不通過走讀代碼的方式發(fā)現(xiàn)了這個 BUG 。如果,我沒有關(guān)注到這個 BUG ,那么可能在認(rèn)識到自動化測試已經(jīng)出現(xiàn)問題之前,還在長時間運(yùn)行部分測試用例。

獨(dú)立性: 采用自動化方法不可能達(dá)到和手工測試同樣的效果。當(dāng)寫手工測試執(zhí)行的規(guī)程時候,通常假定測試執(zhí)行將會由一個有頭腦、善于思考、具有觀察力的測試人員完成的。如果采用自動化,測試執(zhí)行是由一臺不會說話的計(jì)算機(jī)完成的,你必須告訴計(jì)算機(jī)什么樣的情況下測試執(zhí)行是失敗的,并且需要告訴計(jì)算機(jī)如何恢復(fù)測試場景才能保證測試套可以順利執(zhí)行。自動化測試可以作為測試套的一部分或者作為獨(dú)立的測試執(zhí)行。測試都需要建立自己所需要的測試執(zhí)行環(huán)境,因此,保證測試執(zhí)行的獨(dú)立性是唯一的好方法。手工回歸測試通常都相關(guān)的指導(dǎo)文檔,以便一個接著一個有序地完成測試執(zhí)行,每個測試執(zhí)行可以利用前一個測試執(zhí)行創(chuàng)建的對象或數(shù)據(jù)記錄。手工測試人員可以清楚地把握整個測試過程。在自動化測試中采用上述方法是經(jīng)常犯的錯誤,這個錯誤源于 “ 多米諾骨牌 ” 測試套,當(dāng)一個測試執(zhí)行失敗,會導(dǎo)致后續(xù)一系列測試失敗。更糟糕的是,所有的測試關(guān)聯(lián)緊密,無法獨(dú)立的運(yùn)行。并且,這使得在自動化測試中分析合法的執(zhí)行失敗結(jié)果也困難重重。當(dāng)出現(xiàn)這種情況后,人們首先開始懷疑自動化測試的價值。自動化測試的獨(dú)立性要求在自動化測試中增加重復(fù)和冗余設(shè)計(jì)。具有獨(dú)立性的測試對發(fā)現(xiàn)的缺陷的分析有很好的支持。以這種方式設(shè)計(jì)自動化測試好像是一種低效率的方式,不過,重要的是在不犧牲測試的可靠性的前提下保證測試的獨(dú)立性,如果測試可以在無需人看守情況下運(yùn)行,那么測試的執(zhí)行效率就不是大問題了。

可重復(fù)性: 自動化測試有時能夠發(fā)現(xiàn)問題,有時候又無法發(fā)現(xiàn)問題,對這種情況實(shí)在沒有什么好的的處理辦法。因此,需要保證每次測試執(zhí)行的時候,測試是以同樣的方式工作。這意味著不要采用隨機(jī)數(shù)據(jù),在通用語言庫中構(gòu)造的隨機(jī)數(shù)據(jù)經(jīng)常隱藏初始化過程,使用這些數(shù)據(jù)會導(dǎo)致測試每次都以不同的方式執(zhí)行,這樣,對測試執(zhí)行的失敗結(jié)果分析是很讓人沮喪的。這里有兩個使用隨機(jī)數(shù)據(jù)發(fā)生器的的方法可以避免上述情況。一種方法是使用常量初始化隨機(jī)數(shù)據(jù)發(fā)生器。如果你打算生成不同種類的測試,需要在可預(yù)測,并且可控制的情況下建立不同類型的隨機(jī)數(shù)據(jù)發(fā)生器。另外一個辦法是提前在文件中或數(shù)據(jù)庫中建立生成隨機(jī)測試數(shù)據(jù),然后在測試過程中使用這些數(shù)據(jù)。這樣做看起來似乎很好,但是我卻曾經(jīng)看到過太多違反規(guī)則的做法。下面我來解釋到底看到了什么。當(dāng)手動執(zhí)行測試的時候,往往匆匆忙忙整理文件名和測試數(shù)據(jù)記錄。當(dāng)對這些測試采用自動化測試方法,該做哪些工作呢?辦法之一是,可以為測試中使用的數(shù)據(jù)記錄給固定的命名。如果這些數(shù)據(jù)記錄在測試完成后還要繼續(xù)使用,那么就需要制定命名規(guī)則,避免在不同的測試中命名沖突,采用命名規(guī)則是一種很好的方法。然而,我曾經(jīng)看到有些測試只是隨機(jī)的命名數(shù)據(jù)記錄,很不幸,事實(shí)證明采用這種隨機(jī)命名的方式不可避免的導(dǎo)致命名沖突,并且影響測試的可重復(fù)性。很顯然,自動化工程師低估了命名沖突的可能性。下面的情況我遇到過兩次,測試數(shù)據(jù)記錄的名字中包含四個隨機(jī)產(chǎn)生的數(shù)字,經(jīng)過簡單的推算如果我們采用這種命名方式的時候,如果測試使用了 46 條記錄,會存在 10% 沖突的可能性,如果使用 118 條記錄,沖突的幾率會達(dá)到 50% 。我認(rèn)為測試當(dāng)中使用這種隨機(jī)命名是出于偷懶的想法 —— 避免再次測試之前寫代碼清除老的數(shù)據(jù)記錄,這樣引入了問題,損害了測試的可靠性和測試的完整性。

測試庫: 自動化測試的一個通用策略是開發(fā)可以在不同測試中應(yīng)用的測試函數(shù)庫。我曾經(jīng)看到過很多測試函數(shù)庫,自己也寫了一些。當(dāng)要求測試不受被測試產(chǎn)品接口變動影響的時候,采用測試庫方法是非常有效的。不過,根據(jù)我的觀察測試庫已經(jīng)使用的太多了,已經(jīng)被濫用了,并且測試庫往往設(shè)計(jì)的不好,沒有相關(guān)的文檔支撐,因此,使用測試庫的測試往往很難開展。當(dāng)發(fā)現(xiàn)問題的時候,往往不知道是測試庫自身的問題,還是測試庫的使用問題。由于測試庫往往很復(fù)雜,即便在發(fā)現(xiàn)測試庫存在問題,相關(guān)的維護(hù)人員也很不愿意去修改問題。通過前文中的論述,可以得出結(jié)論,在一開始就應(yīng)該保證測試庫設(shè)計(jì)良好。但是,實(shí)際情況是測試自動化往往沒有花費(fèi)更多的精力去保證一個優(yōu)良設(shè)計(jì)的測試庫。我曾經(jīng)看到有些測試庫中的功能根本不再使用了或僅僅使用一次。這與極限編程原則保持一致,即 " 你將不需要它 " 。這會導(dǎo)致在測試用例之間的代碼出現(xiàn)一些重復(fù),我發(fā)現(xiàn)微小的變化可能仍然存在,很難與測試庫功能協(xié)調(diào)。你可能打算對測試用例作修改,采用源代碼的方式比采用庫的方式更容易修改。如果有幾個測試,他們有某些共同的操作,我使用剪切和粘貼的方式去復(fù)制代碼,有的人認(rèn)為我采用的方法不可理喻。這允許我根據(jù)需要修改通用代碼,我不必一開始嘗試和猜測如何重用代碼。我認(rèn)為我的測試是很容易讀懂的,因?yàn)殚喿x者不必關(guān)心任何測試庫的語法。這種辦法的優(yōu)勢是很容易理解測試,并且很方便擴(kuò)展測試套。在開發(fā)軟件測試項(xiàng)目的時候,大多數(shù)程序員找到與他們打算實(shí)現(xiàn)功能類似的源代碼,并對源代碼做修改,而不是從頭開始寫代碼。同樣,在寫測試套的過程中可以采用上述方法,這也是代碼開發(fā)方式所鼓勵的方法。我比較喜歡寫一些規(guī)模比較小的測試庫,這些庫可以被反復(fù)的使用。測試庫的開發(fā)需要在概念階段充分定義,并且文檔化,從始至終都應(yīng)該保持。我會對測試庫作充分的測試后,才在測試中使用這些測試庫。采用測試庫是對所有面臨的情況作權(quán)衡的。千萬不要打算寫一個大而全的測試庫,不要希望有朝一日測試人員會利用你的測試庫完成大量的測試,這一天恐怕永遠(yuǎn)不會到來。

數(shù)據(jù)驅(qū)動測試: 把測試數(shù)據(jù)寫入到簡單表格中,這種測試技術(shù)得到了越來越廣泛的應(yīng)用,這種方法被稱為表驅(qū)動( table-driven ),數(shù)據(jù)驅(qū)動 (data-driven) 或者 “ 第三代 ” 自動化測試( "third generation" automation )。這需要寫一個解析器,用來解釋表格中的數(shù)據(jù),并執(zhí)行測試。該測試架構(gòu)的最主要的好處是,它允許把測試內(nèi)容寫在具有一定格式的表格中,這樣方便數(shù)據(jù)設(shè)計(jì)和數(shù)據(jù)的檢視。如果測試組中有缺少編程經(jīng)驗(yàn)的業(yè)務(wù)專家參與測試,采用數(shù)據(jù)驅(qū)動測試方法是很合適的。數(shù)據(jù)驅(qū)動測試的解析器主要是由測試庫和上層的少量開發(fā)語言寫成的代碼組成的,所以,上面關(guān)于測試庫的說明放在這里是同樣合適的。在針對上面提到的少量代碼的設(shè)計(jì)、開發(fā)、測試的工作,還存在各種困難。代碼所采用的編程語言是不斷發(fā)展的。也許,測試人員認(rèn)為他們需要把第一部分測試的輸出作為第二部分測試的輸入,這樣,加入了新的變量。接下來,也許有人需要讓測試中的某個環(huán)節(jié)運(yùn)行一百次,這樣加入一個循環(huán)。你可以采用其他語言,不過,如果你預(yù)料到會面臨上述情況的時候,那么做好采用一些能夠通過公開的渠道獲取的編程語言,比如 Perl,Python 或者 TCL ,這樣比設(shè)計(jì)你自己的語言要快的多。

啟發(fā)式確認(rèn): 我曾經(jīng)看到很多測試自動化沒有真正意義上的結(jié)果校驗(yàn),其原因有兩個,一個原因是做完全意義上的自動化測試結(jié)果確認(rèn)從技術(shù)上講是很困難的,另外一個原因是通過測試設(shè)計(jì)規(guī)格很難找出自動化測試的預(yù)期結(jié)果。這很不幸。不過,采用手工校驗(yàn)測試結(jié)果的方法是真正意義上的測試校驗(yàn)。標(biāo)準(zhǔn)文件( Gold file )是另外一中校驗(yàn)測試結(jié)果的方法。首先,捕獲被測試程序的輸出,并檢視程序的輸出,然后,把輸出信息文檔化,并歸檔,作為標(biāo)準(zhǔn)文件。以后,自動化測試結(jié)果與標(biāo)準(zhǔn)文件作比較,從而達(dá)到結(jié)果校驗(yàn)的目的。采用標(biāo)準(zhǔn)文件的方法,也有弊端。當(dāng)產(chǎn)品發(fā)生變化,自動化測試的環(huán)境配置發(fā)生變化,產(chǎn)品的輸出發(fā)生變化的時候,采用標(biāo)準(zhǔn)文方法,會上報(bào)大量的誤報(bào)告警。做好的測試結(jié)果校驗(yàn)方法是,對輸出結(jié)果的特定內(nèi)容作分析,并作合理的比較。有時候,很難知道正確的輸出結(jié)果是什么樣的,但是你應(yīng)該知道錯誤的輸出結(jié)果是什么樣的。開展啟發(fā)式的結(jié)果校驗(yàn)是很有幫助的。我猜想一些人在自動化測試中設(shè)計(jì)了大而全的測試結(jié)果校驗(yàn)方法,是因?yàn)閾?dān)心如果結(jié)果校驗(yàn)漏掉了任何信息,可能導(dǎo)致自動化測試自身出現(xiàn)錯誤。不過,我們在測試過程中往往采用折衷的做法,沒有采用大而全的測試結(jié)果校驗(yàn)方法,這樣就不得不面對少量漏測情況的出現(xiàn)的風(fēng)險。自動化測試不能改變這種情況的出現(xiàn)。如果自動化工程師不習(xí)慣采用這種折衷的方法,那么他必須找相關(guān)人員咨詢,尋找一種合適的測試結(jié)果校驗(yàn)策略,這需要有很大的創(chuàng)造性。目前有很多技術(shù)可以保證在不產(chǎn)生誤報(bào)告警的情況下,找到被測試產(chǎn)品的缺陷。

把注意力放在通過設(shè)計(jì)保證測試的可延續(xù)性上,選擇一個合適的測試體系架構(gòu),你將進(jìn)一步邁向成功的自動化測試。

步驟六:有計(jì)劃的部署

在前面的故事中,當(dāng)自動化工程師沒有提供打包后的自動化測試程序給測試執(zhí)行人員,會影響到測試執(zhí)行,測試執(zhí)行人員不得不反過來求助自動化工程師指出如何使用自動化測試程序。

作為自動化工程師,你知道如何利用自動化方法執(zhí)行測試和分析執(zhí)行失敗的結(jié)果。不過,測試執(zhí)行人員卻未必知道如何使用自動化測試。因此,需要提供自動化測試程序的安裝文檔和使用文檔,保證自動化測試程序容易安裝和配置。當(dāng)安裝的環(huán)境與安裝的要求不匹配,出現(xiàn)安裝錯誤的時候,能夠給出有價值的提示信息,便于定位安裝問題。

能夠把自動化測試程序和測試套作為產(chǎn)品對待,那真是太好了。你應(yīng)該對自動化測試程序和測試套開展測試,保證它們不依賴于任何專用的庫或者是設(shè)備上的任何其他程序。

保證其他測試人員能夠隨時利用已經(jīng)提供的自動化測試程序和測試套開展測試工作;保證自動化測試是符合一般測試執(zhí)行人員的思維習(xí)慣的;保證測試執(zhí)行人員能夠理解測試結(jié)果,并能夠正確分析失敗的測試執(zhí)行結(jié)果;這需要自動化工程師提供自動動化測試相關(guān)的指導(dǎo)性文檔和培訓(xùn)。

作為測試管理者,你希望在自動化工程師離開前,能夠識別并修改測試套中的所有問題。自動化工程師遲早會離開的,如果你沒有及時的把測試套中的問題提出來,就會面臨廢棄已有的測試套的決定。

良好的測試套有多方面的用處。良好的測試套支持對產(chǎn)品新版本的測試;良好的測試套在新的軟件平臺上可以很方便的驗(yàn)證產(chǎn)品的功能;良好的測試套支持每天晚上開始的軟件每日構(gòu)造過程;甚至開發(fā)人員在代碼 check in 之前,用良好的測試套驗(yàn)證代碼的正確性。

測試套的共享也很重要。很難預(yù)見以后什么人會繼續(xù)使用你開發(fā)的測試套。因此,盡量讓產(chǎn)品開發(fā)測試團(tuán)隊(duì)中的成員都很容易獲得你的測試套??梢园褱y試套放在公司的內(nèi)部網(wǎng)絡(luò)上,這是個很好的辦法。這樣,大家就不必為了獲取一份需要的測試套而四處打聽。有些人總是感覺自己的測試套還沒有最終完工或者不夠完美,而沒有拿出來與人分享,這種做法一定要改變,共享出來的測試套不一定非常完美,共享才是關(guān)鍵。

有計(jì)劃的自動化測試部署,保證你的測試套能夠被產(chǎn)品相關(guān)人員獲取到,你就向成功的自動化測試又邁進(jìn)了一步。并且你的自動化測試會被一次又一次的重用。

步驟七:面對成功的挑戰(zhàn)

當(dāng)你完成了所有的事情,測試套已經(jīng)文檔化了,并且文檔已經(jīng)交付了。測試執(zhí)行人員能夠理解要開展的測試,并知道如何完成測試執(zhí)行。隨著你所負(fù)責(zé)產(chǎn)品的進(jìn)一步開發(fā)和維護(hù),測試被反復(fù)重用。雖然,在自動化使測試變簡單的同時,也總是使測試過程復(fù)雜化。測試人員需要學(xué)習(xí)如何診斷自動化測試執(zhí)行失敗的情況,如果不這樣做,測試執(zhí)行人員會認(rèn)為執(zhí)行失敗的情況是由自動化引起,然后,自動化工程師被叫過來幫助診斷每一個執(zhí)行失敗的情況,開發(fā)人員往往也會認(rèn)為執(zhí)行失敗是由于自動化測試自身引起的問題,這樣,測試執(zhí)行人員就不得不學(xué)習(xí)通過手工的方式,或者通過采用少量腳本的方式重現(xiàn)自動化測試發(fā)現(xiàn)的問題,以證明他們確實(shí)發(fā)現(xiàn)了產(chǎn)品當(dāng)中的 BUG 。

測試套的相關(guān)工作還沒有結(jié)束,為了提高測試覆蓋率或者測試新的產(chǎn)品特性,需要增加更多的測試。如果已有的測試不能正常工作,那么需要對之修改;如果已有的測試是冗余的,那么需要刪除這部分測試。

隨著時間的推移,開發(fā)人員也會研究你設(shè)計(jì)的測試,改進(jìn)產(chǎn)品的設(shè)計(jì)并且通過模擬你的測試過程對產(chǎn)品做初步測試,研究如何使產(chǎn)品在第一次測試就通過,這樣,你設(shè)計(jì)的測試很可能無法繼續(xù)發(fā)現(xiàn)新的問題,這種現(xiàn)象被稱為一種殺蟲劑悖論。這時候,會有人對你的測試有效性提出質(zhì)疑,那么,你必須考慮是否應(yīng)該挖掘更嚴(yán)格的測試,以便能夠發(fā)現(xiàn)開發(fā)人員優(yōu)化之后的產(chǎn)品中的缺陷。

以前,我提到過一個基本上無法實(shí)現(xiàn)的設(shè)想,設(shè)想通過按下一個按鈕就完成了所有的測試工作。自動化測試是不是全能的,手工測試是永遠(yuǎn)無法完全替代的。

有些測試受測試環(huán)境的影響很大,往往需要采用人工方法獲取測試結(jié)果,分析測試結(jié)果。因此,很難在預(yù)先知道設(shè)計(jì)的測試用例有多大的重用性。自動化測試還需要考慮成本問題,因此,千萬不要陷入到一切測試都采用自動化方法的錯誤觀念中。

我曾經(jīng)主張保證給與測試自動化持續(xù)不斷的投入。但是,在開展自動化測試的時候,一個問題擺在面前,測試自動化應(yīng)該及時的提供給測試執(zhí)行人員,這個不成問題,但是如何保證需求變更后,能夠及時提供更新后的自動化測試就是個大問題了。如果自動化測試與需求變更無法同步,那么自動化測試的效果就無法保證了,測試人員就不愿意花費(fèi)時間學(xué)習(xí)如何使用新的測試工具和如何診斷測試工具上報(bào)的錯誤。識別項(xiàng)目計(jì)劃中的軟件發(fā)布日期,然后把這個日期作為里程碑,并計(jì)劃達(dá)到這個里程碑。當(dāng)達(dá)到這個里程碑后,自動化工程師應(yīng)該做什么呢?如果自動化工程師關(guān)注當(dāng)前產(chǎn)品版本的發(fā)布,他需要為測試執(zhí)行人員提供幫助和咨詢,但是,一旦測試執(zhí)行人員知道如何使用自動化測試,自動化測試工程師可以考慮下一個版本的測試自動化工作,包括改進(jìn)測試工具和相關(guān)的庫。當(dāng)開發(fā)人員開始設(shè)計(jì)產(chǎn)品下一個版本中的新特性的時候,如果考慮了自動化測試需求,那么自動化測試師的設(shè)計(jì)工作就很好開展了,采用這種方法,自動化測試工程師可以保持與開發(fā)周期同步,而不是與測試周期同步。如果不采用這種方式,在產(chǎn)品版本升級的過程中,自動化測試無法得到進(jìn)一步的改進(jìn)。

持續(xù)在在自動化投入,你會面臨成功的挑戰(zhàn),當(dāng)自動化測試成為測試過程可靠的基礎(chǔ)后,自動化測試的道路將會越來越平坦。

參考文獻(xiàn):

Bach, James. 1996. “Test Automation Snake Oil.” Windows Technical Journal , (October): 40-44. http://www./articles/test_automation_snake_oil.pdf

Dustin, Elfriede. 1999. “Lessons in Test Automation.” Software Testing and Quality Engineering (September): 16-22.
http://www./sitewide.asp?ObjectId=1802&ObjectType=ART&Function=edetail

Fewster, Mark and Dorothy Graham. 1999. Software Test Automation , Addison-Wesley.

Groder, Chip. “Building Maintainable GUI Tests” in [Fewster 1999].

Kit, Edward. 1999. “Integrated, Effective Test Design and Automation.” Software Development (February). http://www./articles/1999/9902/9902b/9902b.htm

Hancock, Jim. 1997 “When to Automate Testing.” Testers Network (June).
http://www./Testers‘Network/jimauto1.htm

Hendrickson, Elisabeth. 1999. “Making the Right Choice: The Features you Need in a GUI Test Automation Tool.” Software Testing and Quality Engineering Magazine (May): 21-25. http://www./feature/mtrc.pdf

Hoffman, Douglas. 1999. “Heuristic Test Oracles: The Balance Between Exhaustive Comparison and No Comparison at All.” Software Testing and Quality Engineering Magazine (March): 29-32.

Kaner, Cem. 1997. “Improving the Maintainability of Automated Test Suites.” Presented at Quality Week. http://www./lawst1.htm

Linz , Tilo and Matthias Daigl. 1998. “How to Automate Testing of Graphical User Interfaces.” European Systems and Software Initiative Project No. 24306 (June). http://www./html/GUI/AQUIS-full_paper-1.3.html

Jeffries, Ronald E., 1997, “XPractices,”
http://www.XProgramming.com/Practices/xpractices.htm

Marick, Brian. 1998. “When Should a Test Be Automated?” Presented at Quality Week. http://www./writings/automate.pdf

Marick, Brian. 1997. “Classic Testing Mistakes.” Presented at STAR. http://www./writings/classic/mistakes.html

Pettichord, Bret. 1996. “Success with Test Automation.” Presented at Quality Week (May). http://www./~wazmo/succpap.htm

Thomson, Jim. “A Test Automation Journey” in [Fewster 1999]

Weinberg, Gerald M. 1992. Quality Software Management: Systems Thinking . Vol 1. Dorset House.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多