>[0073]圖8為本發(fā)明實(shí)施例提供的代碼測(cè)試裝置的另一種結(jié)構(gòu)示意圖;
[0074]圖9為本發(fā)明實(shí)施例提供的代碼測(cè)試裝置中構(gòu)建單元的結(jié)構(gòu)示意圖;
[0075]圖10為本發(fā)明實(shí)施例提供的代碼測(cè)試裝置中獲取單元的結(jié)構(gòu)示意圖;
[0076]圖11為本發(fā)明實(shí)施例提供的代碼測(cè)試裝置中模擬單元的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0077]為了使本領(lǐng)域技術(shù)人員更好地理解本發(fā)明,首先對(duì)本發(fā)明涉及的一些專(zhuān)業(yè)術(shù)語(yǔ)進(jìn)行說(shuō)明:
[0078]Maven是基于項(xiàng)目對(duì)象模型(POM),可以通過(guò)一小段描述信息來(lái)管理報(bào)告、文檔以及項(xiàng)目的構(gòu)建的軟件項(xiàng)目管理工具,Maven包含一個(gè)項(xiàng)目對(duì)象模型(Project ObjectModel)、一組標(biāo)準(zhǔn)集合、一個(gè)項(xiàng)目生命周期(Project Lifecycle)、一個(gè)依賴(lài)管理系統(tǒng)(Dependency Management System)和用來(lái)運(yùn)行定義在生命周期階段(phase)中插件(plugin)目標(biāo)(goal)的邏輯;
[0079]Cobertura是一種開(kāi)源工具,其通過(guò)檢測(cè)基本的代碼,并觀察在測(cè)試包運(yùn)行時(shí)執(zhí)行了哪些代碼和沒(méi)有執(zhí)行哪些代碼,來(lái)測(cè)量測(cè)試覆蓋率;
[0080]Ant (Another Neat Tool)是一個(gè)基于Java的跨平臺(tái)構(gòu)建工具,可以實(shí)現(xiàn)項(xiàng)目的自動(dòng)構(gòu)建和部署等功能;
[0081]Mock工具是在測(cè)試過(guò)程中,對(duì)于某些不容易構(gòu)造或者不容易獲取的對(duì)象,用一個(gè)虛擬的對(duì)象來(lái)創(chuàng)建以便測(cè)試的測(cè)試方法;
[0082]mkdir是UNIX操作系統(tǒng)中的目錄操作命令,用來(lái)創(chuàng)建一個(gè)目錄;
[0083]javac是java語(yǔ)言編程編譯器,其中javac工具讀由java語(yǔ)言編寫(xiě)的類(lèi)和接口的定義,并將它們編譯成字節(jié)代碼的class文件,javac可以隱式編譯一些沒(méi)有在命令行中提及的源文件,并用-verbose選項(xiàng)可跟蹤自動(dòng)編譯;
[0084]JUnit是由Kent Beck和Erich Gamma編寫(xiě)的一個(gè)Java語(yǔ)言的單元測(cè)試框架,目前多數(shù)Java的開(kāi)發(fā)環(huán)境都已經(jīng)集成了 JUnit作為單元測(cè)試的工具;
[0085]JMock是基于Java開(kāi)發(fā),幫助創(chuàng)建mock這一模擬對(duì)象的工具,模擬對(duì)象可以取代真實(shí)對(duì)象的位置,用于測(cè)試一些與真實(shí)對(duì)象進(jìn)行交互或依賴(lài)于真實(shí)對(duì)象的功能;
[0086]Mockery是簡(jiǎn)單而靈活的PHP mock對(duì)象框架,常用在PHPUnit,PHPSpec或者其他測(cè)試框架的單元測(cè)試中,其核心目標(biāo)是提供一個(gè)雙向測(cè)試框架,提供一個(gè)succintAPI,能清晰的定義所有可能的對(duì)象操作和交互,使用人類(lèi)可讀的Domain SpecificLanguage (DSL)。
[0087]為了使本領(lǐng)域技術(shù)人員更好地理解本發(fā)明,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0088]請(qǐng)參閱圖1,其示出了本發(fā)明實(shí)施例提供的代碼測(cè)試方法的一種流程圖,可以包括以下步驟:
[0089]101:基于maven標(biāo)準(zhǔn)目錄結(jié)構(gòu),創(chuàng)建被測(cè)試代碼和測(cè)試代碼的工程目錄,以使被測(cè)試代碼和測(cè)試代碼的工程目錄的結(jié)構(gòu)為maven標(biāo)準(zhǔn)目錄結(jié)構(gòu)。在本發(fā)明實(shí)施例中,maven是目前常用的一種項(xiàng)目管理工具,其是基于項(xiàng)目對(duì)象模型并通過(guò)一段描述信息來(lái)管理項(xiàng)目的構(gòu)建、報(bào)告和文檔的軟件項(xiàng)目管理工具。在眾多工程師大量實(shí)踐中得出一 maven目錄結(jié)構(gòu)約定,該maven目錄結(jié)構(gòu)約定規(guī)定了較為合理的maven標(biāo)準(zhǔn)目錄結(jié)構(gòu),因此在本發(fā)明實(shí)施例中基于maven標(biāo)準(zhǔn)目錄結(jié)構(gòu),創(chuàng)建被測(cè)試代碼和測(cè)試代碼的工程目錄。
[0090]其中被測(cè)試代碼和測(cè)試代碼的工程目錄可以如圖2所示,其示出了被測(cè)試代碼的被測(cè)試代碼目錄和測(cè)試代碼的目錄以及使用的Cobertura測(cè)試包的資源目錄,被測(cè)試代碼目錄用于指示被測(cè)試代碼的代碼的存儲(chǔ)位置,測(cè)試代碼目錄用于指示測(cè)試代碼的代碼存儲(chǔ)位置,Cobertura測(cè)試包的資源目錄用于指示被測(cè)試代碼測(cè)試過(guò)程中使用的Cobertura測(cè)試包的存儲(chǔ)位置。因此基于maven標(biāo)準(zhǔn)目錄結(jié)構(gòu)創(chuàng)建的工程目錄有利于測(cè)試包和代碼的管理,以及有利于對(duì)測(cè)試包的復(fù)用。
[0091]102:將Cobertura測(cè)試包存儲(chǔ)至工程目錄中資源目錄指定的存儲(chǔ)位置中。其中Cobertura測(cè)試包是指Cobertura提供的用于對(duì)被測(cè)試代碼進(jìn)行測(cè)試的方法和類(lèi)等。之所以使用Cobertura測(cè)試包是因?yàn)镃obertura測(cè)試包具有如下優(yōu)點(diǎn):
[0092]l)Cobertura的源碼較容易理解,便于測(cè)試人員根據(jù)需要進(jìn)行修改重構(gòu);
[0093]2) Cobertura支持Ant Task,且使得用戶(hù)可以通過(guò)配置不同的參數(shù)屬性,來(lái)獲得預(yù)期的執(zhí)行結(jié)果;
[0094]3) Cobertura提供了覆蓋率指標(biāo)檢查任務(wù),可以實(shí)現(xiàn)覆蓋率的自動(dòng)檢查和判斷。在代碼測(cè)試過(guò)程中只需要更換新的被測(cè)試代碼的代碼,即可自動(dòng)判斷代碼重構(gòu)后是否滿(mǎn)足單元測(cè)試代碼覆蓋率的要求,有利于測(cè)試的自動(dòng)化;
[0095]4) Cobertura提供了多種目標(biāo)任務(wù)來(lái)統(tǒng)計(jì)測(cè)試覆蓋率,并且生成較美觀易用的覆蓋率測(cè)試報(bào)告,覆蓋率測(cè)試報(bào)告用于指示代碼覆蓋率情況,通過(guò)其可直接定位到有問(wèn)題的代碼和未測(cè)試到的代碼。
[0096]103:將所述被測(cè)試代碼和測(cè)試代碼的工程目錄與預(yù)先創(chuàng)建的構(gòu)建文件關(guān)聯(lián),以使所述構(gòu)建文件調(diào)用所述Cobertura測(cè)試包將Ant工具和Cobertura工具結(jié)合來(lái)對(duì)被測(cè)試代碼進(jìn)行單元測(cè)試并得到所述被測(cè)試代碼的代碼覆蓋率情況。
[0097]在本發(fā)明實(shí)施例中,構(gòu)建文件被預(yù)先構(gòu)建,其默認(rèn)命令可以是build, xml,build,xml定義一個(gè)唯一的項(xiàng)目(project元素),每個(gè)項(xiàng)目下可以定義很多目標(biāo)(target元素),每個(gè)目標(biāo)可以定義多個(gè)任務(wù)。在構(gòu)建目標(biāo)時(shí)必須調(diào)用所定義的任務(wù),任務(wù)定義了 Ant實(shí)際執(zhí)行的命令。在執(zhí)行命令時(shí)其可以調(diào)用Cobertura測(cè)試包將Ant工具和Cobertura工具結(jié)合,例如可以通過(guò)Ant工具將Cobertura工具集成到Eclipse中,得到可視化測(cè)試環(huán)境,如圖3所示。
[0098]在該可視化測(cè)試環(huán)境中每個(gè)節(jié)點(diǎn)為構(gòu)建文件中的一個(gè)目標(biāo),當(dāng)檢測(cè)到用戶(hù)對(duì)某個(gè)節(jié)點(diǎn)的雙擊操作后,可以調(diào)用該節(jié)點(diǎn)所對(duì)應(yīng)的目標(biāo)來(lái)執(zhí)行相應(yīng)的命令以對(duì)被測(cè)試代碼進(jìn)行測(cè)試,如可以通過(guò)coverage-r印ort目標(biāo)得到被測(cè)試代碼的代碼覆蓋率情況和利用test目標(biāo)對(duì)待測(cè)試對(duì)象進(jìn)行單元測(cè)試。其中代碼覆蓋率情況是指測(cè)試代碼對(duì)被測(cè)試代碼的代碼的覆蓋情況。
[0099]可以理解的是:Ant工具中的JUnit是一個(gè)JAVA單元測(cè)試框架,可以支持單元測(cè)試的管理和執(zhí)行。當(dāng)測(cè)試代碼確定后,可以通過(guò)JUnit進(jìn)行持久化管理并復(fù)用。因此進(jìn)行代碼測(cè)試時(shí),只需要更新被測(cè)試代碼的代碼,然后運(yùn)行測(cè)試代碼即可實(shí)現(xiàn)單元測(cè)試。在此基礎(chǔ)上再集成Cobertura每次運(yùn)行單元測(cè)試時(shí),便可同時(shí)得到代碼覆蓋率情況。因此對(duì)于每個(gè)被測(cè)試代碼來(lái)說(shuō)只需要將被測(cè)試代碼的工程目錄與預(yù)先創(chuàng)建的構(gòu)建文件關(guān)聯(lián)即可,無(wú)需對(duì)每個(gè)被測(cè)試代碼基于Ant工具進(jìn)行重新構(gòu)建,從而提高測(cè)試的通用性。
[0100]在本發(fā)明實(shí)施例中,將被測(cè)試代碼和測(cè)試代碼的工程目錄與預(yù)先創(chuàng)建的構(gòu)建文件關(guān)聯(lián)的一種方式是:在工程目錄的config工程目錄中添加外置屬性文件build,properties,屬性文件中每個(gè)變量通過(guò)相對(duì)路徑的方式指向工程目錄下相對(duì)應(yīng)的子目錄。即獲取工程目錄下每個(gè)子目錄的相對(duì)路徑,并將每個(gè)子目錄的相對(duì)路徑添加到預(yù)先創(chuàng)建的屬性文件中,預(yù)先創(chuàng)建的屬性文件中每個(gè)變量指向各自對(duì)應(yīng)的每個(gè)子目錄的相對(duì)路徑。
[0101]然后在構(gòu)建文件中使用project的XML標(biāo)簽作為構(gòu)建文件中的根元素來(lái)定義這個(gè)項(xiàng)目。同時(shí)利用property file = “build, properties”引用屬性文件并將property的basedir設(shè)置為當(dāng)前工程目錄,這樣被測(cè)試代碼和測(cè)試代碼的工程目錄與構(gòu)建文件關(guān)聯(lián)上。
[0102]這里需要說(shuō)明的一點(diǎn)是:相對(duì)路徑是指由當(dāng)前工程目錄所在的路徑與當(dāng)前工程目錄所依賴(lài)的其他目錄的路徑關(guān)系。在本發(fā)明實(shí)施例中,將當(dāng)前工程目錄所依賴(lài)的其他目錄的路徑關(guān)系表示為與當(dāng)前工程根目錄的相對(duì)路徑時(shí),無(wú)論任何被測(cè)試代碼,只需要根據(jù)本發(fā)明中提供的maven標(biāo)準(zhǔn)目錄結(jié)構(gòu)來(lái)創(chuàng)建工程目錄,其相對(duì)路徑都是一樣的,即可以直接運(yùn)用本發(fā)明提供的構(gòu)建文件進(jìn)行代碼覆蓋率測(cè)試,而不需要每次都重建構(gòu)建文件。
[0103]104:從被測(cè)試代碼中選擇需要測(cè)試的測(cè)試單元,并剔除被測(cè)試代碼中無(wú)需測(cè)試的測(cè)試單元。在本發(fā)明實(shí)施例中,代碼覆蓋率=已執(zhí)行代碼行數(shù)/參測(cè)代碼總行數(shù)*100%。從代碼覆蓋率的計(jì)算方式可以看出,要提高代碼覆蓋率,可提高被測(cè)代碼行數(shù)或減少參測(cè)代碼總行數(shù),因此為提高代碼覆蓋率,本發(fā)明實(shí)施例可以剔除被測(cè)試代碼中無(wú)需測(cè)試的測(cè)試單元來(lái)減少參測(cè)代碼總行數(shù)。
[0104]105:利用Mock工具模擬未完成的協(xié)同對(duì)象,其中協(xié)同對(duì)象為被測(cè)試代碼運(yùn)行時(shí)調(diào)用的對(duì)象,以輔助處理后的被測(cè)試代碼正常運(yùn)行。
[0105]例如假設(shè)被測(cè)試代碼A在運(yùn)行時(shí)需要調(diào)用協(xié)同對(duì)象B來(lái)執(zhí)行相應(yīng)的行為,這樣被測(cè)試代碼A才能正常運(yùn)行,但是此時(shí)協(xié)同對(duì)象B還未完成開(kāi)發(fā),因此本發(fā)明實(shí)施例利用Mock工具模擬未完成的協(xié)同對(duì)象B,來(lái)模擬被測(cè)試代碼調(diào)用協(xié)同對(duì)象B時(shí)協(xié)同對(duì)象B所執(zhí)行的行為,以輔助被測(cè)試代碼的正常運(yùn)行。
[0106]106:獲取處理后的被測(cè)試代碼的測(cè)試代碼,并運(yùn)行構(gòu)建文件和測(cè)試代碼,得到測(cè)試結(jié)果,測(cè)試結(jié)果用于指示被測(cè)試代碼的代碼覆蓋率情況和運(yùn)行情況。其中運(yùn)行情況為通過(guò)測(cè)試代碼驗(yàn)證被測(cè)試代碼是否正確實(shí)現(xiàn)所需功能的情況以及被測(cè)試代碼是否能夠正確運(yùn)行的情況。
[0107]從上述技術(shù)方案可以看出,在測(cè)試每個(gè)被測(cè)試代碼時(shí),可以基于maven標(biāo)準(zhǔn)目錄結(jié)構(gòu),創(chuàng)建被測(cè)試代碼和測(cè)試代碼的工程目錄,然后將被測(cè)試代碼使用的Cobertura測(cè)試包存儲(chǔ)至工程目錄中資源目錄指定的存儲(chǔ)位置中,并將被測(cè)試代碼和測(cè)試代碼的工程目錄與預(yù)先創(chuàng)建的構(gòu)建文件關(guān)聯(lián),使得構(gòu)建文件可以調(diào)用Cobertura測(cè)試包將Ant工具和Cobertura工具結(jié)合來(lái)對(duì)被測(cè)試代碼進(jìn)行單元測(cè)試并得到所述被測(cè)試代碼的代碼覆蓋率情況,這樣對(duì)于每個(gè)被測(cè)試代碼來(lái)說(shuō),只需要基于maven標(biāo)準(zhǔn)目錄結(jié)構(gòu)創(chuàng)建工程目錄,基于工程目錄來(lái)存儲(chǔ)所用的Cobertura測(cè)試包并關(guān)聯(lián)構(gòu)建文件來(lái)獲得代碼覆蓋率情況,從而無(wú)需針對(duì)每個(gè)被測(cè)試代碼來(lái)重新進(jìn)行Ant構(gòu)建過(guò)程,提高測(cè)試的通用性。
[0108]在本發(fā)明實(shí)施例中,構(gòu)建文件的預(yù)先構(gòu)建過(guò)程如圖4所示,可以包括以下步驟:
[0109]201:使用mkdir命令創(chuàng)建構(gòu)建文件的臨時(shí)目錄,臨時(shí)目錄用于提供測(cè)試過(guò)程生成的臨時(shí)文件的目錄。其中臨時(shí)文件是在在執(zhí)行代碼覆蓋率測(cè)試的過(guò)程中生成的文件,如下述調(diào)用Ant的javac任務(wù)對(duì)被測(cè)試代碼和測(cè)試代碼進(jìn)行編譯后得到的class文件以及插粧后的class文件等。在本發(fā)明實(shí)施例中臨時(shí)目錄可以為工程目錄下的一個(gè)子目錄,如上述圖2所示工程目錄下的build目錄。
[0110]202:創(chuàng)建構(gòu)建文件下的complie目標(biāo),compile目標(biāo)用于調(diào)用Ant的javac任務(wù)對(duì)被測(cè)試代碼和測(cè)試代碼進(jìn)行編譯。其中javac任務(wù)允許設(shè)置所有的編譯器選項(xiàng),如源代碼目錄、目標(biāo)目錄以及編譯所依賴(lài)的其它資源等。在調(diào)用javac任務(wù)對(duì)被測(cè)試代碼和測(cè)試代碼進(jìn)行編譯后得到后綴為.class的文件,將.class的文件存儲(chǔ)在臨時(shí)目錄下。
[0111]203:創(chuàng)建構(gòu)建文件下的instrument目標(biāo),以調(diào)用Cobertura的instrument任務(wù),對(duì)被測(cè)試代碼中的被測(cè)java程序編譯所得class文件進(jìn)行插粧。其中插粧是一種成熟的工具,它是在被測(cè)程序中插入探針,然后通過(guò)探針的執(zhí)行來(lái)獲得程序運(yùn)行時(shí)的一些數(shù)據(jù)。在這一步中對(duì)上一步驟得到的.class文件進(jìn)行插粧,為了方便管理和使用,把插粧后的文件保存到臨時(shí)目錄的另一個(gè)目錄下。
[0112]204:創(chuàng)建構(gòu)建文件下的test目標(biāo)以調(diào)用Ant的JUnit任務(wù)對(duì)被測(cè)試代碼進(jìn)行單元測(cè)試,在進(jìn)行單元測(cè)試時(shí)通過(guò)test目標(biāo)的name屬性指定將要運(yùn)行的測(cè)試代碼的名稱(chēng)。
[0113]由于同一個(gè)項(xiàng)目有多個(gè)不同的測(cè)試代碼,所以在調(diào)用JUnit任