楊 燕 劉 釗 蔡久濤
1(江西航天鄱湖云科技有限公司 江西 南昌 330096)
2(航天恒星科技有限公司 北京 100086)
3(金蝶軟件(中國)有限公司南昌分公司 江西 南昌 330096)
腳本化測試是先設(shè)計(jì)、再執(zhí)行,設(shè)計(jì)時就指定輸入值和預(yù)期結(jié)果,執(zhí)行時嚴(yán)格按照測試設(shè)計(jì)進(jìn)行。一方面隨著軟件應(yīng)用的發(fā)展,軟件出現(xiàn)了推出快、變化頻繁、接口雜、重體驗(yàn)、開放性等特點(diǎn),另一方面隨著測試的積累測試人員發(fā)現(xiàn)缺陷的類型增長緩慢。為了適用這種變化,也為了解決現(xiàn)存問題,需要引入新的測試技術(shù)。探索性測試作為一種前沿的測試思維,在項(xiàng)目周期短、需求不明確或者需求變更頻繁的項(xiàng)目中發(fā)現(xiàn)缺陷的效果顯著,也能發(fā)現(xiàn)一些腳本化測試發(fā)現(xiàn)不了的缺陷,因此受到越來越多軟件測試人員的青睞。
目前對探索性測試的研究主要集中在測試思想和方法上[1-3],近年來也有研究探索性測試在個別領(lǐng)域上的應(yīng)用。文獻(xiàn)[4]將探索性測試應(yīng)用到航空聲納軟件中能夠有效發(fā)掘軟件中隱藏的缺陷。文獻(xiàn)[5]研究表明,將探索性測試思維引入到軍用軟件中與傳統(tǒng)的軟件測試相結(jié)合,能有效提高軟件測試效率和測試覆蓋率。但是在實(shí)際工作中對實(shí)施探索性測試發(fā)現(xiàn)的缺陷特征及在不同測試階段的實(shí)施的研究甚少。本文通過對“同時進(jìn)行設(shè)計(jì)、測試和學(xué)習(xí)”的探索性測試進(jìn)行研究,總結(jié)出幾種可采用探索性測試的情況,并將探索性測試融入到傳統(tǒng)的測試流程體系中,再選取三個不同類型的項(xiàng)目進(jìn)行實(shí)踐來研究如何采用探索性測試方法開展軟件測試工作。
探索性測試最先由Cem Kaner在1983年提出,它是一種軟件測試風(fēng)格,也是一種測試思維[6]。這種測試思維不同于傳統(tǒng)軟件測試過程中嚴(yán)格的“先設(shè)計(jì),后執(zhí)行”,它將學(xué)習(xí)、測試設(shè)計(jì)和測試執(zhí)行整合在一起,測試人員通過不斷的學(xué)習(xí),并把學(xué)習(xí)到的關(guān)于軟件系統(tǒng)的更多信息通過綜合的整理和分析,創(chuàng)造出更多的關(guān)于測試的想法。它強(qiáng)調(diào)測試執(zhí)行、學(xué)習(xí)、測試設(shè)計(jì)的同時性,注重思考和學(xué)習(xí),通過思考和學(xué)習(xí)改善測試設(shè)計(jì)與測試執(zhí)行,不斷地發(fā)現(xiàn)新的缺陷。
探索性測試在軟件生命周期的任一階段均可使用,如:集成測試、系統(tǒng)測試、驗(yàn)收測試等;也適用于各種類型的測試,如:功能測試、可靠性測試、兼容性測試、易用性測試、性能測試、安全性測試等[7]。
不同于隨機(jī)測試,探索性測試是帶著“反思”的測試,通過對測試結(jié)果的分析和判斷,驅(qū)動下一步的測試設(shè)計(jì)和測試執(zhí)行,達(dá)到持續(xù)優(yōu)化測試價值的目的。隨機(jī)測試通常利用錯誤猜測、典型風(fēng)險來驗(yàn)證軟件,可以在短時間內(nèi)發(fā)現(xiàn)許多軟件錯誤,但是它不強(qiáng)調(diào)測試的系統(tǒng)性和完整性,漏測風(fēng)險很高。而探索性測試會拓展測試的深度和廣度,能夠發(fā)現(xiàn)一些隱藏較深的缺陷[6]。
探索性測試的指導(dǎo)方法有局部探索性測試和全局探索性測試兩種[6]。
局部探索性測試關(guān)注局部小范圍,測試時需要考慮5個部分:輸入、狀態(tài)、代碼路徑、用戶數(shù)據(jù)和執(zhí)行環(huán)境[6]。這5個部分的測試可按照傳統(tǒng)的腳本化測試用例設(shè)計(jì)方法進(jìn)行設(shè)計(jì)測試,如:輸入,可采用等價類劃分法、邊界值法、錯誤推測法等方法進(jìn)行測試[3]。
全局探索性測試也叫漫游測試,把全局探索性測試和旅游進(jìn)行類比,測試人員就是游客,被測軟件就是旅游地。旅游地按照功能區(qū)域劃分可劃分為:商業(yè)區(qū)、歷史區(qū)、旅游區(qū)、娛樂區(qū)、旅館區(qū)和破舊區(qū)[6]。各功能區(qū)域說明及測試要點(diǎn)如表1所示。
針對不同區(qū)域選取不同的測試方法進(jìn)行測試:商業(yè)區(qū)側(cè)重于測試用戶關(guān)注的核心業(yè)務(wù)和功能,可采用指南測試法、賣點(diǎn)測試法、地標(biāo)測試法、極限測試法、快遞測試法、深夜測試法、遍歷測試法;針對歷史區(qū)舊的功能和缺陷修復(fù)代碼可采用惡鄰測試法、博物館測試法、上一版測試法;娛樂區(qū)測試對應(yīng)到軟件上就是輔助功能,可采用配角測試法、深巷測試法、通宵測試法進(jìn)行測試;類比旅游區(qū)的可快速訪問功能的測試可采用收藏家測試法、長路徑測試法、超模測試、測一送一測試法;旅館區(qū)可采用取消測試法、懶漢測試法;破舊區(qū)測試可采用破壞測試法、反叛測試法、強(qiáng)迫癥測試法。
在實(shí)際測試工作中針對功能點(diǎn)的測試可以采用局部探索性測試,針對涉及到業(yè)務(wù)的場景及整體層面的可以采用全局探索性測試。
文獻(xiàn)[9]指出了采用探索性測試的情況,如:文檔資料缺乏;產(chǎn)品不穩(wěn)定、軟件版本較多;測試人員專業(yè)技能不足;沒有時間編寫測試計(jì)劃和測試腳本。根據(jù)對探索性測試的研究,結(jié)合項(xiàng)目測試管理經(jīng)驗(yàn),在以下情況下也可考慮采用探索性測試:
(1) 項(xiàng)目組人員調(diào)整后,新成員為了能夠在短時間內(nèi)快速了解系統(tǒng),可以執(zhí)行一次探索性測試。
(2) 在缺陷驗(yàn)證時,為了確認(rèn)修復(fù)缺陷時是否引入新缺陷,可以加入適當(dāng)圍繞該被測功能點(diǎn)的探索性測試,及時發(fā)現(xiàn)可能由修復(fù)帶來的新缺陷。
(3) 在完成常規(guī)測試且時間充沛的情況下進(jìn)行探索性測試可以檢查測試的完整性,拓展當(dāng)前測試的覆蓋度和深度。
(4) 出于對現(xiàn)存測試設(shè)計(jì)和結(jié)果存疑的情況下,可以執(zhí)行探索性測試來驗(yàn)證。
由于探索性測試不同于傳統(tǒng)的先設(shè)計(jì)、再執(zhí)行,它強(qiáng)調(diào)設(shè)計(jì)和測試的同時性,如果不講究方法、沒有重點(diǎn)地盲目進(jìn)行測試,就會出現(xiàn)重復(fù)測試和漏測的情況。在實(shí)際工作中,實(shí)施探索性測試也要保證測試覆蓋率。
文獻(xiàn)[10]提出將探索性測試和腳本測試的優(yōu)勢結(jié)合到混合測試過程中的方法。文獻(xiàn)[11]研究表明,將探索式軟件測試融入傳統(tǒng)測試模型,在每個階段測試執(zhí)行完成后進(jìn)行探索式測試可以提高測試覆蓋率。目前許多國內(nèi)外專家學(xué)者也認(rèn)可這種“腳本化為主、探索性測試為輔”的二者融合方案[7]。即執(zhí)行腳本化測試用例,又邊測試邊記錄新的測試點(diǎn),過程中不斷分析、不斷學(xué)習(xí),發(fā)現(xiàn)更多的腳本化測試發(fā)現(xiàn)不了的缺陷。
傳統(tǒng)的軟件測試一般嚴(yán)格按照測試需求分析、編寫測試計(jì)劃、測試計(jì)劃評審、編寫測試用例、測試用例評審、搭建測試環(huán)境、執(zhí)行測試、提交缺陷、修復(fù)缺陷、驗(yàn)證缺陷、回歸測試等流程執(zhí)行,測試流程如圖1所示。
圖1 傳統(tǒng)測試流程
隨著軟件應(yīng)用的發(fā)展,軟件出現(xiàn)了推出快、變化頻繁、接口雜、重體驗(yàn)、開放性等特點(diǎn)[12],測試也需要適當(dāng)進(jìn)行調(diào)整以適應(yīng)這種變化。文獻(xiàn)[13]表明,不論如何測試也不能保證軟件中不存在任何錯誤,但是通過測試策略可以努力使測試盡可能完全。
通過在傳統(tǒng)測試流程中加入探索性測試,分別分析在系統(tǒng)測試階段后和系統(tǒng)測試階段加入探索性測試發(fā)現(xiàn)的缺陷的有效性、在總?cè)毕輸?shù)中的占比及發(fā)現(xiàn)的缺陷類型,查看實(shí)施探索性測試對腳本化測試的助力到底如何。
在測試需求分析、設(shè)計(jì)測試用例及測試用例評審階段融入探索性測試思維,融入探索性測試后測試流程如圖2所示。
圖2 融入探索性測試后測試流程
在測試需求分析階段加入探索性測試,通過換位思考站在包括業(yè)務(wù)領(lǐng)域?qū)<?、用戶、?xiàng)目經(jīng)理、開發(fā)人員、公司管理者角度分析他們對需求規(guī)格的要求,也可以參考同類軟件或以前項(xiàng)目經(jīng)驗(yàn)等對其進(jìn)行探索性測試,從而發(fā)現(xiàn)更多隱形需求,進(jìn)而避免由于需求原因而埋下缺陷。
在設(shè)計(jì)測試用例階段加入探索性測試,將通過思考學(xué)習(xí)獲得的一切與軟件系統(tǒng)相關(guān)的信息設(shè)計(jì)成測試用例,意在通過執(zhí)行測試用例發(fā)現(xiàn)更多的需求規(guī)格說明中沒有明確說明的隱形或深層業(yè)務(wù)方面的缺陷。在測試用例評審階段加入探索性測試,通過借助眾人的智慧和經(jīng)驗(yàn),豐富用例設(shè)計(jì)內(nèi)容,減少漏測率。在執(zhí)行測試階段加入探索性測試,意在將測試人員的測試經(jīng)驗(yàn)和測試思想轉(zhuǎn)化為盡早發(fā)現(xiàn)的缺陷,降低后期缺陷修復(fù)成本。在驗(yàn)證缺陷階段加入探索性測試意在驗(yàn)證修復(fù)缺陷時是否影響到了其他模塊功能使用,是否引入新的缺陷。在回歸測試階段加入探索性測試意在確認(rèn)最終效果是否滿足用戶需要。
實(shí)施探索性測試的難點(diǎn)在于測試執(zhí)行環(huán)節(jié),執(zhí)行時面對持續(xù)變化的情況,由于測試人員的認(rèn)知不同,應(yīng)對方式也會不同。為了指導(dǎo)測試,探索性測試也需要進(jìn)行測試設(shè)計(jì),此工作可以在執(zhí)行前進(jìn)行,也可在執(zhí)行測試時進(jìn)行。探索性測試設(shè)計(jì)不局限于傳統(tǒng)的腳本化測試用例的設(shè)計(jì),需要包含:唯一標(biāo)識、摘要、描述、設(shè)計(jì)方法、測試階段、測試類型、預(yù)期結(jié)果、測試步驟等。探索性測試設(shè)計(jì)可以是思維導(dǎo)圖等,意在記錄測試點(diǎn)及系統(tǒng)業(yè)務(wù)等,便于后期系統(tǒng)維護(hù)及回歸測試。
結(jié)合項(xiàng)目實(shí)際情況基于1.3節(jié)中場景(3)和場景(4)的考慮,選擇某區(qū)實(shí)驗(yàn)室管理系統(tǒng)、某任務(wù)管理軟件和某信息化平臺這三個項(xiàng)目為實(shí)踐對象來研究如何采用探索性測試開展軟件測試工作,并對測試結(jié)果進(jìn)行分析,選取的項(xiàng)目基本信息如表2所示。
表2 實(shí)踐項(xiàng)目信息
這三個項(xiàng)目的測試過程都是按照CMMI3級標(biāo)準(zhǔn)進(jìn)行管理的,對其分析的結(jié)果具有一定的可參考性,對于后期軟件管理過程改進(jìn)也有一定的幫助。
某區(qū)實(shí)驗(yàn)室管理系統(tǒng)是一個專屬于該區(qū)環(huán)境保護(hù)檢測站實(shí)驗(yàn)室內(nèi)部工作管理的管理系統(tǒng)。主要用于實(shí)驗(yàn)室基礎(chǔ)信息管理、樣品報告流轉(zhuǎn)、報告數(shù)據(jù)統(tǒng)計(jì)和樣品數(shù)據(jù)統(tǒng)計(jì)。
按照已有的測試流程完成測試后,得出該系統(tǒng)的千行代碼缺陷率為2.56,而根據(jù)2016年-2018年項(xiàng)目測試?yán)塾?jì)數(shù)據(jù)得到的平均千行代碼缺陷率分別為4.5、5.0和4.3,故在此系統(tǒng)中引入探索性測試,通過探索性測試確認(rèn)該系統(tǒng)是否測試充分,是否存在漏測的情況。
某區(qū)實(shí)驗(yàn)室管理系統(tǒng)采用“腳本化為主、探索性測試為輔”的測試方案進(jìn)行測試,在系統(tǒng)測試完成后引入探索性測試,軟件測試總體流程見圖3。
圖3 軟件測試總體流程圖
探索性測試的測試過程如下:
(1) 測試負(fù)責(zé)人收集測試相關(guān)文檔,包括:需求規(guī)格說明書、需求變更申請單、測試說明等,并結(jié)合已完成系統(tǒng)獲取需要測試的內(nèi)容,然后制定測試計(jì)劃、分配測試人員和測試內(nèi)容。
(2) 探索性測試人員與項(xiàng)目組測試人員進(jìn)行溝通,了解更多業(yè)務(wù)信息及缺陷分布情況等,確定高風(fēng)險功能點(diǎn)。
(3) 開始執(zhí)行探索性測試,在這個過程中同時進(jìn)行測試執(zhí)行、思考學(xué)習(xí)、測試設(shè)計(jì),并根據(jù)實(shí)際情況隨時更改測試策略,同時記錄軟件邏輯和發(fā)現(xiàn)的缺陷。
(4) 項(xiàng)目組開發(fā)人員對缺陷進(jìn)行修復(fù),測試人員再對其進(jìn)行驗(yàn)證,待所有缺陷閉環(huán)后,進(jìn)行測試結(jié)果分析、總結(jié)。
文獻(xiàn)[12]指出,不同的人實(shí)施探索性測試會有不同的效果,在制定探索性測試計(jì)劃時需要做到:給新人分配的是基本信息的增刪改查,除了希望發(fā)現(xiàn)更多缺陷外,也希望通過此次測試能夠加深對測試的理解;經(jīng)驗(yàn)豐富的人,用于執(zhí)行核心的業(yè)務(wù)流程,希望通過他確認(rèn)重要的影響因素在設(shè)計(jì)中已經(jīng)都考慮到了;有開發(fā)經(jīng)驗(yàn)的,期望他能夠發(fā)現(xiàn)框架等更深層次的缺陷。
通過對腳本化測試發(fā)現(xiàn)的缺陷,及執(zhí)行完腳本化測試后加入探索性測試后探索性測試發(fā)現(xiàn)的缺陷進(jìn)行統(tǒng)計(jì)分析,得到加入探索性測試后發(fā)現(xiàn)的缺陷數(shù)和測試耗時情況如表3所示。
表3 加入探索性測試后測試結(jié)果
由表3可知,實(shí)施探索性測試后又發(fā)現(xiàn)了92個缺陷,說明實(shí)施探索性測試是有必要的,能夠提高產(chǎn)品的質(zhì)量。分析投入與產(chǎn)出效能可知,實(shí)施探索性測試雖然耗時增加了37.5%,但是發(fā)現(xiàn)的缺陷增量也高達(dá)35.11%,實(shí)施探索性測試后該系統(tǒng)的千行代碼缺陷率也達(dá)到了4.6,參考以往測試結(jié)果說明此次探索性測試是較充分的。針對92個缺陷進(jìn)行分析后可知,有90%的缺陷是有效缺陷,也是被項(xiàng)目組的開發(fā)人員所認(rèn)可的缺陷,探索性測試發(fā)現(xiàn)的缺陷分類如圖4所示。
圖4 探索性測試缺陷分類
探索性測試發(fā)現(xiàn)的有效缺陷的類別如圖5所示。
圖5 有效缺陷類別
由圖5可知,探索性測試發(fā)現(xiàn)的缺陷主要集中在功能性和易用性這兩個方面,同時也能發(fā)現(xiàn)安全性、維護(hù)性、兼容性和可靠性方面的缺陷。
參考文獻(xiàn)[14-15]后,將探索性測試思維應(yīng)用到傳統(tǒng)軟件測試中,應(yīng)用后測試流程如圖6所示。
圖6 加入探索性測試后測試流程
將探索性測試應(yīng)用于某任務(wù)管理軟件和某信息化平臺的執(zhí)行測試、缺陷驗(yàn)證和回歸測試階段中,對測試數(shù)據(jù)進(jìn)行整理分析后得到表4和表5所示測試結(jié)果。
表4 某任務(wù)管理軟件實(shí)施了探索性測試后測試結(jié)果
表5 某信息化平臺實(shí)施了探索性測試后測試結(jié)果
將實(shí)施探索性測試后發(fā)現(xiàn)的缺陷進(jìn)行整理后,得到實(shí)施探索性測試發(fā)現(xiàn)的缺陷分布情況如圖7所示。
圖7 探索性測試發(fā)現(xiàn)缺陷分布
從測試結(jié)果可以看出,探索性測試發(fā)現(xiàn)的缺陷分布主要集中在功能性和易用性兩個方面。
將探索性測試應(yīng)用到三個不同類型的項(xiàng)目中,發(fā)現(xiàn)均能夠助力腳本化測試使發(fā)現(xiàn)缺陷的總量增長至少25%以上。由此可知,探索性測試對于腳本測試是一種非常有益有效的補(bǔ)充。
探索性測試作為一種新的測試?yán)碚?,除了將探索性測試思維融入到軟件測試的各個階段外,后期還可從以下兩個方面繼續(xù)進(jìn)行研究:(1) 目前已有腳本化測試的公共測試用例庫,隨著開展探索性測試的項(xiàng)目越來越多,通過探索性測試方法分析出一些測試點(diǎn),抽取可以復(fù)用的探索性測試的測試用例也是一種需要;(2) 針對已經(jīng)出了原型需要進(jìn)行測試的項(xiàng)目,及采購類產(chǎn)品和設(shè)備構(gòu)建以探索性測試為主的測試過程也是一種可嘗試的方向。