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