專利名稱:一種單元測試的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本申請涉及軟件測試領(lǐng)域,特別涉及一種單元測試的方法和裝置。
背景技術(shù):
単元測試是在軟件開發(fā)過程中要進行的最低級別的測試活動,在単元測試過程中,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試。因此,単元測試不僅僅是作為無錯編碼的ー種輔助手段應(yīng)用于一次性的開發(fā)過程,単元測試也必須是可重復的,無論是在軟件修改過程中,還是移植到新的運行環(huán)境之后。而在單元測試過程中,對于某些不容易構(gòu)造或者不容易獲取的對象,可以采用創(chuàng)建ー個虛擬的對象來進行測試的方式,這個虛擬的對象就稱為Mock對象。Mock對象就是實際中的對象在單元測試期間的代替品OMock對象是Mock類的實例化,在現(xiàn)有技術(shù)中,單元測試中Mock類的代碼編寫,主 要依賴于人工,所有的Mock類的代碼編寫完畢,就組成了 Mock庫。但是這種人工編寫代碼的效率很低,進行單元測試時的效率也非常低下;尤其是在對代碼質(zhì)量要求較高的情況下,就會因為低效的単元測試程序編寫而浪費了大量的人力物カ資源。不僅如此,還會使得単元測試的程序代碼的可維護性較差??傊?,目前需要本領(lǐng)域技術(shù)人員迫切解決的ー個技術(shù)問題就是如何能夠創(chuàng)新的提出ー種自動進行単元測試的方法,以解決現(xiàn)有技術(shù)中單元測試的效率低下以及可維護性較差的問題。
發(fā)明內(nèi)容
本申請所要解決的技術(shù)問題是提供一種單元測試的方法,用以解決現(xiàn)有技術(shù)中編寫単元測試程序的效率低下以及可維護性較差的問題。本申請還提供了一種單元測試的裝置,用以保證上述方法在實際中的實現(xiàn)及應(yīng)用。為了解決上述問題,本申請公開了一種單元測試的方法,包括接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型;依據(jù)所述被測方法從所述預(yù)先構(gòu)建的領(lǐng)域?qū)ο竽P蛶觳檎翌I(lǐng)域?qū)ο螅?或從預(yù)先生成的Mock庫中查找Mock類;使用所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法;按照所述測試方法對所述原始類進行単元測試。優(yōu)選的,還包括針對所述被測方法的源代碼進行靜態(tài)分析,以生成Mock庫的步驟,具體為獲取待測試源代碼中各個需要被Mock的原始類;通過反射獲得所述各個原始類的類中被測方法的參數(shù),所述類參數(shù)包括被測方法名稱、參數(shù)類型和返回值類型;依據(jù)所述類參數(shù)生成所述原始類對應(yīng)的各個Mock類;將所述各個Mock類組成的集合作為Mock庫。優(yōu)選的,還包括構(gòu) 建領(lǐng)域?qū)ο竽P蛶斓牟襟E,具體為獲取待測試源代碼中被引用的領(lǐng)域?qū)ο?;按照所述被引用的領(lǐng)域?qū)ο笾g的引用關(guān)系對其進行排序;通過反射獲取所述被引用的領(lǐng)域?qū)ο蟮膶傩孕畔?,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型;將所述屬性信息和被引用的領(lǐng)域?qū)ο蟮耐暾窂桨凑找藐P(guān)系順序存儲至所述領(lǐng)域?qū)ο竽P蛶熘?,所述領(lǐng)域?qū)ο竽P蛶熘械囊恍袛?shù)據(jù)為ー個領(lǐng)域?qū)ο蟮男畔?。?yōu)選的,還包括加載所述領(lǐng)域?qū)ο竽P蛶斓牟襟E,具體為從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取單條數(shù)據(jù),所述單條數(shù)據(jù)包括領(lǐng)域?qū)ο蟮耐暾窂郊捌涑跏贾?;依?jù)所述領(lǐng)域?qū)ο蟮耐暾窂酵ㄟ^反射調(diào)用無參構(gòu)造方法,以創(chuàng)建所述領(lǐng)域?qū)ο蟮膶嵗?;依?jù)所述類型及其初始值調(diào)用屬性的賦值方法對所述類型進行賦值;將所述領(lǐng)域?qū)ο蟮耐暾窂胶退鲑x值后的領(lǐng)域?qū)ο蟮膶嵗鳛橛成潢P(guān)系對保存至內(nèi)存中。優(yōu)選的,所述按照所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法,包括獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調(diào)用的方法的參數(shù)和返回值類型;根據(jù)所述引用類的類型生成測試方法的方法頭;根據(jù)所述引用類的類型及其所調(diào)用的方法的返回值類型生成引用類列表;遍歷所述引用類列表,以生成模擬引用類對象行為的代碼;從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取所述引用類的方法參數(shù)值,以生成測試方法的方法體;將固定的方法尾、所述方法頭以及方法體組成所述測試方法。本申請公開了一種單元測試的裝置,包括接收模塊,用于接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型;查找模塊,用于依據(jù)所述被測方法從所述預(yù)先構(gòu)建的領(lǐng)域?qū)ο竽P蛶觳檎翌I(lǐng)域?qū)ο螅?或從預(yù)先生成的Mock庫中查找Mock類;生成模塊,用于使用所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法;測試模塊,用于按照所述測試方法對所述原始類進行単元測試。優(yōu)選的,還包括生成Mock庫模塊,具體包括第一獲取子模塊,用于獲取待測試源代碼中各個需要被Mock的原始類;第一反射子模塊,用于通過反射獲得所述各個原始類的類中被測方法的參數(shù),所述類參數(shù)包括被測方法名稱、參數(shù)類型和返回值類型;
第一生成子模塊,用于依據(jù)所述類參數(shù)生成所述原始類對應(yīng)的各個Mock類;組合子模塊,用于將所述各個Mock類組成的集合作為Mock庫。優(yōu)選的,還包括構(gòu)建模塊,所述構(gòu)建模塊具體包括第二獲取子模塊,用于獲取待測試源代碼中被引用的領(lǐng)域?qū)ο螅慌判蜃幽K,用于按照所述被引用的領(lǐng)域?qū)ο笾g的引用關(guān)系對其進行排序;第二反射子模塊,用于通過反射獲取所述被引用的領(lǐng)域?qū)ο蟮膶傩孕畔?,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型。存儲子模塊,用于將所述屬性信息和被引用的領(lǐng)域?qū)ο蟮耐暾窂桨凑找藐P(guān)系 順序存儲至所述領(lǐng)域?qū)ο竽P蛶熘?,所述領(lǐng)域?qū)ο竽P蛶熘械囊恍袛?shù)據(jù)為ー個領(lǐng)域?qū)ο蟮男畔ⅰ?yōu)選的,還包括加載模塊,所述加載模塊具體包括第三獲取子模塊,用于從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取單條數(shù)據(jù),所述單條數(shù)據(jù)包括領(lǐng)域?qū)ο蟮耐暾窂郊捌涑跏贾?;?chuàng)建子模塊,用于依據(jù)所述領(lǐng)域?qū)ο蟮耐暾窂酵ㄟ^反射調(diào)用無參構(gòu)造方法,以創(chuàng)建所述領(lǐng)域?qū)ο蟮膶嵗毁x值子模塊,用于依據(jù)所述類型及其初始值調(diào)用屬性的賦值方法對所述類型進行賦值;保存子模塊,用于將所述領(lǐng)域?qū)ο蟮耐暾窂胶退鲑x值后的領(lǐng)域?qū)ο蟮膶嵗鳛橛成潢P(guān)系對保存至內(nèi)存中。優(yōu)選的,所述生成模塊包括第四獲取子模塊,用于獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調(diào)用的方法的參數(shù)和返回值類型;第二生成子模塊,用于根據(jù)所述引用類的類型生成測試方法的方法頭;第三生成子模塊,用于根據(jù)所述引用類的類型及其所調(diào)用的方法的返回值類型生成引用類列表;遍歷子模塊,用于遍歷所述引用類列表,以生成模擬引用類對象行為的代碼;第四生成子模塊,用于從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取所述引用類的方法參數(shù)值,以生成測試方法的方法體;組成子模塊,用于將固定的方法尾、所述方法頭以及方法體組成所述測試方法。與現(xiàn)有技術(shù)相比,本申請包括以下優(yōu)點在本申請中,単元測試的代碼通過本實施例的方案自動生成,生成的代碼再運行時,通過直接從預(yù)先生成的領(lǐng)域?qū)ο竽P蛶飓@取相關(guān)的領(lǐng)域?qū)ο?,以及調(diào)用預(yù)先生成的Mock庫中獲取對應(yīng)的Mock類完成単元測試,能夠不再需要人工編寫代碼,提高単元測試的效率。因此,単元測試的程序代碼的可維護性也較好。同時,在加載領(lǐng)域?qū)ο竽P蛶斓臅r候,將領(lǐng)域?qū)ο竽P蛶旆诺絻?nèi)存中,可以從內(nèi)存中直接獲取,省去了人工編寫的工作量。當然,實施本申請的任ー產(chǎn)品并不一定需要同時達到以上所述的所有優(yōu)點。
為了更清楚地說明本申請實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請的ー些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖I是本申請的ー種單元測試的方法實施例I的流程圖;圖2是在方法實施例I中步驟103的流程圖;圖3是本申請的ー種單元測試的方法實施例2的流程圖;圖4是方法實施例2中步驟301的流程圖;
圖5是方法實施例2中步驟302的流程圖;圖6是方法實施例2中步驟304的流程圖;圖7是本申請的ー種單元測試的裝置實施例I的結(jié)構(gòu)框圖;圖8是裝置實施例I中生成模塊703的結(jié)構(gòu)框圖;圖9是本申請的ー種單元測試的裝置實施例2的結(jié)構(gòu)框圖;圖10是裝置實施例2中生成Mock庫模塊901的結(jié)構(gòu)框圖;圖11是裝置實施例2中構(gòu)建模塊902的結(jié)構(gòu)框圖;圖12是裝置實施例2中加載模塊903的結(jié)構(gòu)框圖。
具體實施例方式下面將結(jié)合本申請實施例中的附圖,對本申請實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本申請一部分實施例,而不是全部的實施例?;诒旧暾堉械膶嵤├绢I(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本申請保護的范圍。本申請可用于眾多通用或?qū)S玫挠嬎阊b置環(huán)境或配置中。例如個人計算機、服務(wù)器計算機、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器裝置、包括以上任何裝置或設(shè)備的分布式計算環(huán)境等等。本申請可以在由計算機執(zhí)行的計算機可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計算環(huán)境中實踐本申請,在這些分布式計算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠程處理設(shè)備來執(zhí)行任務(wù)。在分布式計算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠程計算機存儲介質(zhì)中。本申請的主要思想之一可以包括,通過直接從預(yù)先生成的領(lǐng)域?qū)ο竽P蛶飓@取相關(guān)的領(lǐng)域?qū)ο?,以及從預(yù)先生成的Mock庫中獲取對應(yīng)的Mock類,從而可以在進行単元測試的時候,能夠不再需要人工編寫代碼,提高單元測試的效率,并且,因為不再需要人工編寫代碼,因此,単元測試的程序代碼的可維護性也較好。另外,単元測試的代碼通過本申請實施例的方案自動生成,生成的代碼再運行時,通過直接從預(yù)先生成的領(lǐng)域?qū)ο竽P蛶飓@取相關(guān)的領(lǐng)域?qū)ο螅约罢{(diào)用預(yù)先生成的Mock庫中獲取對應(yīng)的Mock類完成単元測試,能夠不再需要人工編寫代碼,提高單元測試的效率。參考圖1,示出了本申請ー種単元測試的方法實施例I的流程圖,可以包括以下步驟步驟101 :接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型。在本實施例中,所述期望字段即是待測試的類中的被測方法的返回值類型或其屬性的類型,単元測試的目的即是測試所述期望字段的值是否與測試值相同??梢杂捎脩粼谳斎虢缑鎭磔斎肫谕侄魏蜏y試值,例如,用戶可以依次選擇測試領(lǐng)域中的ー個包,并選擇該包中的某ー個原始類,這個原始類包括了很多方法,因此可以針對需要測試的各個方法都輸入相應(yīng)的期望字段和期望值。步驟102 :依據(jù)所述被測方法從所述預(yù)先構(gòu)建的領(lǐng)域?qū)ο竽P蛶觳檎翌I(lǐng)域?qū)ο螅?或從預(yù)先生成的Mock庫中查找Mock類。其中,所述Mock庫為預(yù)先生成的Mock類的集合,各個Mock類都包括若干個Mock方法,這些Mock方法在運行時都可以模擬原始方法的行為。所述領(lǐng)域?qū)ο竽P蛶熘械念I(lǐng)域?qū)ο竽P褪潜粶y系統(tǒng)中引用到的領(lǐng)域?qū)ο?,包括具體的和抽象的業(yè)務(wù)模型。例如數(shù)據(jù)對象、值對象、實體、枚挙、基本類型及其封裝類,等等。
需要說明的是,在得到被測方法之后,在本步驟中就可以通過反射和靜態(tài)代碼分析得到被測方法所引用到的領(lǐng)域?qū)ο蠛鸵妙悾俑鶕?jù)被測方法引用的領(lǐng)域?qū)ο笕ヮI(lǐng)域?qū)ο竽P蛶熘胁檎覍?yīng)的源代碼,井根據(jù)被測方法的引用類去調(diào)用Mock庫中的Mock類。步驟103 :使用所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法。根據(jù)查找到的領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法。需要說明的是,在實際應(yīng)用中,因為各個被測方法所引用的領(lǐng)域?qū)ο蠡蛘咭妙惒煌虼?,可以需要根?jù)查找到的領(lǐng)域?qū)ο螳@取屬于當前被測方法所引用的領(lǐng)域?qū)ο笠约澳M當前被測方法的引用類的行為的Mock類,這樣就能根據(jù)查找到的領(lǐng)域?qū)ο笠约癕ock類組合生成被測方法。在實際應(yīng)用中,參考圖2所示,所述步驟103具體可以包括步驟201 :獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調(diào)用的方法的參數(shù)和返回值類型。本步驟可以獲取到被測方法所引用的原始類的引用類的類型,以及該引用類所調(diào)用的方法的返回值類型。例如,被測方法為A,該方法引用了原始類D,而D又引用了引用類E,在E類下調(diào)用了方法B,那么本步驟即是獲取E類的類型,以及方法B的返回值類型。這里的返回值類型可以理解為整型(int)或者字符串型(string)或自定義的復雜類型等。所述原始類即是需要被Mock的類,為了與Mock類進行區(qū)分,在本申請實施例中將需要被Mock的類稱為原始類。步驟202 :根據(jù)所述原始類的引用類的類型生成測試方法的方法頭。在測試方法中的方法頭中聲明所述弓丨用類的類型。步驟203 :根據(jù)所述引用類的類型及其所調(diào)用的方法的返回值類型生成引用類列表。根據(jù)引用類的類型及其調(diào)用的方法的返回值類型,生成ー個引用類列表,其中,參考表I所示,第一列表示引用類的名稱,第二列表示其所調(diào)用方法的返回值類型。表I引用類r該引用類所調(diào)用的方法的返回值類型
CcrCreditCardInfoDAOccrCreditCardlnfoDO
CcrCreditCardBankInfoDAOList<CcrCreditCardBankInfoDO>步驟204 :遍歷所述引用類列表,以生成模擬引用類對象行為的代碼。針對該引用類列表中的每ー個引用類,都對應(yīng)生成一段模擬行為的代碼。首先,判斷本次是否需要該引用類對象調(diào)用的方法拋出異常,如果需要則可以設(shè)置參數(shù)“true”來表示測試方法需要拋出異常,如果不需要則可以設(shè)置參數(shù)“false”;然后判斷引用類是否有返回值,如果有,則從領(lǐng)域?qū)ο竽P蛶熘腥〕鯩ock類的返回值;最后調(diào)用Mock庫中的相應(yīng)Mock方法,返回被Mock的引用類實例并將其注入被測類的對象。步驟205 :從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取所述引用類的方法參數(shù)值,以生成測試 方法的方法體。再從領(lǐng)域?qū)ο竽P蛶熘蝎@取所述引用類的方法參數(shù)值,井根據(jù)步驟204中的模擬結(jié)果,可以生成測試方法的方法體部分。步驟206 :將固定的方法尾、所述方法頭以及方法體組成測試方法。本步驟即是將固定格式的方法尾,以及前述的方法頭和方法體,組成測試方法。步驟104 :按照所述測試方法對所述選擇的原始類進行単元測試。生成測試方法之后,就可以根據(jù)測試方法對所選擇的原始類進行単元測試。采用本申請實施例,単元測試程序運行時可以直接從預(yù)先生成的領(lǐng)域?qū)ο竽P蛶煲约癕ock庫中獲取相關(guān)的領(lǐng)域?qū)ο笠约癕ock類,從而可以在進行單元測試的時候,能夠提高單元測試的效率,并且,因為不再需要人工編寫代碼,因此,単元測試的程序代碼的可維護性也較好。參考圖3,示出了本申請ー種単元測試的方法實施例2的流程圖,可以包括以下步驟步驟301 :針對所述被測方法的源代碼進行靜態(tài)分析,以生成Mock庫。本步驟即是對被測方法的源代碼進行靜態(tài)分析,最終生成Mock庫的步驟。靜態(tài)分析具體可以包括分析該被測方法是否需要拋出異常;分析該被測方法引用到的引用類的類型;分析該被測方法的參數(shù)名(并非類型);以及,分析該被測方法引用到的引用類對象調(diào)用的方法。再對上述信息利用反射做進ー步分析,可以得到該被測方法引用到的引用類所調(diào)用的方法的返回值類型等。這里的反射指的是可以在不對ー個類進行分析的前提下,可以直接獲得類名稱、類的方法返回值、方法名、成員變量名或者成員變量類型等參數(shù)在實際應(yīng)用中,參考圖4所示,所述步驟301具體可以包括步驟401 :獲取待測試源代碼中各個需要被Mock的原始類。步驟402 :通過反射獲得所述各個原始類的類中被測方法的參數(shù),所述類參數(shù)包括被測方法名稱、參數(shù)類型和返回值類型。步驟403 :依據(jù)所述類參數(shù)生成所述原始類對應(yīng)的各個Mock類。
步驟404 :將所述各個Mock類組成的集合作為Mock庫。關(guān)于生成Mock庫的詳細內(nèi)容可以參考另ー篇專利“ー種単元測試中生成Mock庫的方法和裝置”。步驟302 :構(gòu)建領(lǐng)域?qū)ο竽P蛶?。在本步驟還需要構(gòu)建領(lǐng)域?qū)ο竽P蛶欤擃I(lǐng)域?qū)ο竽P蛶煊糜诒4姹粶y方法中所引用到的領(lǐng)域?qū)ο?,該領(lǐng)域?qū)ο笠詫傩孕畔橹鳌nI(lǐng)域?qū)ο竽P蛶炜梢圆捎梦募姆绞竭M行存儲,每一行數(shù)據(jù)為ー個領(lǐng)域?qū)ο竽P托畔?。在其中需要存儲兩部分?nèi)容該領(lǐng)域?qū)ο蟮娜窂胶皖I(lǐng)域?qū)ο蟾鲗傩缘拿Q和初始值。在實際應(yīng)用中,參考圖5所示,所述步驟302具體可以包括步驟501 :獲取待測試源代碼中被引用的領(lǐng)域?qū)ο蟆?
首先獲取到待測試源代碼中都引用了哪些領(lǐng)域?qū)ο蟆2襟E502 :按照所述被引用的領(lǐng)域?qū)ο笾g的引用關(guān)系對其進行排序。然后再找出這些領(lǐng)域?qū)ο笾g是什么樣的引用關(guān)系,也稱為依賴關(guān)系,并按照引用關(guān)系對領(lǐng)域?qū)ο筮M行排序,將被引用的對象排在前面,將引用的對象排在后面。例如,領(lǐng)域?qū)ο驛引用B,B又引用C,因此如果初始化A,必須先初始化B,而如果需要初始化B,必須先初始化C,因此可以通過對象之間的引用關(guān)系將其順序排好C、B和A。這樣在后續(xù)進行初始化的時候就可以先初始化C。假設(shè)C的屬性都是簡單類型,通過默認初值進行賦值即可,再放到領(lǐng)域?qū)ο竽P蛶炖铩=又谛枰跏蓟疊時要用到C,就從領(lǐng)域?qū)ο竽P蛶炖飳取出來,賦值后再把B放到領(lǐng)域?qū)ο竽P蛶炖?,最后初始化A時再把B從領(lǐng)域?qū)ο竽P蛶炖锶〕鰜?。步驟503 :通過反射獲取所述被引用的領(lǐng)域?qū)ο蟮膶傩孕畔?,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型。通過反射獲取所述被引用的領(lǐng)域?qū)ο蟮膶傩孕畔?,即是領(lǐng)域?qū)ο蟮念愋图捌涿Q,類型可以分為基本類型和復雜類型。步驟504 :將所述屬性信息和被引用的領(lǐng)域?qū)ο蟮耐暾窂桨凑找藐P(guān)系順序存儲至所述領(lǐng)域?qū)ο竽P蛶熘?,所述領(lǐng)域?qū)ο竽P蛶熘械囊恍袛?shù)據(jù)為ー個領(lǐng)域?qū)ο蟮男畔?。將引用到的領(lǐng)域?qū)ο蟮娜蛯傩孕畔凑找庙樞虼鎯υ陬I(lǐng)域?qū)ο竽P蛶熘?,在存儲的時候?qū)⒁粋€領(lǐng)域?qū)ο蟮男畔⒋鎯橐恍袛?shù)據(jù),這樣就生成了領(lǐng)域?qū)ο竽P蛶?。步驟303 :接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型。接著在人機交互界面可以接收用戶的期望字段和測試值,并在用戶觸發(fā)了單元測試程序之后,開始進行単元測試。步驟304 :加載所述領(lǐng)域?qū)ο竽P蛶斓牟襟E。在進行單元測試的時候,因為領(lǐng)域?qū)ο竽P蛶焓且晕募男问酱嬖谟脖P上,因此生成的単元測試程序要想運行,必須先加載到內(nèi)存中。在實際應(yīng)用中,參考圖6所示,所述步驟304具體可以包括步驟601 :從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取單條數(shù)據(jù),所述單條數(shù)據(jù)包括領(lǐng)域?qū)ο蟮耐暾窂?、類型及其初始值。從領(lǐng)域?qū)ο竽P蛶熘幸来稳〕鰡螚l數(shù)據(jù),就是讀出其中的一行數(shù)據(jù),里邊包含領(lǐng)域模型的完整路徑,及其類型和類型的初始值。步驟602 :依據(jù)所述領(lǐng)域?qū)ο蟮耐暾窂酵ㄟ^反射調(diào)用無參構(gòu)造方法,以創(chuàng)建所述領(lǐng)域?qū)ο蟮膶嵗S辛祟I(lǐng)域?qū)ο蟮娜?,就可以通過反射的方式調(diào)用其無參構(gòu)造方法,然后再通過反射調(diào)用,獲取各個屬性的賦值方法進行賦值。步驟603 :依據(jù)所述類型及其名稱調(diào)用屬性的賦值方法對所述類型進行賦值。利用步驟602中獲取的初始值對類型進行初始化。另外,不管是初始化簡單類型還是復雜類型,都要調(diào)用屬性的賦值方法進行賦值。步驟604 :將所述領(lǐng)域?qū)ο蟮耐暾窂胶退鲑x值后的領(lǐng)域?qū)ο蟮膶嵗鳛橛成潢P(guān)系對保存至內(nèi)存中。 由于映射關(guān)系(Map)可以以key-value對的形式存放對象,方便查找,因此,key存領(lǐng)域?qū)ο蟮耐暾窂?,value就是初始化好的對象,即是賦值后的領(lǐng)域?qū)ο蟮膶嵗?。步驟305 :依據(jù)所述被測方法從所述預(yù)先構(gòu)建的領(lǐng)域?qū)ο竽P蛶觳檎翌I(lǐng)域?qū)ο螅?或從預(yù)先生成的Mock庫中查找Mock類。加載了所述領(lǐng)域?qū)ο竽P蛶熘?,再從?nèi)存中的領(lǐng)域?qū)ο竽P蛶熘苯硬檎翌I(lǐng)域?qū)ο螅约皬念A(yù)先生成的Mock庫中查找Mock類,這里的Mock類是被測方法所引用的類的模擬行為。步驟306 :按照所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法。步驟307 :按照所述測試方法對所述選擇的原始類進行単元測試。本實施例中與實施例I相同的步驟就不再贅述,參考實施例I中的詳細記載即可。在本實施例中,因為預(yù)先將領(lǐng)域?qū)ο竽P蛶旒虞d到內(nèi)存中,這樣在查找領(lǐng)域?qū)ο蟮臅r候,就可以直接從內(nèi)存中進行查找,從而能夠提高單元測試的效率,并且節(jié)省大量的人力物カ資源。對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本申請并不受所描述的動作順序的限制,因為依據(jù)本申請,某些步驟可以采用其他順序或者同時進行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作和模塊并不一定是本申請所必須的。與上述本申請ー種單元測試的方法實施例I所提供的方法相對應(yīng),參見圖7,本申請還提供了一種單元測試的裝置實施例1,在本實施例中,該裝置可以包括接收模塊701,用于接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型。查找模塊702,用于依據(jù)所述被測方法從所述預(yù)先構(gòu)建的領(lǐng)域?qū)ο竽P蛶觳檎翌I(lǐng)域?qū)ο?,?或從預(yù)先生成的Mock庫中查找Mock類。生成模塊703,用于使用所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法。其中,在實際應(yīng)用中,參考圖8所示,所述生成模塊703具體可以包括第四獲取子模塊801,用于獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調(diào)用的方法的參數(shù)和返回值類型;第二生成子模塊802,用于根據(jù)所述原始類的引用類的類型生成測試方法的方法頭;第三生成子模塊803,用于根據(jù)所述引用類的類型及其所調(diào)用的方法的返回值類型生成引用類列表;遍歷子模塊804,用于遍歷所述引用類列表,以生成模擬引用類對象行為的代碼;第四生成子模塊805,用于從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取所述引用類的方法參數(shù)值,以生成測試方法的方法體; 組成子模塊806,用于將固定的方法尾、所述方法頭以及方法體組成所述測試方法。測試模塊704,用于按照所述測試方法對所述選擇的原始類進行単元測試。采用本申請實施例,可以直接從預(yù)先生成的領(lǐng)域?qū)ο竽P蛶煲约癕ock庫中獲取相關(guān)的領(lǐng)域?qū)ο笠约癕ock類,從而可以在進行單元測試的時候,能夠提高單元測試的效率,并且,因為不再需要人工編寫代碼,因此,単元測試的程序代碼的可維護性也較好。與上述本申請ー種單元測試的方法實施例2所提供的方法相對應(yīng),參見圖9,本申請還提供了一種單元測試的裝置實施例2,在本實施例中,該裝置可以包括生成Mock庫模塊901,用于生成Mock庫。參考圖10所示,在實際應(yīng)用中,所述生成Mock庫模塊901具體可以包括第一獲取子模塊1001,用于獲取待測試源代碼中各個需要被Mock的原始類。第一反射子模塊1002,用于通過反射獲得所述各個原始類的類中被測方法的參數(shù),所述類參數(shù)包括被測方法名稱、參數(shù)類型和返回值類型。第一生成子模塊1003,用于依據(jù)所述類參數(shù)生成所述原始類對應(yīng)的各個Mock類。組合子模塊1004,用于將所述各個Mock類組成的集合作為Mock庫。構(gòu)建模塊902,用于構(gòu)建領(lǐng)域?qū)ο竽P蛶?。參考圖11所示,在實際應(yīng)用中,所述構(gòu)建模塊902具體可以包括第二獲取子模塊1101,用于獲取待測試源代碼中被引用的領(lǐng)域?qū)ο?;排序子模塊1102,用于按照所述被引用的領(lǐng)域?qū)ο笾g的引用關(guān)系對其進行排序;第二反射子模塊1103,用于通過反射獲取所述被引用的領(lǐng)域?qū)ο蟮膶傩孕畔ⅲ鰧傩孕畔愋图捌涿Q,所述類型包括基本類型和復雜類型。存儲子模塊1104,用于將所述屬性信息和被引用的領(lǐng)域?qū)ο蟮耐暾窂桨凑找藐P(guān)系順序存儲至所述領(lǐng)域?qū)ο竽P蛶熘?,所述領(lǐng)域?qū)ο竽P蛶熘械囊恍袛?shù)據(jù)為ー個領(lǐng)域?qū)ο蟮男畔ⅰ=邮漳K701,用于接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型。加載模塊903,用于加載所述領(lǐng)域?qū)ο竽P蛶?。參考圖12所示,在實際應(yīng)用中,所述加載模塊903具體可以包括第三獲取子模塊1201,用于從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取單條數(shù)據(jù),所述單條數(shù)據(jù)包括領(lǐng)域?qū)ο蟮耐暾窂?、類型及其初始值;?chuàng)建子模塊1202,用于依據(jù)所述領(lǐng)域?qū)ο蟮耐暾窂酵ㄟ^反射調(diào)用無參構(gòu)造方法,以創(chuàng)建所述領(lǐng)域?qū)ο蟮膶嵗?br>
賦值子模塊1203,用于依據(jù)所述類型及其初始值調(diào)用屬性的賦值方法對所述類型進行賦值;保存子模塊1204,用于將所述領(lǐng)域?qū)ο蟮耐暾窂胶退鲑x值后的領(lǐng)域?qū)ο蟮膶嵗鳛橛成潢P(guān)系對保存至內(nèi)存中。查找模塊702,用于依據(jù)所述被測方法從所述預(yù)先構(gòu)建的領(lǐng)域?qū)ο竽P蛶觳檎翌I(lǐng)域?qū)ο?,?或從預(yù)先生成的Mock庫中查找Mock類。生成模塊703,用于按照所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法。測試模塊704,用于按照所述測試方法對所述原始類進行単元測試。在本實施例中,因為預(yù)先將領(lǐng)域?qū)ο竽P蛶旒虞d到內(nèi)存中,這樣在查找領(lǐng)域?qū)ο?的時候,就可以直接從內(nèi)存中進行查找,從而能夠提高單元測試的效率,并且節(jié)省大量的人力物カ資源。本實施例所述的裝置可以集成到第三方交易平臺的服務(wù)器上,也可以單獨作為ー個實體與第三方交易平臺的服務(wù)器相連,另外,需要說明的是,當本申請所述的方法采用軟件實現(xiàn)時,可以作為第三方交易平臺的服務(wù)器新增的ー個功能,也可以單獨編寫相應(yīng)的程序,本申請不限定所述方法或裝置的實現(xiàn)方式。需要說明的是,本說明書中的各個實施例均采用遞進的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似的部分互相參見即可。對于裝置類實施例而言,由于其與方法實施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。最后,還需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個實體或者操作與另ー個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。以上對本申請所提供的一種單元測試的方法和裝置進行了詳細介紹,本文中應(yīng)用了具體個例對本申請的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本申請的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請的思想,在具體實施方式
及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本申請的限制。
權(quán)利要求
1.一種單元測試的方法,其特征在于,該方法包括 接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型; 依據(jù)所述被測方法從所述預(yù)先構(gòu)建的領(lǐng)域?qū)ο竽P蛶觳檎翌I(lǐng)域?qū)ο?,?或從預(yù)先生成的Mock庫中查找Mock類; 使用所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法; 按照所述測試方法對所述原始類進行単元測試。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,還包括針對所述被測方法的源代碼進行靜態(tài)分析,以生成Mock庫的步驟,具體為 獲取待測試源代碼中各個需要被Mock的原始類; 通過反射獲得所述各個原始類的類中被測方法的參數(shù),所述類參數(shù)包括被測方法名稱、參數(shù)類型和返回值類型; 依據(jù)所述類參數(shù)生成所述原始類對應(yīng)的各個Mock類; 將所述各個Mock類組成的集合作為Mock庫。
3.根據(jù)權(quán)利要求I所述的方法,其特征在于,還包括構(gòu)建領(lǐng)域?qū)ο竽P蛶斓牟襟E,具體為 獲取待測試源代碼中被引用的領(lǐng)域?qū)ο螅? 按照所述被引用的領(lǐng)域?qū)ο笾g的引用關(guān)系對其進行排序; 通過反射獲取所述被引用的領(lǐng)域?qū)ο蟮膶傩孕畔?,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型; 將所述屬性信息和被引用的領(lǐng)域?qū)ο蟮耐暾窂桨凑找藐P(guān)系順序存儲至所述領(lǐng)域?qū)ο竽P蛶熘校鲱I(lǐng)域?qū)ο竽P蛶熘械囊恍袛?shù)據(jù)為ー個領(lǐng)域?qū)ο蟮男畔ⅰ?br>
4.根據(jù)權(quán)利要求3所述的方法,其特征在干,還包括加載所述領(lǐng)域?qū)ο竽P蛶斓牟襟E,具體為 從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取單條數(shù)據(jù),所述單條數(shù)據(jù)包括領(lǐng)域?qū)ο蟮耐暾窂郊捌涑跏贾担? 依據(jù)所述領(lǐng)域?qū)ο蟮耐暾窂酵ㄟ^反射調(diào)用無參構(gòu)造方法,以創(chuàng)建所述領(lǐng)域?qū)ο蟮膶嵗? 依據(jù)所述類型及其初始值調(diào)用屬性的賦值方法對所述類型進行賦值; 將所述領(lǐng)域?qū)ο蟮耐暾窂胶退鲑x值后的領(lǐng)域?qū)ο蟮膶嵗鳛橛成潢P(guān)系對保存至內(nèi)存中。
5.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述按照所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法,包括 獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調(diào)用的方法的參數(shù)和返回值類型; 根據(jù)所述引用類的類型生成測試方法的方法頭; 根據(jù)所述引用類的類型及其所調(diào)用的方法的返回值類型生成引用類列表; 遍歷所述引用類列表,以生成模擬引用類對象行為的代碼; 從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取所述引用類的方法參數(shù)值,以生成測試方法的方法體;將固定的方法尾、所述方法頭以及方法體組成所述測試方法。
6.一種單元測試的裝置,其特征在于,該裝置包括 接收模塊,用于接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型; 查找模塊,用于依據(jù)所述被測方法從所述預(yù)先構(gòu)建的領(lǐng)域?qū)ο竽P蛶觳檎翌I(lǐng)域?qū)ο?,?或從預(yù)先生成的Mock庫中查找Mock類; 生成模塊,用于使用所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法; 測試模塊,用于按照所述測試方法對所述原始類進行単元測試。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,還包括生成Mock庫模塊,具體包括 第一獲取子模塊,用于獲取待測試源代碼中各個需要被Mock的原始類; 第一反射子模塊,用于通過反射獲得所述各個原始類的類中被測方法的參數(shù),所述類參數(shù)包括被測方法名稱、參數(shù)類型和返回值類型; 第一生成子模塊,用于依據(jù)所述類參數(shù)生成所述原始類對應(yīng)的各個Mock類; 組合子模塊,用于將所述各個Mock類組成的集合作為Mock庫。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,還包括構(gòu)建模塊,所述構(gòu)建模塊具體包括 第二獲取子模塊,用于獲取待測試源代碼中被引用的領(lǐng)域?qū)ο螅? 排序子模塊,用于按照所述被引用的領(lǐng)域?qū)ο笾g的引用關(guān)系對其進行排序; 第二反射子模塊,用于通過反射獲取所述被引用的領(lǐng)域?qū)ο蟮膶傩孕畔?,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型; 存儲子模塊,用于將所述屬性信息和被引用的領(lǐng)域?qū)ο蟮耐暾窂桨凑找藐P(guān)系順序存儲至所述領(lǐng)域?qū)ο竽P蛶熘?,所述領(lǐng)域?qū)ο竽P蛶熘械囊恍袛?shù)據(jù)為ー個領(lǐng)域?qū)ο蟮男畔ⅰ?br>
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,還包括加載模塊,所述加載模塊具體包括 第三獲取子模塊,用于從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取單條數(shù)據(jù),所述單條數(shù)據(jù)包括領(lǐng)域?qū)ο蟮耐暾窂郊捌涑跏贾担? 創(chuàng)建子模塊,用于依據(jù)所述領(lǐng)域?qū)ο蟮耐暾窂酵ㄟ^反射調(diào)用無參構(gòu)造方法,以創(chuàng)建所述領(lǐng)域?qū)ο蟮膶嵗?賦值子模塊,用于依據(jù)所述類型及其初始值調(diào)用屬性的賦值方法對所述類型進行賦值; 保存子模塊,用于將所述領(lǐng)域?qū)ο蟮耐暾窂胶退鲑x值后的領(lǐng)域?qū)ο蟮膶嵗鳛橛成潢P(guān)系對保存至內(nèi)存中。
10.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述生成模塊包括 第四獲取子模塊,用于獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調(diào)用的方法的參數(shù)和返回值類型; 第二生成子模塊,用于根據(jù)所述引用類的類型生成測試方法的方法頭; 第三生成子模塊,用于根據(jù)所述引用類的類型及其所調(diào)用的方法的返回值類型生成引用類列表;遍歷子模塊,用于遍歷所述引用類列表,以生成模擬引用類對象行為的代碼; 第四生成子模塊,用于從所述領(lǐng)域?qū)ο竽P蛶熘蝎@取所述引用類的方法參數(shù)值,以生成測試方法的方法體; 組成子模塊,用于將固定的方法尾、所述方法頭以及方法體組成所述測試方法。
全文摘要
本發(fā)明提供了一種單元測試的方法及裝置,所述方法包括接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型;依據(jù)所述被測方法從所述預(yù)先構(gòu)建的領(lǐng)域?qū)ο竽P蛶觳檎翌I(lǐng)域?qū)ο?,?或從預(yù)先生成的Mock庫中查找Mock類;使用所述領(lǐng)域?qū)ο蠛?或Mock類生成所述被測方法的測試方法;按照所述測試方法對所述原始類進行單元測試。本發(fā)明實施例可以解決現(xiàn)有技術(shù)中單元測試的效率低下以及可維護性較差的問題。
文檔編號G06F11/36GK102855177SQ20111018107
公開日2013年1月2日 申請日期2011年6月30日 優(yōu)先權(quán)日2011年6月30日
發(fā)明者馮照臨, 劉中勝 申請人:阿里巴巴集團控股有限公司