劉芳
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
軟件測(cè)試是軟件開(kāi)發(fā)過(guò)程中的一個(gè)重要階段,因?yàn)闇y(cè)試可以在開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)缺陷并避免缺陷出現(xiàn)在最終產(chǎn)品中。早期對(duì)測(cè)試的定義更多是將測(cè)試看做對(duì)軟件的檢驗(yàn)——檢查軟件的功能是否正常運(yùn)行,正如1983 年Bill Hetzel 博士對(duì)軟件測(cè)試的定義:軟件測(cè)試是一系列活動(dòng),這些活動(dòng)是為了評(píng)估一個(gè)程序或軟件系統(tǒng)的特性或能力,并確定它是否達(dá)到了預(yù)期的結(jié)果。同時(shí),IEEE 提出的軟件工程標(biāo)準(zhǔn)術(shù)語(yǔ)中[1],對(duì)軟件測(cè)試的要求是通過(guò)軟件測(cè)試檢查軟件是否滿(mǎn)足設(shè)計(jì)階段提到的所有需求、檢查軟件是否可以為不同的輸入提供正確的輸出、檢查軟件是否能夠在限定時(shí)間內(nèi)或可接受的時(shí)間內(nèi)完成任務(wù)、檢查軟件是否可以在不同的環(huán)境中運(yùn)行。
軟件測(cè)試是評(píng)估軟件以確定其質(zhì)量的重要手段,然而測(cè)試通常會(huì)消耗40%到50%的開(kāi)發(fā)工作,并且當(dāng)前的一些工業(yè)實(shí)踐基于密集的測(cè)試,例如持續(xù)集成、交付、部署,因此為了降低開(kāi)發(fā)成本和提供更好的軟件質(zhì)量,軟件測(cè)試最好采用盡可能高的自動(dòng)化級(jí)別,而不僅是測(cè)試用例自動(dòng)化執(zhí)行。自動(dòng)化測(cè)試生成的想法是在20 世紀(jì)70 年代首次提出的,當(dāng)時(shí),由于機(jī)器缺乏足夠的處理能力和內(nèi)存,沒(méi)有可用的工業(yè)解決方案,如今,眾多自動(dòng)化測(cè)試生成技術(shù)、幾十種工具致力于解決這個(gè)問(wèn)題,其中一些工具已經(jīng)被軟件開(kāi)發(fā)人員用于實(shí)踐。
單元測(cè)試是一種簡(jiǎn)單但有效的技術(shù),可以提高軟件的質(zhì)量、靈活性和完成時(shí)間;單元測(cè)試的一個(gè)關(guān)鍵思想是每段代碼都需要有自己的測(cè)試用例,而設(shè)計(jì)這些測(cè)試用例的最佳人選是軟件開(kāi)發(fā)人員。但是,手工為每個(gè)單元編寫(xiě)單元測(cè)試用例非常費(fèi)時(shí)且成本昂貴,所以自動(dòng)生成單元測(cè)試用例對(duì)于支持單元測(cè)試至關(guān)重要;并且,隨著單元測(cè)試越來(lái)越受到關(guān)注,開(kāi)發(fā)人員對(duì)自動(dòng)生成單元測(cè)試用例的工具的需求也越來(lái)越大,但是由于目前自動(dòng)化測(cè)試生成技術(shù)眾多、工具眾多,開(kāi)發(fā)人員幾乎沒(méi)有關(guān)于這些技術(shù)、工具的有效信息,本文就面向?qū)ο髥卧獪y(cè)試、以及應(yīng)用于面向?qū)ο髥卧獪y(cè)試自動(dòng)化領(lǐng)域的流行技術(shù)進(jìn)行研究討論。
近年來(lái),面向?qū)ο筌浖_(kāi)發(fā)方法已迅速成為開(kāi)發(fā)大型系統(tǒng)首選的開(kāi)發(fā)方法,其原因是眾所周知的,首先,面向?qū)ο箝_(kāi)發(fā)方法引入了對(duì)象、類(lèi)的概念,類(lèi)提供了一種優(yōu)秀的結(jié)構(gòu)機(jī)制,使得系統(tǒng)可以被劃分為定義良好的單元,然后分別實(shí)現(xiàn)這些單元;其次,類(lèi)支持信息隱藏,類(lèi)可以導(dǎo)出純粹的過(guò)程性接口以供調(diào)用,而內(nèi)部數(shù)據(jù)結(jié)構(gòu)是隱藏的,以此簡(jiǎn)化了維護(hù);第三,面向?qū)ο蠊膭?lì)并支持軟件重用,這可以通過(guò)在庫(kù)中重用類(lèi)或通過(guò)繼承實(shí)現(xiàn),通過(guò)繼承可以創(chuàng)建一個(gè)新類(lèi)作為基類(lèi)的擴(kuò)展,在這兩種情況下,結(jié)果都減少了代碼編寫(xiě)量,并且由于可以利用以前測(cè)試過(guò)的類(lèi),因此可以提高系統(tǒng)的可靠性[2]。
傳統(tǒng)的軟件工程是面向過(guò)程的,即結(jié)構(gòu)化軟件開(kāi)發(fā)方法,其基本思想是自頂向下,采用模塊化技術(shù)分而治之,將系統(tǒng)按功能分解為若干個(gè)小模塊進(jìn)行分析和設(shè)計(jì)?;诮Y(jié)構(gòu)化軟件開(kāi)發(fā)方法的特點(diǎn),其單元測(cè)試的最小可測(cè)單位是程序的一個(gè)函數(shù)、過(guò)程或完成某一功能的程序塊,通過(guò)輸入、處理、輸出三個(gè)步驟檢驗(yàn)函數(shù)或過(guò)程是否正確[3]。
面向?qū)ο筌浖_(kāi)發(fā)方法的主要思想是把系統(tǒng)的各個(gè)事務(wù)分解成各個(gè)對(duì)象,對(duì)象的概念不是一個(gè)步驟,而是描述一個(gè)事物在解決問(wèn)題的過(guò)程中的行為,對(duì)象包含自己的數(shù)據(jù)(屬性)和行為(方法),不同于傳統(tǒng)的軟件開(kāi)發(fā)方法將數(shù)據(jù)分離,面向?qū)ο筌浖_(kāi)發(fā)方法將數(shù)據(jù)和方法封裝在一起,實(shí)現(xiàn)數(shù)據(jù)封裝和信息隱藏。面向?qū)ο筌浖_(kāi)發(fā)方法具有多種特性:對(duì)象、類(lèi)、封裝、多態(tài)、繼承、聚合等,這些特性對(duì)于軟件測(cè)試的影響也不盡相同[4]:
(1)將數(shù)據(jù)和功能(操作數(shù)據(jù)的方法)包裝到對(duì)象中稱(chēng)為封裝,封裝隱藏了信息,限制了數(shù)據(jù)可見(jiàn)性,對(duì)應(yīng)的也限制了軟件測(cè)試中間結(jié)果的可見(jiàn)性,加大了測(cè)試難度。
(2)從舊類(lèi)派生新類(lèi)的機(jī)制稱(chēng)為繼承,子類(lèi)可以繼承父類(lèi)的屬性和方法,并根據(jù)自身需要定義新的方法,繼承減少了代碼的冗余但增加了代碼間的依賴(lài)性。由于繼承關(guān)系,子類(lèi)和父類(lèi)可能擁有相同的方法,但使用語(yǔ)境不相同,所以對(duì)于子類(lèi)和父類(lèi)的方法都需要進(jìn)行測(cè)試。
(3)多態(tài)是指同一行為具有不同的表現(xiàn)形式,多態(tài)種最為常見(jiàn)的是重載,重載就是方法名相同,但參數(shù)類(lèi)型卻不同。對(duì)于這個(gè)特性,測(cè)試需要根據(jù)相應(yīng)的數(shù)據(jù)信息來(lái)選擇對(duì)應(yīng)的實(shí)現(xiàn)代碼,需要測(cè)試所有可能的結(jié)合,增加了測(cè)試路徑。
面向?qū)ο筌浖_(kāi)發(fā)中,其單元測(cè)試的最小可測(cè)單位是封裝的類(lèi)或?qū)ο?,?duì)類(lèi)進(jìn)行測(cè)試時(shí),類(lèi)中的新方法、繼承的方法和重新定義的方法都需要進(jìn)行測(cè)試,對(duì)方法的測(cè)試需要確保語(yǔ)句覆蓋(確保所有語(yǔ)句至少被遍歷一次)、條件覆蓋(確保所有條件執(zhí)行)、路徑覆蓋(確保執(zhí)行的是循環(huán)真/假部分)。使用以下方法進(jìn)行單元測(cè)試:測(cè)試類(lèi)中的每個(gè)方法和構(gòu)造函數(shù);測(cè)試方法之間的類(lèi)的狀態(tài)行為(屬性)。
軟件測(cè)試被廣泛認(rèn)為是軟件開(kāi)發(fā)過(guò)程中的關(guān)鍵部分,尤其是在持續(xù)集成的背景下,開(kāi)發(fā)人員針對(duì)新的代碼更改運(yùn)行單元測(cè)試和集成測(cè)試以迅速發(fā)現(xiàn)存在的缺陷,然而編寫(xiě)好的測(cè)試,尤其是編寫(xiě)好的單元測(cè)試代表了最困難、最耗時(shí)的測(cè)試活動(dòng)之一。因此,學(xué)術(shù)界和工業(yè)界都投入了越來(lái)越多的精力來(lái)實(shí)現(xiàn)自動(dòng)生成單元測(cè)試用例的方法和工具[5]。在面向?qū)ο笳Z(yǔ)言中,每個(gè)單元測(cè)試都是一系列方法的調(diào)用,在這種情況下,用于自動(dòng)測(cè)試生成的流行技術(shù)包括基于隨機(jī)的測(cè)試生成技術(shù)、基于搜索的測(cè)試生成技術(shù)和基于符號(hào)執(zhí)行的測(cè)試生成技術(shù)。
隨機(jī)測(cè)試(Random testing)是最基本、最流行的單元測(cè)試生成技術(shù)之一,基于隨機(jī)的測(cè)試生成技術(shù)基本上是由隨機(jī)生成器和方法調(diào)用序列驅(qū)動(dòng)的,隨機(jī)生成器可以提供格式良好但隨機(jī)的數(shù)據(jù)作為測(cè)試輸入,隨機(jī)測(cè)試的隨機(jī)性可以體現(xiàn)在以下方面:測(cè)試數(shù)據(jù)的隨機(jī)性、方法調(diào)用的隨機(jī)性、方法調(diào)用順序的隨機(jī)性。在2002 年的軟件工程百科全書(shū)中,D. Hamlet[6]對(duì)隨機(jī)測(cè)試進(jìn)行了詳細(xì)的描述,并用一個(gè)簡(jiǎn)單的例子說(shuō)明了隨機(jī)測(cè)試:一段程序用來(lái)計(jì)算整數(shù)參數(shù)的立方根,參數(shù)的區(qū)間為X=[1 ,107] ,假設(shè)參數(shù)在該區(qū)間的所有取值具有相同的可能性,為該程序執(zhí)行3000 點(diǎn)隨機(jī)測(cè)試的方法是:生成3000 個(gè)滿(mǎn)足參數(shù)區(qū)間且均勻分布的偽隨機(jī)整數(shù)x,執(zhí)行程序并為其傳入?yún)?shù)(生成的偽隨機(jī)整數(shù)),得到計(jì)算結(jié)果zx,用與x 進(jìn)行比較,判斷程序是否實(shí)現(xiàn)了為輸入?yún)?shù)計(jì)算立方根的功能。
在面向?qū)ο筌浖?,測(cè)試用例通常由一系列方法調(diào)用組成,每個(gè)步驟調(diào)用一個(gè)對(duì)象o 的m 方法,表示為o.m(T1v1,T2v2,T3v3,...,Tnvn),其中調(diào)用方法傳入的Tivi是對(duì)應(yīng)參數(shù)類(lèi)型的值。生成一個(gè)隨機(jī)測(cè)試用例,首先是創(chuàng)建對(duì)象o 使它可以接受方法m 的調(diào)用,其次構(gòu)建Tivi類(lèi)型的值作為調(diào)用方法m 的參數(shù),對(duì)方法m 的成功調(diào)用將返回一個(gè)值r,該值可在后序測(cè)試中用作其他方法的參數(shù),如果調(diào)用過(guò)程中出現(xiàn)異常,則認(rèn)為方法m 沒(méi)有通過(guò)測(cè)試[7]。
隨機(jī)測(cè)試生成的主要優(yōu)點(diǎn)是它可以在很短的時(shí)間內(nèi)達(dá)到較高的覆蓋率,并且隨機(jī)生成的測(cè)試用例可以用于回歸測(cè)試。然而,該技術(shù)在尋找軟件中的復(fù)雜缺陷和覆蓋復(fù)雜條件下的路徑方面并不理想,所以從隨機(jī)測(cè)試的理論基礎(chǔ)上衍生出了一項(xiàng)新技術(shù)——自適應(yīng)隨機(jī)測(cè)試(Adaptive Random Testing),他允許測(cè)試人員通過(guò)不同的因素來(lái)控制測(cè)試用例的生成,例如指定一組支付穿,測(cè)試生成器可以從中創(chuàng)建有效的SQL 請(qǐng)求,從而增強(qiáng)了隨機(jī)測(cè)試。反饋導(dǎo)向的隨機(jī)測(cè)試生成技術(shù)(Feedback-Directed Random Test Generation)[8]也是對(duì)隨機(jī)測(cè)試的一種改進(jìn),該技術(shù)結(jié)合了從開(kāi)始執(zhí)行測(cè)試輸入獲得的反饋來(lái)改善隨機(jī)測(cè)試的生成,反饋導(dǎo)向的隨機(jī)測(cè)試生成技術(shù)通過(guò)隨機(jī)選擇方法進(jìn)行調(diào)用,并從先前構(gòu)造的輸入中查找自變量來(lái)逐步構(gòu)建輸入,構(gòu)建輸入后,將立即執(zhí)行該輸入并根據(jù)一組規(guī)范和過(guò)濾器進(jìn)行檢查,執(zhí)行的結(jié)果確定生成的測(cè)試輸入數(shù)據(jù)是否冗余、非法、違反合同或?qū)ι筛嗟妮斎胗杏谩?/p>
自1992 年以來(lái),基于搜索的優(yōu)化技術(shù)已廣泛應(yīng)用于軟件測(cè)試數(shù)據(jù)的生成,該技術(shù)稱(chēng)為基于搜索的測(cè)試,基于搜索的測(cè)試是使用基于搜索的優(yōu)化算法,在適應(yīng)度函數(shù)的指導(dǎo)下,根據(jù)測(cè)試充分性標(biāo)準(zhǔn)自動(dòng)生成測(cè)試數(shù)據(jù)的過(guò)程。適應(yīng)度函數(shù)的作用是捕獲一個(gè)測(cè)試目標(biāo),當(dāng)實(shí)現(xiàn)該目標(biāo)時(shí),將有助于實(shí)現(xiàn)所需的測(cè)試充分性標(biāo)準(zhǔn),使用適應(yīng)度函數(shù)作為指導(dǎo),搜索將尋找能夠最大程度實(shí)現(xiàn)測(cè)試目標(biāo)的測(cè)試輸入。因?yàn)榭梢远x不同的適應(yīng)度函數(shù)來(lái)捕獲不同的測(cè)試目標(biāo),從而允許將相同的基于搜索的整體優(yōu)化策略應(yīng)用于非常不同的測(cè)試數(shù)據(jù)生成場(chǎng)景[9]。
應(yīng)用于軟件測(cè)試數(shù)據(jù)生成中的搜索算法包括爬山算法、模擬退火算法和進(jìn)化算法,其中使用最廣泛的是進(jìn)化算法中的遺傳算法。遺傳算法遵循解進(jìn)化的概念,利用給定的適應(yīng)度函數(shù)隨機(jī)生成解種群,遺傳算法應(yīng)用于測(cè)試生成過(guò)程時(shí),可以用來(lái)專(zhuān)門(mén)尋找覆蓋程序某些分支的特殊測(cè)試場(chǎng)景。在遺傳算法中,一個(gè)候選個(gè)體的種群(即測(cè)試用例),使用搜索運(yùn)算符(交叉、變異)來(lái)模擬自然進(jìn)化,例如兩個(gè)個(gè)體之間的交叉產(chǎn)生兩個(gè)包含雙親遺傳物質(zhì)的后代,或個(gè)體的變異引入新的遺傳物質(zhì)。適應(yīng)度函數(shù)用于衡量個(gè)體相對(duì)于優(yōu)化目標(biāo)的好壞程度,適應(yīng)度值越好,個(gè)體被選擇繁殖的可能性就越高,從而逐步提高最佳個(gè)體在每一代中的適應(yīng)度,直到找到最佳解決方案或保持一些其它的停止條件。適應(yīng)度函數(shù)一次用一個(gè)輸入執(zhí)行被測(cè)程序,并測(cè)量該輸入與選擇作為優(yōu)化目標(biāo)的特定結(jié)構(gòu)實(shí)體的距離。將遺傳算法應(yīng)用于測(cè)試數(shù)據(jù)生成中,算法如圖1[10]:首先從一個(gè)隨機(jī)總體開(kāi)始進(jìn)行進(jìn)化,直到找到滿(mǎn)足覆蓋標(biāo)準(zhǔn)的解決方案,或者分配的資源(例如時(shí)間、適應(yīng)性評(píng)估的數(shù)量)用完為止,在進(jìn)化的每個(gè)迭代中,都會(huì)創(chuàng)建新一代并使用上一代最佳個(gè)體進(jìn)行初始化,然后新一代被等級(jí)選擇(第5 行)、交叉(第7 行)和變異(第10行)產(chǎn)生的個(gè)體所填充,根據(jù)適應(yīng)性和長(zhǎng)度限制,將子代或父代添加到新一代中。

圖1 測(cè)試用例生成算法
符號(hào)執(zhí)行是測(cè)試輸入生成的一種良好的技術(shù),盡管符號(hào)執(zhí)行的概念誕生于20 世紀(jì)70 年代,但直到最近才在實(shí)踐中用于測(cè)試生成,主要是因?yàn)榉?hào)執(zhí)行需要大量的處理能力(或時(shí)間)和系統(tǒng)內(nèi)存。符號(hào)執(zhí)行通過(guò)符號(hào)變量而不是實(shí)際變量來(lái)運(yùn)行被測(cè)類(lèi),以發(fā)現(xiàn)輸入和輸出之間的關(guān)系。該技術(shù)利用沒(méi)有具體值的符號(hào)變量來(lái)收集被測(cè)類(lèi)的路徑條件,收集路徑條件后,將其轉(zhuǎn)化為正式問(wèn)題(可滿(mǎn)足性模塊理論)并傳遞給求解程序以滿(mǎn)足表達(dá)式,根據(jù)求解器的響應(yīng),可以確定哪些輸入覆蓋了代碼的哪些路徑或相應(yīng)的行[11]。
符號(hào)方法將程序的執(zhí)行路徑表示為對(duì)輸入值的約束,一種常見(jiàn)方法是動(dòng)態(tài)符號(hào)執(zhí)行,在這種方法中,系統(tǒng)地探索程序的路徑,一次迭代否定路徑約束中的一個(gè)分支條件,并使用約束求解器為該路徑生成一個(gè)新的測(cè)試輸入,大多數(shù)這類(lèi)方法的目標(biāo)是生成特定的輸入數(shù)據(jù),并且需要手工構(gòu)建測(cè)試驅(qū)動(dòng)程序。另一種是靜態(tài)符號(hào)執(zhí)行,在每個(gè)分支節(jié)點(diǎn)上更新路徑條件,通過(guò)約束求解器判斷路徑是否可行,如果路徑不可行,回溯到上一個(gè)節(jié)點(diǎn),因此只執(zhí)行可行路徑。
基于隨機(jī)的測(cè)試用例生成技術(shù)開(kāi)發(fā)的面向?qū)ο笞詣?dòng)化單元測(cè)試工具包括JCrasher[17]、Jartege[18]、Randoop[19]、PEX[20]等,其中最為流行的是Randoop 工具,Randoop 是一個(gè)根據(jù)MIT 開(kāi)放源碼許可證發(fā)布的實(shí)驗(yàn)性工具,Randoop 可以生成用于回歸的單元測(cè)試用例和揭示錯(cuò)誤的單元測(cè)試用例。Randoop 的輸入是一組要測(cè)試的Java 類(lèi)、一個(gè)時(shí)間限制和一組可選的契約檢查器,結(jié)果的輸出是一個(gè)JUnit 測(cè)試套件?;貧w測(cè)試是不違反提供的契約,但捕獲當(dāng)前實(shí)現(xiàn)的測(cè)試,而違反契約的測(cè)試可能會(huì)揭示錯(cuò)誤。Randoop 使用反饋定向隨機(jī)測(cè)試生成單元測(cè)試,這種技術(shù)受到隨機(jī)測(cè)試的啟發(fā),使用從創(chuàng)建測(cè)試輸入時(shí)收集的執(zhí)行反饋,以避免生成冗余和非法輸入。該工具通過(guò)隨機(jī)選擇要調(diào)用的方法并從之前構(gòu)造的序列中選擇參數(shù)來(lái)創(chuàng)建方法調(diào)用序列,創(chuàng)建后,將執(zhí)行一個(gè)新序列并根據(jù)一組契約進(jìn)行檢查。違反契約的序列作為揭示錯(cuò)誤的測(cè)試輸出給用戶(hù)。顯示正常行為的序列(沒(méi)有異?;蜻`反契約)作為回歸測(cè)試輸出。
基于搜索的測(cè)試用例生成技術(shù)開(kāi)發(fā)的面向?qū)ο笞詣?dòng)化單元測(cè)試工具包括Evosuite[21]、TestFul、eToc 等,其中使用最多且性能最好的是Evosuite 工具,Evosuite 應(yīng)用遺傳算法來(lái)生成一組可以最大程度覆蓋代碼的測(cè)試用例,它從一組隨機(jī)測(cè)試用例的測(cè)試套件開(kāi)始,然后迭代地應(yīng)用搜索運(yùn)算符(例如選擇,變異和交叉)來(lái)進(jìn)化它們,進(jìn)化由基于覆蓋標(biāo)準(zhǔn)的適應(yīng)度函數(shù)指導(dǎo),默認(rèn)情況下是分支覆蓋。搜索結(jié)束后,就覆蓋標(biāo)準(zhǔn)而言,具有最高代碼覆蓋率的測(cè)試套件將被最小化,并添加回歸測(cè)試斷言,然后,Evosuite 通過(guò)編譯來(lái)檢查每個(gè)測(cè)試在語(yǔ)法上是否有效,并執(zhí)行該測(cè)試以檢查它是否穩(wěn)定(即通過(guò))。
基于符號(hào)執(zhí)行的測(cè)試用例生成技術(shù)開(kāi)發(fā)的面向?qū)ο笞詣?dòng)化單元測(cè)試工具包括DSC[22]、CATG、PET[23]、Symbolic PathFinder(SPF)[24]等,其中最為流行的基于符號(hào)執(zhí)行的測(cè)試工具是SPF,SPF 工具將符號(hào)執(zhí)行與模型檢查和約束求解相結(jié)合,用于在具有未指定輸入的Java程序中自動(dòng)生成測(cè)試用例和錯(cuò)誤檢測(cè),在這個(gè)工具中,程序在代表多個(gè)具體輸入的符號(hào)輸入上執(zhí)行,變量的值表示為Java 字節(jié)碼分析產(chǎn)生的約束,使用現(xiàn)成的解決方案來(lái)生成保證實(shí)現(xiàn)復(fù)雜覆蓋標(biāo)準(zhǔn)的測(cè)試輸入,從而解決約束。
為了克服手動(dòng)編寫(xiě)單元測(cè)試用例的挑戰(zhàn):費(fèi)時(shí)、成本昂貴、測(cè)試不全面等,自動(dòng)化單元測(cè)試領(lǐng)域已經(jīng)引入了基于不同方法的自動(dòng)技術(shù)和工具,但是工業(yè)界對(duì)自動(dòng)測(cè)試生成工具的采用有限。為了使開(kāi)發(fā)人員能夠采用這些工具,重要的是了解功能的能力和所生成的測(cè)試用例的質(zhì)量,大量學(xué)術(shù)研究致力于自動(dòng)化工具的性能研究、性能比較,研究工具在實(shí)際系統(tǒng)中的表現(xiàn)等。
A.Bacchelli 等人[12]在2008 年首次對(duì)手動(dòng)單元測(cè)試和自動(dòng)化單元測(cè)試進(jìn)行了探索性研究,目的是從經(jīng)驗(yàn)上理解手動(dòng)和自動(dòng)單元測(cè)試之間的差異,作者團(tuán)隊(duì)從代碼覆蓋率、變異分?jǐn)?shù)以及缺陷檢錯(cuò)率的角度證明了自動(dòng)化單元測(cè)試工具(Randoop、Junit Factory、JCrasher)生成的測(cè)試用例的有效性。十年后D.Serra[13]團(tuán)隊(duì)采用A.Bacchelli 團(tuán)隊(duì)的研究方法,選取了三種最新的面向?qū)ο笞詣?dòng)化單元測(cè)試工具(Evosuite、Randoop、JTExpert),研究表明當(dāng)前的自動(dòng)測(cè)試用例生成工具比手動(dòng)編寫(xiě)的測(cè)試用例更好地優(yōu)化了覆蓋率和變異分?jǐn)?shù),但是最近十年的進(jìn)步并不顯著,在發(fā)現(xiàn)缺陷方面沒(méi)有什么改進(jìn)。
M.M.Almasi 等人[14]選取了SEB Life & Pension Holding AB Riga Branch 擁有的財(cái)務(wù)系統(tǒng)作為被測(cè)項(xiàng)目,研究工具在工業(yè)應(yīng)用中的有效性和適用性,作者團(tuán)隊(duì)選取了Randoop 和Evosuite 兩個(gè)工具作為研究對(duì)象,從被測(cè)系統(tǒng)的歷史版本中提取了25 個(gè)實(shí)際缺陷,Randoop 的缺陷檢測(cè)率為38%,Evosuite 的缺陷檢測(cè)率為56.4%。
R.Ramler 等人[15]選取了Java 集合類(lèi)庫(kù)中的35 個(gè)實(shí)際缺陷,研究并比較了手動(dòng)單元測(cè)試和隨機(jī)測(cè)試用例生成的有效性,實(shí)驗(yàn)利用Randoop 工具生成測(cè)試用例,以及48 位碩士參與者進(jìn)行手動(dòng)單元測(cè)試,研究發(fā)現(xiàn)通過(guò)Randoop 生成的測(cè)試用例檢測(cè)到的缺陷在手動(dòng)單元測(cè)試范圍內(nèi),而且工具檢測(cè)到的缺陷與手動(dòng)單元測(cè)試不同,Randoop 會(huì)檢測(cè)到無(wú)法通過(guò)手動(dòng)單元測(cè)試發(fā)現(xiàn)的缺陷。
L.Cseppento 等人[16]為了評(píng)估自動(dòng)化單元測(cè)試工具的不同優(yōu)勢(shì)以及反饋工具的實(shí)際功能,作者團(tuán)隊(duì)收集了一組由工具處理的代表性編程語(yǔ)言概念(基本類(lèi)型、運(yùn)算符、數(shù)據(jù)結(jié)構(gòu)、對(duì)象及其關(guān)系、泛型、內(nèi)置類(lèi)庫(kù)等)將其映射到300 個(gè)代碼片段,利用CATG、JPET、SPF、Evosuite、PEX 這五個(gè)工具為其生成測(cè)試用例,研究表明CATG 的基本功能沒(méi)有問(wèn)題,只是該工具不支持浮點(diǎn)數(shù),無(wú)法生成數(shù)組作為測(cè)試輸入,也無(wú)法解決數(shù)組索引的約束;JPET 工具不支持大多數(shù)內(nèi)置Java 對(duì)象,盡管其支持浮點(diǎn)數(shù),但它不支持復(fù)雜條件;SPF 支持除模運(yùn)算之外的所有基本類(lèi)型和運(yùn)算符,并且僅存在最困難的條件語(yǔ)句和循環(huán)問(wèn)題;Evosuite 是唯一能夠完全覆蓋對(duì)象和泛型的所有的代碼段的工具;PEX 能夠?yàn)樗械拇a片段生成測(cè)試用例,該工具會(huì)檢測(cè)到異常,并在時(shí)間限制到期后自行關(guān)閉。
在軟件開(kāi)發(fā)過(guò)程中,軟件測(cè)試是必不可少的一個(gè)環(huán)節(jié),面向?qū)ο筌浖_(kāi)發(fā)方法由于其特性已迅速成為開(kāi)發(fā)大規(guī)模系統(tǒng)的首選開(kāi)發(fā)方法,所以近年來(lái)關(guān)于面向?qū)ο笞詣?dòng)化單元測(cè)試技術(shù)和工具的研究已非常成熟及多樣化。本文對(duì)可用于測(cè)試面向?qū)ο蟮淖詣?dòng)化單元測(cè)試用例生成技術(shù),以及基于這些技術(shù)開(kāi)發(fā)的工具進(jìn)行了全面的概述。