張歡,李繼安,張紅金
(工業(yè)和信息化部電子第五研究所,廣東 廣州 510610)
隨著軟件規(guī)模的不斷擴(kuò)大,軟件設(shè)計(jì)的復(fù)雜程度的不斷提高,軟件開發(fā)中出現(xiàn)錯誤或缺陷的機(jī)會越來越大。隨著軟件產(chǎn)業(yè)化的發(fā)展,人們對軟件的質(zhì)量、成本和進(jìn)度提出了更高的要求。由于人們對于軟件質(zhì)量的重視程度越來越高,就導(dǎo)致了軟件測試在軟件開發(fā)中的地位越來越重要,而軟件測試是目前用來驗(yàn)證軟件是否能夠完成所期望的功能的唯一有效的方法。
軟件測試一般分為手工測試和自動化測試。軟件規(guī)模的擴(kuò)大給測試工作帶來了很多問題,手工測試的速度太慢,效率太低。一種成熟的軟件自動化測試機(jī)制,是可以在機(jī)器空閑時執(zhí)行無用戶參與的自動化測試的。自動化測試是可重復(fù)的測試,并且在相同的測試案例中可以使用完全相同的測試數(shù)據(jù)進(jìn)行再測試,可以做到以最小的代價(jià)進(jìn)行全面的系統(tǒng)測試。自動化測試可以高效地完成一些重復(fù)性測試,降低人為因素對測試過程的干擾,排除測試的隨機(jī)性和盲目性,降低冗余,減少遺漏等。
軟件自動化測試就是執(zhí)行某種程序設(shè)計(jì)語言編制的自動測試程序,控制被測軟件的執(zhí)行,模擬手動測試步驟,完成全自動或半自動測試。自動化測試就是通過自動化測試工具或其他手段,按照測試工程師的預(yù)定計(jì)劃進(jìn)行的自動測試,目的是減輕手工測試的勞動量,從而達(dá)到提高軟件質(zhì)量的目標(biāo)。自動化測試的目的在于發(fā)現(xiàn)老缺陷,而手工測試的目的在于發(fā)現(xiàn)新缺陷。測試自動化涉及到測試流程、測試體系、自動化編譯、持續(xù)集成、自動發(fā)布測試系統(tǒng)和自動化測試等方面的整合,也就是說要讓測試能夠?qū)崿F(xiàn)自動化,不僅是技術(shù)、工具的問題,更是一個公司和組織的文化問題。
自動化測試最初是通過外部的手段來錄制測試的操作過程,再回放其過程從而達(dá)到自動化測試的目的。隨著研究的不斷深入,又誕生了基于數(shù)據(jù)驅(qū)動、基于領(lǐng)域驅(qū)動和基于功能驅(qū)動等多種不同的自動化測試技術(shù)。自動化測試技術(shù)的誕生不僅提高了測試的效率,同時也提高了測試的精度。雖不能完全取代手動測試工作,但也對測試技術(shù)的發(fā)展起到了巨大的推動作用。就目前的操作系統(tǒng)而言,主要的自動化測試技術(shù)有以下幾種。
a)phoronixtestsuite
可支持多種類型操作系統(tǒng)的性能測試,但其配置文件的處理方式簡單、不利于擴(kuò)展添加。
b)Autotest
支持Linux系統(tǒng)內(nèi)核的自動化測試,但其搭建困難、對支撐軟件版本要求嚴(yán)格,暫不支持國產(chǎn)平臺搭建。
c)linuxdesktoptestingproject
用于功能的自動化測試,但其腳本重用率低、對測試人員的要求較高。
通過分析操作系統(tǒng)測試標(biāo)準(zhǔn),以及現(xiàn)有的工具情況,本文提出了一種基于過程的自動化測試模型,通過對測試過程的抽象來達(dá)到自動化測試的目的。該模型將測試過程中使用的測試用例、測試腳本和測試數(shù)據(jù)按照預(yù)定的準(zhǔn)則進(jìn)行標(biāo)準(zhǔn)化,并以配置文件的形式進(jìn)行執(zhí)行過程的編輯,最后通過腳本驅(qū)動將配置文件內(nèi)容轉(zhuǎn)化為自動化測試流程。
國產(chǎn)操作系統(tǒng)自動化測試框架主要包括測試工具庫、接口庫、測試腳本庫、測試數(shù)據(jù)結(jié)構(gòu)和測試驅(qū)動等,結(jié)構(gòu)如圖1所示。
圖1 自動化測試框架
a)測試工具庫
主要用于存儲測試工具,以及執(zhí)行配置文件,在配置文件中按照預(yù)定義標(biāo)準(zhǔn)將測試工具在執(zhí)行測試時的執(zhí)行過程進(jìn)行腳本化抽象,測試執(zhí)行時測試驅(qū)動會對該配置文件進(jìn)行 “翻譯”,將其轉(zhuǎn)換為可執(zhí)行的shell腳本。
b)接口庫
主要用于存儲操作系統(tǒng)的操作接口,包括操作系統(tǒng)的遠(yuǎn)端連接接口、執(zhí)行監(jiān)控接口、日志提取接口和命令執(zhí)行接口等。
c)測試腳本庫
主要用于存儲操作系統(tǒng)功能測試腳本和接口腳本。由于國產(chǎn)操作系統(tǒng)的非圖形化功能都可通過命令行來實(shí)現(xiàn),因而通過設(shè)計(jì)自動化測試腳本,自動執(zhí)行并返回系統(tǒng)執(zhí)行結(jié)果可有效地幫助測試人員節(jié)省測試的時間。
d)測試數(shù)據(jù)結(jié)構(gòu)
主要用于存儲測試結(jié)果的數(shù)據(jù)結(jié)構(gòu)及組成,由于不同種類的測試工具或測試腳本執(zhí)行所得到的測試結(jié)果的數(shù)據(jù)結(jié)構(gòu)并不完全相同,因此,為了保證系統(tǒng)的可擴(kuò)展性,可自定義測試數(shù)據(jù)的解析方法。
自動化測試框架分為用戶接口層、業(yè)務(wù)處理層和數(shù)據(jù)處理層,如圖2所示。
圖2 自動化測試框架業(yè)務(wù)模型
a)用戶接口層
用戶接口層提供了使用該平臺的一整套API,通過這些API用戶可以方便地進(jìn)行機(jī)器性能測試,包括測試用例選擇、測試機(jī)器選擇、查看測試結(jié)果和查看每個機(jī)器的運(yùn)行狀態(tài)等功能。這些API以soap協(xié)議方式和本地調(diào)用兩種方式提供給用戶使用,包括機(jī)器信息模塊、測試用例模塊、測試記錄模塊、啟動測試模塊和運(yùn)行時監(jiān)控模塊。
b)業(yè)務(wù)處理層
業(yè)務(wù)處理層接收測試作業(yè),然后安排測試作業(yè)的執(zhí)行。實(shí)現(xiàn)方式是為每個測試機(jī)器建立一個單獨(dú)的線程,專門處理該機(jī)器的測試任務(wù)。根據(jù)系統(tǒng)的資源耗用程度來動態(tài)地調(diào)整測試任務(wù)分配方式,保證在系統(tǒng)健康、平穩(wěn)運(yùn)行的過程中使得每個測試任務(wù)都得以完成。
c)數(shù)據(jù)處理層
負(fù)責(zé)和數(shù)據(jù)庫交互,提供系統(tǒng)運(yùn)行時所需要的數(shù)據(jù),以及保存運(yùn)行時所產(chǎn)生的數(shù)據(jù)。對上提供查詢數(shù)據(jù)服務(wù),業(yè)務(wù)處理層需要的數(shù)據(jù)全部由數(shù)據(jù)處理層提供,包括查詢機(jī)器信息、查詢測試用例信息和查詢測試記錄信息等。
2.3.1 企業(yè)自動化系統(tǒng)性能測試
自動化系統(tǒng)性能測試的著重點(diǎn)是準(zhǔn)確地獲取系統(tǒng)在某一狀態(tài)下的性能指標(biāo)。
a)測試的準(zhǔn)確性
自動化系統(tǒng)性能測試通過模擬用戶操作,對服務(wù)器發(fā)起負(fù)載,同時監(jiān)控服務(wù)器的狀態(tài),考察系統(tǒng)業(yè)務(wù)的響應(yīng)時間和資源之間的關(guān)系,從而獲取系統(tǒng)的性能指標(biāo)。通過工作負(fù)載分析,建立盡可能地接近實(shí)際情況的測試場景,同時通過一系列的測試前準(zhǔn)備工作,以及測試采樣設(shè)置,減少性能測試中的干擾因素。
b)節(jié)約測試成本
進(jìn)行性能測試的成本,特別是硬件成本很大。在保證測試準(zhǔn)確性的基礎(chǔ)上,可通過以下方式來節(jié)約測試成本,例如:在企業(yè)員工的機(jī)器上安裝負(fù)載生成器,每臺機(jī)器在測試時分擔(dān)一小塊的負(fù)載生成任務(wù)。
c)減少手工工作量
性能測試需要使用大量的不同用戶帳號進(jìn)行操作,手工創(chuàng)建這些用戶帳號信息以及設(shè)置權(quán)限等工作量非常大,借助自動化捕獲回放工具可以完成這部分工作,同時使用前面的自動化系統(tǒng)回歸測試框架進(jìn)行關(guān)鍵功能的冒煙測試。
2.3.2 企業(yè)自動化系統(tǒng)性能測試框架的構(gòu)建
性能測試小組搭建和配置標(biāo)準(zhǔn)版本的系統(tǒng)軟硬件環(huán)境,并安裝性能監(jiān)控器部件,然后部署小組從版本管理系統(tǒng)上將穩(wěn)定的代碼待測版本取下,進(jìn)行構(gòu)建并部署到專門的性能測試環(huán)境,完成系統(tǒng)的配置和初始化。系統(tǒng)在進(jìn)行性能測試前經(jīng)過自動化系統(tǒng)回歸測試框架的冒煙測試,驗(yàn)證系統(tǒng)的基本功能是否正常,同時通過自動化工具進(jìn)行測試用數(shù)據(jù)的創(chuàng)建,例如:用戶帳號信息、權(quán)限和其他的測試實(shí)體,盡可能地減輕手工工作量。在這些任務(wù)完成后性能測試小組根據(jù)工作負(fù)載模型和測試用例,創(chuàng)建和執(zhí)行測試腳本和場景,收集并分析測試數(shù)據(jù),得出系統(tǒng)的性能指標(biāo)。
如果測試活動自動化在多數(shù)情況下可提供其最大價(jià)值,如對軟件進(jìn)行的功能性測試,是測試系統(tǒng)在做什么,這些測試可以明確地知道應(yīng)該在什么情況下輸入什么,會有什么樣的輸出。這樣的測試就很容易被自動化,也能從自動化中取得較大的效果。對軟件進(jìn)行的性能測試包括在不同的系統(tǒng)負(fù)載下進(jìn)行的測試,這些測試需要采用工具輔助完成,也非常適合于采用自動化。自動化測試,可以提高某些測試任務(wù)的執(zhí)行效率,除此之外,其還有以下幾個優(yōu)點(diǎn)。
a)對程序的回歸測試更方便
軟件測試實(shí)行自動化進(jìn)程是因?yàn)闇y試工作的需要,更準(zhǔn)確地說是回歸測試和系統(tǒng)測試的需要。由于回歸測試的動作和用例是完全設(shè)計(jì)好的,測試期望的結(jié)果也是完全可以預(yù)料的,將回歸測試自動運(yùn)行,可以極大地提高測試效率,縮短測試的時間。
b)可以執(zhí)行一些手工測試有困難或不可能進(jìn)行的測試
比如:對于大量用戶的測試,不可能讓足夠多的測試人員同時進(jìn)行測試,但是卻可以通過自動化測試同時模擬許多用戶,從而達(dá)到測試的目的。
c)更好地利用資源
將繁瑣的任務(wù)自動化,可以提高準(zhǔn)確性和測試人員的積極性,將測試技術(shù)人員解脫出來,以使他們投入更多的精力在設(shè)計(jì)更好的測試用例上。有些測試不適合于自動測試,僅適合于手工測試,將可自動測試的測試自動化后,可以讓測試人員專注于手工測試部分,提高手工測試的效率。
d)測試具有一致性和可重復(fù)性
由于測試是自動執(zhí)行的,每次測試的結(jié)果和執(zhí)行的內(nèi)容的一致性是可以得到保障的,從而達(dá)到測試可重復(fù)的效果。
e)測試的復(fù)用性
由于自動測試通常采用腳本技術(shù),這樣就有可能只需要做少量的甚至不做修改,實(shí)現(xiàn)在不同的測試過程中使用相同的用例。
f)其他
此外,手工不能做的事情,自動化測試能做,例如:負(fù)載、性能測試等。
在軟件測試自動化的實(shí)施過程中會遇到許多誤區(qū),比較普遍的有以下幾種。
a)不正確的觀念或不現(xiàn)實(shí)的期望
一般來說,人們對新技術(shù)的解決方案常常深信不疑,認(rèn)為可以解決面臨的所有問題,對測試工具也不例外。事實(shí)上,如果期望不現(xiàn)實(shí),無論工具如何先進(jìn),都滿足不了期望。
b)希望測試發(fā)現(xiàn)大量的新缺陷
測試運(yùn)行第一次時最有可能發(fā)現(xiàn)新缺陷。但是,如果測試已經(jīng)運(yùn)行,再次運(yùn)行相同的測試發(fā)現(xiàn)新缺陷的概率就小得多。
c)安全性錯覺
如果自動化測試沒有發(fā)現(xiàn)任何缺陷,并不意味著軟件沒有缺陷,可能是測試設(shè)計(jì)本身就有缺陷;并且,測試覆蓋率也不會達(dá)到百分之百。
d)自動化測試的維護(hù)性
當(dāng)軟件修改后,通常也需要修改部分測試,這樣必然導(dǎo)致對自動化測試的修改,所以在自動化測試的設(shè)計(jì)和實(shí)現(xiàn)時,要防止自動化測試帶來的好處被高維護(hù)成本所淹沒。
e)測試自動化可能會制約軟件的開發(fā)
由于自動測試比手動測試更脆弱,所以維護(hù)會受到限制,從而制約軟件的開發(fā)。
雖然測試自動化可以帶來非常明顯的收益,但也有其限制性。首先,其不能取代手工測試,手工測試比自動測試發(fā)現(xiàn)的缺陷更多,并且手工測試可以處理意外事件,雖然工具也能處理部分異常事件,但是其對真正的突發(fā)事件和不能由軟件解決的問題無能為力;其次,測試自動化對測試質(zhì)量的依賴性極大,并不能提高有效性,還可能會制約軟件的開發(fā)。
此外,對于周期短、時間緊迫的項(xiàng)目不宜采取自動化測試。由于推行自動化測試的前期工作相當(dāng)龐大,將自動化測試框架應(yīng)用到一個項(xiàng)目中也要評估其合適性,項(xiàng)目很可能被大量的測試框架的準(zhǔn)備和實(shí)施工作拖垮。
軟件測試自動化由于具有效率高、能快速全面地實(shí)行回歸測試等特點(diǎn),正在成為國內(nèi)外軟件界的熱點(diǎn)之一。但是,軟件自動化測試還不能解決軟件潛在的所有問題,為此,在自動化測試前的準(zhǔn)備工作中首先需要對軟件自動化測試有一個正確的認(rèn)識。軟件測試工具盡管能夠提高測試效率、覆蓋率和可靠性等,但是軟件的自動化測試過程是一個循序漸進(jìn)的過程,并不是一開始就對所有的測試實(shí)施自動化,同時這也是不現(xiàn)實(shí)的。自動化測試雖然有很多優(yōu)點(diǎn),但其實(shí)質(zhì)上還只是測試工作的一部分而已,是對手工測試的一種有益的完善與補(bǔ)充。如何規(guī)范自動化測試、選擇恰當(dāng)?shù)淖詣踊瘻y試工具,還有待于我們在具體的測試過程中去探索、去研究、去實(shí)踐。