亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        面向對象自動化單元測試技術研究

        2020-06-28 08:14:40劉芳
        現(xiàn)代計算機 2020年14期
        關鍵詞:方法

        劉芳

        (四川大學計算機學院,成都 610065)

        0 引言

        軟件測試是軟件開發(fā)過程中的一個重要階段,因為測試可以在開發(fā)過程中發(fā)現(xiàn)缺陷并避免缺陷出現(xiàn)在最終產(chǎn)品中。早期對測試的定義更多是將測試看做對軟件的檢驗——檢查軟件的功能是否正常運行,正如1983 年Bill Hetzel 博士對軟件測試的定義:軟件測試是一系列活動,這些活動是為了評估一個程序或軟件系統(tǒng)的特性或能力,并確定它是否達到了預期的結果。同時,IEEE 提出的軟件工程標準術語中[1],對軟件測試的要求是通過軟件測試檢查軟件是否滿足設計階段提到的所有需求、檢查軟件是否可以為不同的輸入提供正確的輸出、檢查軟件是否能夠在限定時間內或可接受的時間內完成任務、檢查軟件是否可以在不同的環(huán)境中運行。

        軟件測試是評估軟件以確定其質量的重要手段,然而測試通常會消耗40%到50%的開發(fā)工作,并且當前的一些工業(yè)實踐基于密集的測試,例如持續(xù)集成、交付、部署,因此為了降低開發(fā)成本和提供更好的軟件質量,軟件測試最好采用盡可能高的自動化級別,而不僅是測試用例自動化執(zhí)行。自動化測試生成的想法是在20 世紀70 年代首次提出的,當時,由于機器缺乏足夠的處理能力和內存,沒有可用的工業(yè)解決方案,如今,眾多自動化測試生成技術、幾十種工具致力于解決這個問題,其中一些工具已經(jīng)被軟件開發(fā)人員用于實踐。

        單元測試是一種簡單但有效的技術,可以提高軟件的質量、靈活性和完成時間;單元測試的一個關鍵思想是每段代碼都需要有自己的測試用例,而設計這些測試用例的最佳人選是軟件開發(fā)人員。但是,手工為每個單元編寫單元測試用例非常費時且成本昂貴,所以自動生成單元測試用例對于支持單元測試至關重要;并且,隨著單元測試越來越受到關注,開發(fā)人員對自動生成單元測試用例的工具的需求也越來越大,但是由于目前自動化測試生成技術眾多、工具眾多,開發(fā)人員幾乎沒有關于這些技術、工具的有效信息,本文就面向對象單元測試、以及應用于面向對象單元測試自動化領域的流行技術進行研究討論。

        1 面向對象單元測試

        近年來,面向對象軟件開發(fā)方法已迅速成為開發(fā)大型系統(tǒng)首選的開發(fā)方法,其原因是眾所周知的,首先,面向對象開發(fā)方法引入了對象、類的概念,類提供了一種優(yōu)秀的結構機制,使得系統(tǒng)可以被劃分為定義良好的單元,然后分別實現(xiàn)這些單元;其次,類支持信息隱藏,類可以導出純粹的過程性接口以供調用,而內部數(shù)據(jù)結構是隱藏的,以此簡化了維護;第三,面向對象鼓勵并支持軟件重用,這可以通過在庫中重用類或通過繼承實現(xiàn),通過繼承可以創(chuàng)建一個新類作為基類的擴展,在這兩種情況下,結果都減少了代碼編寫量,并且由于可以利用以前測試過的類,因此可以提高系統(tǒng)的可靠性[2]。

        傳統(tǒng)的軟件工程是面向過程的,即結構化軟件開發(fā)方法,其基本思想是自頂向下,采用模塊化技術分而治之,將系統(tǒng)按功能分解為若干個小模塊進行分析和設計?;诮Y構化軟件開發(fā)方法的特點,其單元測試的最小可測單位是程序的一個函數(shù)、過程或完成某一功能的程序塊,通過輸入、處理、輸出三個步驟檢驗函數(shù)或過程是否正確[3]。

        面向對象軟件開發(fā)方法的主要思想是把系統(tǒng)的各個事務分解成各個對象,對象的概念不是一個步驟,而是描述一個事物在解決問題的過程中的行為,對象包含自己的數(shù)據(jù)(屬性)和行為(方法),不同于傳統(tǒng)的軟件開發(fā)方法將數(shù)據(jù)分離,面向對象軟件開發(fā)方法將數(shù)據(jù)和方法封裝在一起,實現(xiàn)數(shù)據(jù)封裝和信息隱藏。面向對象軟件開發(fā)方法具有多種特性:對象、類、封裝、多態(tài)、繼承、聚合等,這些特性對于軟件測試的影響也不盡相同[4]:

        (1)將數(shù)據(jù)和功能(操作數(shù)據(jù)的方法)包裝到對象中稱為封裝,封裝隱藏了信息,限制了數(shù)據(jù)可見性,對應的也限制了軟件測試中間結果的可見性,加大了測試難度。

        (2)從舊類派生新類的機制稱為繼承,子類可以繼承父類的屬性和方法,并根據(jù)自身需要定義新的方法,繼承減少了代碼的冗余但增加了代碼間的依賴性。由于繼承關系,子類和父類可能擁有相同的方法,但使用語境不相同,所以對于子類和父類的方法都需要進行測試。

        (3)多態(tài)是指同一行為具有不同的表現(xiàn)形式,多態(tài)種最為常見的是重載,重載就是方法名相同,但參數(shù)類型卻不同。對于這個特性,測試需要根據(jù)相應的數(shù)據(jù)信息來選擇對應的實現(xiàn)代碼,需要測試所有可能的結合,增加了測試路徑。

        面向對象軟件開發(fā)中,其單元測試的最小可測單位是封裝的類或對象,對類進行測試時,類中的新方法、繼承的方法和重新定義的方法都需要進行測試,對方法的測試需要確保語句覆蓋(確保所有語句至少被遍歷一次)、條件覆蓋(確保所有條件執(zhí)行)、路徑覆蓋(確保執(zhí)行的是循環(huán)真/假部分)。使用以下方法進行單元測試:測試類中的每個方法和構造函數(shù);測試方法之間的類的狀態(tài)行為(屬性)。

        2 面向對象自動化單元測試技術

        軟件測試被廣泛認為是軟件開發(fā)過程中的關鍵部分,尤其是在持續(xù)集成的背景下,開發(fā)人員針對新的代碼更改運行單元測試和集成測試以迅速發(fā)現(xiàn)存在的缺陷,然而編寫好的測試,尤其是編寫好的單元測試代表了最困難、最耗時的測試活動之一。因此,學術界和工業(yè)界都投入了越來越多的精力來實現(xiàn)自動生成單元測試用例的方法和工具[5]。在面向對象語言中,每個單元測試都是一系列方法的調用,在這種情況下,用于自動測試生成的流行技術包括基于隨機的測試生成技術、基于搜索的測試生成技術和基于符號執(zhí)行的測試生成技術。

        2.1 基于隨機的測試生成技術

        隨機測試(Random testing)是最基本、最流行的單元測試生成技術之一,基于隨機的測試生成技術基本上是由隨機生成器和方法調用序列驅動的,隨機生成器可以提供格式良好但隨機的數(shù)據(jù)作為測試輸入,隨機測試的隨機性可以體現(xiàn)在以下方面:測試數(shù)據(jù)的隨機性、方法調用的隨機性、方法調用順序的隨機性。在2002 年的軟件工程百科全書中,D. Hamlet[6]對隨機測試進行了詳細的描述,并用一個簡單的例子說明了隨機測試:一段程序用來計算整數(shù)參數(shù)的立方根,參數(shù)的區(qū)間為X=[1 ,107] ,假設參數(shù)在該區(qū)間的所有取值具有相同的可能性,為該程序執(zhí)行3000 點隨機測試的方法是:生成3000 個滿足參數(shù)區(qū)間且均勻分布的偽隨機整數(shù)x,執(zhí)行程序并為其傳入?yún)?shù)(生成的偽隨機整數(shù)),得到計算結果zx,用與x 進行比較,判斷程序是否實現(xiàn)了為輸入?yún)?shù)計算立方根的功能。

        在面向對象軟件中,測試用例通常由一系列方法調用組成,每個步驟調用一個對象o 的m 方法,表示為o.m(T1v1,T2v2,T3v3,...,Tnvn),其中調用方法傳入的Tivi是對應參數(shù)類型的值。生成一個隨機測試用例,首先是創(chuàng)建對象o 使它可以接受方法m 的調用,其次構建Tivi類型的值作為調用方法m 的參數(shù),對方法m 的成功調用將返回一個值r,該值可在后序測試中用作其他方法的參數(shù),如果調用過程中出現(xiàn)異常,則認為方法m 沒有通過測試[7]。

        隨機測試生成的主要優(yōu)點是它可以在很短的時間內達到較高的覆蓋率,并且隨機生成的測試用例可以用于回歸測試。然而,該技術在尋找軟件中的復雜缺陷和覆蓋復雜條件下的路徑方面并不理想,所以從隨機測試的理論基礎上衍生出了一項新技術——自適應隨機測試(Adaptive Random Testing),他允許測試人員通過不同的因素來控制測試用例的生成,例如指定一組支付穿,測試生成器可以從中創(chuàng)建有效的SQL 請求,從而增強了隨機測試。反饋導向的隨機測試生成技術(Feedback-Directed Random Test Generation)[8]也是對隨機測試的一種改進,該技術結合了從開始執(zhí)行測試輸入獲得的反饋來改善隨機測試的生成,反饋導向的隨機測試生成技術通過隨機選擇方法進行調用,并從先前構造的輸入中查找自變量來逐步構建輸入,構建輸入后,將立即執(zhí)行該輸入并根據(jù)一組規(guī)范和過濾器進行檢查,執(zhí)行的結果確定生成的測試輸入數(shù)據(jù)是否冗余、非法、違反合同或對生成更多的輸入有用。

        2.2 基于搜索的測試生成技術

        自1992 年以來,基于搜索的優(yōu)化技術已廣泛應用于軟件測試數(shù)據(jù)的生成,該技術稱為基于搜索的測試,基于搜索的測試是使用基于搜索的優(yōu)化算法,在適應度函數(shù)的指導下,根據(jù)測試充分性標準自動生成測試數(shù)據(jù)的過程。適應度函數(shù)的作用是捕獲一個測試目標,當實現(xiàn)該目標時,將有助于實現(xiàn)所需的測試充分性標準,使用適應度函數(shù)作為指導,搜索將尋找能夠最大程度實現(xiàn)測試目標的測試輸入。因為可以定義不同的適應度函數(shù)來捕獲不同的測試目標,從而允許將相同的基于搜索的整體優(yōu)化策略應用于非常不同的測試數(shù)據(jù)生成場景[9]。

        應用于軟件測試數(shù)據(jù)生成中的搜索算法包括爬山算法、模擬退火算法和進化算法,其中使用最廣泛的是進化算法中的遺傳算法。遺傳算法遵循解進化的概念,利用給定的適應度函數(shù)隨機生成解種群,遺傳算法應用于測試生成過程時,可以用來專門尋找覆蓋程序某些分支的特殊測試場景。在遺傳算法中,一個候選個體的種群(即測試用例),使用搜索運算符(交叉、變異)來模擬自然進化,例如兩個個體之間的交叉產(chǎn)生兩個包含雙親遺傳物質的后代,或個體的變異引入新的遺傳物質。適應度函數(shù)用于衡量個體相對于優(yōu)化目標的好壞程度,適應度值越好,個體被選擇繁殖的可能性就越高,從而逐步提高最佳個體在每一代中的適應度,直到找到最佳解決方案或保持一些其它的停止條件。適應度函數(shù)一次用一個輸入執(zhí)行被測程序,并測量該輸入與選擇作為優(yōu)化目標的特定結構實體的距離。將遺傳算法應用于測試數(shù)據(jù)生成中,算法如圖1[10]:首先從一個隨機總體開始進行進化,直到找到滿足覆蓋標準的解決方案,或者分配的資源(例如時間、適應性評估的數(shù)量)用完為止,在進化的每個迭代中,都會創(chuàng)建新一代并使用上一代最佳個體進行初始化,然后新一代被等級選擇(第5 行)、交叉(第7 行)和變異(第10行)產(chǎn)生的個體所填充,根據(jù)適應性和長度限制,將子代或父代添加到新一代中。

        圖1 測試用例生成算法

        2.3 基于符號執(zhí)行的測試生成技術

        符號執(zhí)行是測試輸入生成的一種良好的技術,盡管符號執(zhí)行的概念誕生于20 世紀70 年代,但直到最近才在實踐中用于測試生成,主要是因為符號執(zhí)行需要大量的處理能力(或時間)和系統(tǒng)內存。符號執(zhí)行通過符號變量而不是實際變量來運行被測類,以發(fā)現(xiàn)輸入和輸出之間的關系。該技術利用沒有具體值的符號變量來收集被測類的路徑條件,收集路徑條件后,將其轉化為正式問題(可滿足性模塊理論)并傳遞給求解程序以滿足表達式,根據(jù)求解器的響應,可以確定哪些輸入覆蓋了代碼的哪些路徑或相應的行[11]。

        符號方法將程序的執(zhí)行路徑表示為對輸入值的約束,一種常見方法是動態(tài)符號執(zhí)行,在這種方法中,系統(tǒng)地探索程序的路徑,一次迭代否定路徑約束中的一個分支條件,并使用約束求解器為該路徑生成一個新的測試輸入,大多數(shù)這類方法的目標是生成特定的輸入數(shù)據(jù),并且需要手工構建測試驅動程序。另一種是靜態(tài)符號執(zhí)行,在每個分支節(jié)點上更新路徑條件,通過約束求解器判斷路徑是否可行,如果路徑不可行,回溯到上一個節(jié)點,因此只執(zhí)行可行路徑。

        3 面向對象自動化單元測試技術的應用

        3.1 面向對象自動化單元測試工具

        基于隨機的測試用例生成技術開發(fā)的面向對象自動化單元測試工具包括JCrasher[17]、Jartege[18]、Randoop[19]、PEX[20]等,其中最為流行的是Randoop 工具,Randoop 是一個根據(jù)MIT 開放源碼許可證發(fā)布的實驗性工具,Randoop 可以生成用于回歸的單元測試用例和揭示錯誤的單元測試用例。Randoop 的輸入是一組要測試的Java 類、一個時間限制和一組可選的契約檢查器,結果的輸出是一個JUnit 測試套件?;貧w測試是不違反提供的契約,但捕獲當前實現(xiàn)的測試,而違反契約的測試可能會揭示錯誤。Randoop 使用反饋定向隨機測試生成單元測試,這種技術受到隨機測試的啟發(fā),使用從創(chuàng)建測試輸入時收集的執(zhí)行反饋,以避免生成冗余和非法輸入。該工具通過隨機選擇要調用的方法并從之前構造的序列中選擇參數(shù)來創(chuàng)建方法調用序列,創(chuàng)建后,將執(zhí)行一個新序列并根據(jù)一組契約進行檢查。違反契約的序列作為揭示錯誤的測試輸出給用戶。顯示正常行為的序列(沒有異?;蜻`反契約)作為回歸測試輸出。

        基于搜索的測試用例生成技術開發(fā)的面向對象自動化單元測試工具包括Evosuite[21]、TestFul、eToc 等,其中使用最多且性能最好的是Evosuite 工具,Evosuite 應用遺傳算法來生成一組可以最大程度覆蓋代碼的測試用例,它從一組隨機測試用例的測試套件開始,然后迭代地應用搜索運算符(例如選擇,變異和交叉)來進化它們,進化由基于覆蓋標準的適應度函數(shù)指導,默認情況下是分支覆蓋。搜索結束后,就覆蓋標準而言,具有最高代碼覆蓋率的測試套件將被最小化,并添加回歸測試斷言,然后,Evosuite 通過編譯來檢查每個測試在語法上是否有效,并執(zhí)行該測試以檢查它是否穩(wěn)定(即通過)。

        基于符號執(zhí)行的測試用例生成技術開發(fā)的面向對象自動化單元測試工具包括DSC[22]、CATG、PET[23]、Symbolic PathFinder(SPF)[24]等,其中最為流行的基于符號執(zhí)行的測試工具是SPF,SPF 工具將符號執(zhí)行與模型檢查和約束求解相結合,用于在具有未指定輸入的Java程序中自動生成測試用例和錯誤檢測,在這個工具中,程序在代表多個具體輸入的符號輸入上執(zhí)行,變量的值表示為Java 字節(jié)碼分析產(chǎn)生的約束,使用現(xiàn)成的解決方案來生成保證實現(xiàn)復雜覆蓋標準的測試輸入,從而解決約束。

        3.2 面向對象自動化單元測試工具的應用

        為了克服手動編寫單元測試用例的挑戰(zhàn):費時、成本昂貴、測試不全面等,自動化單元測試領域已經(jīng)引入了基于不同方法的自動技術和工具,但是工業(yè)界對自動測試生成工具的采用有限。為了使開發(fā)人員能夠采用這些工具,重要的是了解功能的能力和所生成的測試用例的質量,大量學術研究致力于自動化工具的性能研究、性能比較,研究工具在實際系統(tǒng)中的表現(xiàn)等。

        A.Bacchelli 等人[12]在2008 年首次對手動單元測試和自動化單元測試進行了探索性研究,目的是從經(jīng)驗上理解手動和自動單元測試之間的差異,作者團隊從代碼覆蓋率、變異分數(shù)以及缺陷檢錯率的角度證明了自動化單元測試工具(Randoop、Junit Factory、JCrasher)生成的測試用例的有效性。十年后D.Serra[13]團隊采用A.Bacchelli 團隊的研究方法,選取了三種最新的面向對象自動化單元測試工具(Evosuite、Randoop、JTExpert),研究表明當前的自動測試用例生成工具比手動編寫的測試用例更好地優(yōu)化了覆蓋率和變異分數(shù),但是最近十年的進步并不顯著,在發(fā)現(xiàn)缺陷方面沒有什么改進。

        M.M.Almasi 等人[14]選取了SEB Life & Pension Holding AB Riga Branch 擁有的財務系統(tǒng)作為被測項目,研究工具在工業(yè)應用中的有效性和適用性,作者團隊選取了Randoop 和Evosuite 兩個工具作為研究對象,從被測系統(tǒng)的歷史版本中提取了25 個實際缺陷,Randoop 的缺陷檢測率為38%,Evosuite 的缺陷檢測率為56.4%。

        R.Ramler 等人[15]選取了Java 集合類庫中的35 個實際缺陷,研究并比較了手動單元測試和隨機測試用例生成的有效性,實驗利用Randoop 工具生成測試用例,以及48 位碩士參與者進行手動單元測試,研究發(fā)現(xiàn)通過Randoop 生成的測試用例檢測到的缺陷在手動單元測試范圍內,而且工具檢測到的缺陷與手動單元測試不同,Randoop 會檢測到無法通過手動單元測試發(fā)現(xiàn)的缺陷。

        L.Cseppento 等人[16]為了評估自動化單元測試工具的不同優(yōu)勢以及反饋工具的實際功能,作者團隊收集了一組由工具處理的代表性編程語言概念(基本類型、運算符、數(shù)據(jù)結構、對象及其關系、泛型、內置類庫等)將其映射到300 個代碼片段,利用CATG、JPET、SPF、Evosuite、PEX 這五個工具為其生成測試用例,研究表明CATG 的基本功能沒有問題,只是該工具不支持浮點數(shù),無法生成數(shù)組作為測試輸入,也無法解決數(shù)組索引的約束;JPET 工具不支持大多數(shù)內置Java 對象,盡管其支持浮點數(shù),但它不支持復雜條件;SPF 支持除模運算之外的所有基本類型和運算符,并且僅存在最困難的條件語句和循環(huán)問題;Evosuite 是唯一能夠完全覆蓋對象和泛型的所有的代碼段的工具;PEX 能夠為所有的代碼片段生成測試用例,該工具會檢測到異常,并在時間限制到期后自行關閉。

        4 結語

        在軟件開發(fā)過程中,軟件測試是必不可少的一個環(huán)節(jié),面向對象軟件開發(fā)方法由于其特性已迅速成為開發(fā)大規(guī)模系統(tǒng)的首選開發(fā)方法,所以近年來關于面向對象自動化單元測試技術和工具的研究已非常成熟及多樣化。本文對可用于測試面向對象的自動化單元測試用例生成技術,以及基于這些技術開發(fā)的工具進行了全面的概述。

        猜你喜歡
        方法
        中醫(yī)特有的急救方法
        中老年保健(2021年9期)2021-08-24 03:52:04
        高中數(shù)學教學改革的方法
        河北畫報(2021年2期)2021-05-25 02:07:46
        化學反應多變幻 “虛擬”方法幫大忙
        變快的方法
        兒童繪本(2020年5期)2020-04-07 17:46:30
        學習方法
        可能是方法不對
        用對方法才能瘦
        Coco薇(2016年2期)2016-03-22 02:42:52
        最有效的簡單方法
        山東青年(2016年1期)2016-02-28 14:25:23
        四大方法 教你不再“坐以待病”!
        Coco薇(2015年1期)2015-08-13 02:47:34
        賺錢方法
        99久久精品自在自看国产| 一边摸一边做爽的视频17国产| 一本色道久久88加勒比—综合| 丰满人妻av无码一区二区三区| 中文字幕大屁股熟女乱| 偷拍与自偷拍亚洲精品| 少妇无套裸按摩呻吟无呜| 国产成本人片无码免费2020| 国产成人精品三级91在线影院 | 中国女人a毛片免费全部播放| 久久黄色精品内射胖女人| 欧美丰满少妇xxxx性| 亚洲精品无播放器在线播放 | 青青草免费在线手机视频| 极品av一区二区三区| 久久99精品国产麻豆不卡| 香蕉视频一级| 亚洲一区二区三区视频免费| 97人妻人人揉人人躁九色| 性一交一乱一伧国产女士spa| 国产精品99精品一区二区三区∴| 亚洲福利视频一区二区三区| 久久黄色视频| 欧美疯狂性xxxxxbbbbb| 2022精品久久久久久中文字幕| 青青久在线视频免费视频| 影音先锋色小姐| 二区三区视频| 国产麻豆一区二区三区在线播放| 伊人中文字幕亚洲精品乱码| 国产日韩精品中文字无码| 99精品国产第一福利网站| 久久久人妻一区二区三区蜜桃d | 亚洲欧美在线观看| 精品免费一区二区三区在| 日本美女中文字幕第一区| 2020无码专区人妻系列日韩| 国产精品11p| 一本之道加勒比在线观看| 亚洲国产成人精品无码区在线播放 | 亚洲中文字幕人妻久久|