專利名稱:一種單元測試的方法和裝置的制作方法
技術領域:
本申請涉及軟件測試領域,特別涉及一種單元測試的方法和裝置。
背景技術:
単元測試是在軟件開發過程中要進行的最低級別的測試活動,在単元測試過程中,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試。因此,単元測試不僅僅是作為無錯編碼的ー種輔助手段應用于一次性的開發過程,単元測試也必須是可重復的,無論是在軟件修改過程中,還是移植到新的運行環境之后。而在單元測試過程中,對于某些不容易構造或者不容易獲取的對象,可以采用創建ー個虛擬的對象來進行測試的方式,這個虛擬的對象就稱為Mock對象。Mock對象就是實際中的對象在單元測試期間的代替品OMock對象是Mock類的實例化,在現有技術中,單元測試中Mock類的代碼編寫,主 要依賴于人工,所有的Mock類的代碼編寫完畢,就組成了 Mock庫。但是這種人工編寫代碼的效率很低,進行單元測試時的效率也非常低下;尤其是在對代碼質量要求較高的情況下,就會因為低效的単元測試程序編寫而浪費了大量的人力物カ資源。不僅如此,還會使得単元測試的程序代碼的可維護性較差。總之,目前需要本領域技術人員迫切解決的ー個技術問題就是如何能夠創新的提出ー種自動進行単元測試的方法,以解決現有技術中單元測試的效率低下以及可維護性較差的問題。
發明內容
本申請所要解決的技術問題是提供一種單元測試的方法,用以解決現有技術中編寫単元測試程序的效率低下以及可維護性較差的問題。本申請還提供了一種單元測試的裝置,用以保證上述方法在實際中的實現及應用。為了解決上述問題,本申請公開了一種單元測試的方法,包括接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型;依據所述被測方法從所述預先構建的領域對象模型庫查找領域對象,和/或從預先生成的Mock庫中查找Mock類;使用所述領域對象和/或Mock類生成所述被測方法的測試方法;按照所述測試方法對所述原始類進行単元測試。優選的,還包括針對所述被測方法的源代碼進行靜態分析,以生成Mock庫的步驟,具體為獲取待測試源代碼中各個需要被Mock的原始類;通過反射獲得所述各個原始類的類中被測方法的參數,所述類參數包括被測方法名稱、參數類型和返回值類型;依據所述類參數生成所述原始類對應的各個Mock類;將所述各個Mock類組成的集合作為Mock庫。優選的,還包括構 建領域對象模型庫的步驟,具體為獲取待測試源代碼中被引用的領域對象;按照所述被引用的領域對象之間的引用關系對其進行排序;通過反射獲取所述被引用的領域對象的屬性信息,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型;將所述屬性信息和被引用的領域對象的完整路徑按照引用關系順序存儲至所述領域對象模型庫中,所述領域對象模型庫中的一行數據為ー個領域對象的信息。優選的,還包括加載所述領域對象模型庫的步驟,具體為從所述領域對象模型庫中獲取單條數據,所述單條數據包括領域對象的完整路徑及其初始值;依據所述領域對象的完整路徑通過反射調用無參構造方法,以創建所述領域對象的實例;依據所述類型及其初始值調用屬性的賦值方法對所述類型進行賦值;將所述領域對象的完整路徑和所述賦值后的領域對象的實例作為映射關系對保存至內存中。優選的,所述按照所述領域對象和/或Mock類生成所述被測方法的測試方法,包括獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調用的方法的參數和返回值類型;根據所述引用類的類型生成測試方法的方法頭;根據所述引用類的類型及其所調用的方法的返回值類型生成引用類列表;遍歷所述引用類列表,以生成模擬引用類對象行為的代碼;從所述領域對象模型庫中獲取所述引用類的方法參數值,以生成測試方法的方法體;將固定的方法尾、所述方法頭以及方法體組成所述測試方法。本申請公開了一種單元測試的裝置,包括接收模塊,用于接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型;查找模塊,用于依據所述被測方法從所述預先構建的領域對象模型庫查找領域對象,和/或從預先生成的Mock庫中查找Mock類;生成模塊,用于使用所述領域對象和/或Mock類生成所述被測方法的測試方法;測試模塊,用于按照所述測試方法對所述原始類進行単元測試。優選的,還包括生成Mock庫模塊,具體包括第一獲取子模塊,用于獲取待測試源代碼中各個需要被Mock的原始類;第一反射子模塊,用于通過反射獲得所述各個原始類的類中被測方法的參數,所述類參數包括被測方法名稱、參數類型和返回值類型;
第一生成子模塊,用于依據所述類參數生成所述原始類對應的各個Mock類;組合子模塊,用于將所述各個Mock類組成的集合作為Mock庫。優選的,還包括構建模塊,所述構建模塊具體包括第二獲取子模塊,用于獲取待測試源代碼中被引用的領域對象;排序子模塊,用于按照所述被引用的領域對象之間的引用關系對其進行排序;第二反射子模塊,用于通過反射獲取所述被引用的領域對象的屬性信息,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型。存儲子模塊,用于將所述屬性信息和被引用的領域對象的完整路徑按照引用關系 順序存儲至所述領域對象模型庫中,所述領域對象模型庫中的一行數據為ー個領域對象的信息。優選的,還包括加載模塊,所述加載模塊具體包括第三獲取子模塊,用于從所述領域對象模型庫中獲取單條數據,所述單條數據包括領域對象的完整路徑及其初始值;創建子模塊,用于依據所述領域對象的完整路徑通過反射調用無參構造方法,以創建所述領域對象的實例;賦值子模塊,用于依據所述類型及其初始值調用屬性的賦值方法對所述類型進行賦值;保存子模塊,用于將所述領域對象的完整路徑和所述賦值后的領域對象的實例作為映射關系對保存至內存中。優選的,所述生成模塊包括第四獲取子模塊,用于獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調用的方法的參數和返回值類型;第二生成子模塊,用于根據所述引用類的類型生成測試方法的方法頭;第三生成子模塊,用于根據所述引用類的類型及其所調用的方法的返回值類型生成引用類列表;遍歷子模塊,用于遍歷所述引用類列表,以生成模擬引用類對象行為的代碼;第四生成子模塊,用于從所述領域對象模型庫中獲取所述引用類的方法參數值,以生成測試方法的方法體;組成子模塊,用于將固定的方法尾、所述方法頭以及方法體組成所述測試方法。與現有技術相比,本申請包括以下優點在本申請中,単元測試的代碼通過本實施例的方案自動生成,生成的代碼再運行時,通過直接從預先生成的領域對象模型庫獲取相關的領域對象,以及調用預先生成的Mock庫中獲取對應的Mock類完成単元測試,能夠不再需要人工編寫代碼,提高単元測試的效率。因此,単元測試的程序代碼的可維護性也較好。同時,在加載領域對象模型庫的時候,將領域對象模型庫放到內存中,可以從內存中直接獲取,省去了人工編寫的工作量。當然,實施本申請的任ー產品并不一定需要同時達到以上所述的所有優點。
為了更清楚地說明本申請實施例中的技術方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請的ー些實施例,對于本領域普通技術人員來講,在不付出創造性勞動性的前提下,還可以根據這些附圖獲得其他的附圖。圖I是本申請的ー種單元測試的方法實施例I的流程圖;圖2是在方法實施例I中步驟103的流程圖;圖3是本申請的ー種單元測試的方法實施例2的流程圖;圖4是方法實施例2中步驟301的流程圖;
圖5是方法實施例2中步驟302的流程圖;圖6是方法實施例2中步驟304的流程圖;圖7是本申請的ー種單元測試的裝置實施例I的結構框圖;圖8是裝置實施例I中生成模塊703的結構框圖;圖9是本申請的ー種單元測試的裝置實施例2的結構框圖;圖10是裝置實施例2中生成Mock庫模塊901的結構框圖;圖11是裝置實施例2中構建模塊902的結構框圖;圖12是裝置實施例2中加載模塊903的結構框圖。
具體實施例方式下面將結合本申請實施例中的附圖,對本申請實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本申請一部分實施例,而不是全部的實施例。基于本申請中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬于本申請保護的范圍。本申請可用于眾多通用或專用的計算裝置環境或配置中。例如個人計算機、服務器計算機、手持設備或便攜式設備、平板型設備、多處理器裝置、包括以上任何裝置或設備的分布式計算環境等等。本申請可以在由計算機執行的計算機可執行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執行特定任務或實現特定抽象數據類型的例程、程序、對象、組件、數據結構等等。也可以在分布式計算環境中實踐本申請,在這些分布式計算環境中,由通過通信網絡而被連接的遠程處理設備來執行任務。在分布式計算環境中,程序模塊可以位于包括存儲設備在內的本地和遠程計算機存儲介質中。本申請的主要思想之一可以包括,通過直接從預先生成的領域對象模型庫獲取相關的領域對象,以及從預先生成的Mock庫中獲取對應的Mock類,從而可以在進行単元測試的時候,能夠不再需要人工編寫代碼,提高單元測試的效率,并且,因為不再需要人工編寫代碼,因此,単元測試的程序代碼的可維護性也較好。另外,単元測試的代碼通過本申請實施例的方案自動生成,生成的代碼再運行時,通過直接從預先生成的領域對象模型庫獲取相關的領域對象,以及調用預先生成的Mock庫中獲取對應的Mock類完成単元測試,能夠不再需要人工編寫代碼,提高單元測試的效率。參考圖1,示出了本申請ー種単元測試的方法實施例I的流程圖,可以包括以下步驟步驟101 :接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型。在本實施例中,所述期望字段即是待測試的類中的被測方法的返回值類型或其屬性的類型,単元測試的目的即是測試所述期望字段的值是否與測試值相同。可以由用戶在輸入界面來輸入期望字段和測試值,例如,用戶可以依次選擇測試領域中的ー個包,并選擇該包中的某ー個原始類,這個原始類包括了很多方法,因此可以針對需要測試的各個方法都輸入相應的期望字段和期望值。步驟102 :依據所述被測方法從所述預先構建的領域對象模型庫查找領域對象,和/或從預先生成的Mock庫中查找Mock類。其中,所述Mock庫為預先生成的Mock類的集合,各個Mock類都包括若干個Mock方法,這些Mock方法在運行時都可以模擬原始方法的行為。所述領域對象模型庫中的領域對象模型是被測系統中引用到的領域對象,包括具體的和抽象的業務模型。例如數據對象、值對象、實體、枚挙、基本類型及其封裝類,等等。
需要說明的是,在得到被測方法之后,在本步驟中就可以通過反射和靜態代碼分析得到被測方法所引用到的領域對象和引用類,再根據被測方法引用的領域對象去領域對象模型庫中查找對應的源代碼,井根據被測方法的引用類去調用Mock庫中的Mock類。步驟103 :使用所述領域對象和/或Mock類生成所述被測方法的測試方法。根據查找到的領域對象和/或Mock類生成所述被測方法的測試方法。需要說明的是,在實際應用中,因為各個被測方法所引用的領域對象或者引用類不同,因此,可以需要根據查找到的領域對象獲取屬于當前被測方法所引用的領域對象以及模擬當前被測方法的引用類的行為的Mock類,這樣就能根據查找到的領域對象以及Mock類組合生成被測方法。在實際應用中,參考圖2所示,所述步驟103具體可以包括步驟201 :獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調用的方法的參數和返回值類型。本步驟可以獲取到被測方法所引用的原始類的引用類的類型,以及該引用類所調用的方法的返回值類型。例如,被測方法為A,該方法引用了原始類D,而D又引用了引用類E,在E類下調用了方法B,那么本步驟即是獲取E類的類型,以及方法B的返回值類型。這里的返回值類型可以理解為整型(int)或者字符串型(string)或自定義的復雜類型等。所述原始類即是需要被Mock的類,為了與Mock類進行區分,在本申請實施例中將需要被Mock的類稱為原始類。步驟202 :根據所述原始類的引用類的類型生成測試方法的方法頭。在測試方法中的方法頭中聲明所述弓丨用類的類型。步驟203 :根據所述引用類的類型及其所調用的方法的返回值類型生成引用類列表。根據引用類的類型及其調用的方法的返回值類型,生成ー個引用類列表,其中,參考表I所示,第一列表示引用類的名稱,第二列表示其所調用方法的返回值類型。表I引用類r該引用類所調用的方法的返回值類型
CcrCreditCardInfoDAOccrCreditCardlnfoDO
CcrCreditCardBankInfoDAOList<CcrCreditCardBankInfoDO>步驟204 :遍歷所述引用類列表,以生成模擬引用類對象行為的代碼。針對該引用類列表中的每ー個引用類,都對應生成一段模擬行為的代碼。首先,判斷本次是否需要該引用類對象調用的方法拋出異常,如果需要則可以設置參數“true”來表示測試方法需要拋出異常,如果不需要則可以設置參數“false”;然后判斷引用類是否有返回值,如果有,則從領域對象模型庫中取出Mock類的返回值;最后調用Mock庫中的相應Mock方法,返回被Mock的引用類實例并將其注入被測類的對象。步驟205 :從所述領域對象模型庫中獲取所述引用類的方法參數值,以生成測試 方法的方法體。再從領域對象模型庫中獲取所述引用類的方法參數值,井根據步驟204中的模擬結果,可以生成測試方法的方法體部分。步驟206 :將固定的方法尾、所述方法頭以及方法體組成測試方法。本步驟即是將固定格式的方法尾,以及前述的方法頭和方法體,組成測試方法。步驟104 :按照所述測試方法對所述選擇的原始類進行単元測試。生成測試方法之后,就可以根據測試方法對所選擇的原始類進行単元測試。采用本申請實施例,単元測試程序運行時可以直接從預先生成的領域對象模型庫以及Mock庫中獲取相關的領域對象以及Mock類,從而可以在進行單元測試的時候,能夠提高單元測試的效率,并且,因為不再需要人工編寫代碼,因此,単元測試的程序代碼的可維護性也較好。參考圖3,示出了本申請ー種単元測試的方法實施例2的流程圖,可以包括以下步驟步驟301 :針對所述被測方法的源代碼進行靜態分析,以生成Mock庫。本步驟即是對被測方法的源代碼進行靜態分析,最終生成Mock庫的步驟。靜態分析具體可以包括分析該被測方法是否需要拋出異常;分析該被測方法引用到的引用類的類型;分析該被測方法的參數名(并非類型);以及,分析該被測方法引用到的引用類對象調用的方法。再對上述信息利用反射做進ー步分析,可以得到該被測方法引用到的引用類所調用的方法的返回值類型等。這里的反射指的是可以在不對ー個類進行分析的前提下,可以直接獲得類名稱、類的方法返回值、方法名、成員變量名或者成員變量類型等參數在實際應用中,參考圖4所示,所述步驟301具體可以包括步驟401 :獲取待測試源代碼中各個需要被Mock的原始類。步驟402 :通過反射獲得所述各個原始類的類中被測方法的參數,所述類參數包括被測方法名稱、參數類型和返回值類型。步驟403 :依據所述類參數生成所述原始類對應的各個Mock類。
步驟404 :將所述各個Mock類組成的集合作為Mock庫。關于生成Mock庫的詳細內容可以參考另ー篇專利“ー種単元測試中生成Mock庫的方法和裝置”。步驟302 :構建領域對象模型庫。在本步驟還需要構建領域對象模型庫,該領域對象模型庫用于保存被測方法中所引用到的領域對象,該領域對象以屬性信息為主。領域對象模型庫可以采用文件的方式進行存儲,每一行數據為ー個領域對象模型信息。在其中需要存儲兩部分內容該領域對象的全路徑和領域對象各屬性的名稱和初始值。在實際應用中,參考圖5所示,所述步驟302具體可以包括步驟501 :獲取待測試源代碼中被引用的領域對象。
首先獲取到待測試源代碼中都引用了哪些領域對象。步驟502 :按照所述被引用的領域對象之間的引用關系對其進行排序。然后再找出這些領域對象之間是什么樣的引用關系,也稱為依賴關系,并按照引用關系對領域對象進行排序,將被引用的對象排在前面,將引用的對象排在后面。例如,領域對象A引用B,B又引用C,因此如果初始化A,必須先初始化B,而如果需要初始化B,必須先初始化C,因此可以通過對象之間的引用關系將其順序排好C、B和A。這樣在后續進行初始化的時候就可以先初始化C。假設C的屬性都是簡單類型,通過默認初值進行賦值即可,再放到領域對象模型庫里。接著在需要初始化B時要用到C,就從領域對象模型庫里將C取出來,賦值后再把B放到領域對象模型庫里,最后初始化A時再把B從領域對象模型庫里取出來。步驟503 :通過反射獲取所述被引用的領域對象的屬性信息,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型。通過反射獲取所述被引用的領域對象的屬性信息,即是領域對象的類型及其名稱,類型可以分為基本類型和復雜類型。步驟504 :將所述屬性信息和被引用的領域對象的完整路徑按照引用關系順序存儲至所述領域對象模型庫中,所述領域對象模型庫中的一行數據為ー個領域對象的信息。將引用到的領域對象的全名和屬性信息按照引用順序存儲在領域對象模型庫中,在存儲的時候將一個領域對象的信息存儲為一行數據,這樣就生成了領域對象模型庫。步驟303 :接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型。接著在人機交互界面可以接收用戶的期望字段和測試值,并在用戶觸發了單元測試程序之后,開始進行単元測試。步驟304 :加載所述領域對象模型庫的步驟。在進行單元測試的時候,因為領域對象模型庫是以文件的形式存在硬盤上,因此生成的単元測試程序要想運行,必須先加載到內存中。在實際應用中,參考圖6所示,所述步驟304具體可以包括步驟601 :從所述領域對象模型庫中獲取單條數據,所述單條數據包括領域對象的完整路徑、類型及其初始值。從領域對象模型庫中依次取出單條數據,就是讀出其中的一行數據,里邊包含領域模型的完整路徑,及其類型和類型的初始值。步驟602 :依據所述領域對象的完整路徑通過反射調用無參構造方法,以創建所述領域對象的實例。有了領域對象的全名,就可以通過反射的方式調用其無參構造方法,然后再通過反射調用,獲取各個屬性的賦值方法進行賦值。步驟603 :依據所述類型及其名稱調用屬性的賦值方法對所述類型進行賦值。利用步驟602中獲取的初始值對類型進行初始化。另外,不管是初始化簡單類型還是復雜類型,都要調用屬性的賦值方法進行賦值。步驟604 :將所述領域對象的完整路徑和所述賦值后的領域對象的實例作為映射關系對保存至內存中。 由于映射關系(Map)可以以key-value對的形式存放對象,方便查找,因此,key存領域對象的完整路徑,value就是初始化好的對象,即是賦值后的領域對象的實例。步驟305 :依據所述被測方法從所述預先構建的領域對象模型庫查找領域對象,和/或從預先生成的Mock庫中查找Mock類。加載了所述領域對象模型庫之后,再從內存中的領域對象模型庫直接查找領域對象,以及從預先生成的Mock庫中查找Mock類,這里的Mock類是被測方法所引用的類的模擬行為。步驟306 :按照所述領域對象和/或Mock類生成所述被測方法的測試方法。步驟307 :按照所述測試方法對所述選擇的原始類進行単元測試。本實施例中與實施例I相同的步驟就不再贅述,參考實施例I中的詳細記載即可。在本實施例中,因為預先將領域對象模型庫加載到內存中,這樣在查找領域對象的時候,就可以直接從內存中進行查找,從而能夠提高單元測試的效率,并且節省大量的人力物カ資源。對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領域技術人員應該知悉,本申請并不受所描述的動作順序的限制,因為依據本申請,某些步驟可以采用其他順序或者同時進行。其次,本領域技術人員也應該知悉,說明書中所描述的實施例均屬于優選實施例,所涉及的動作和模塊并不一定是本申請所必須的。與上述本申請ー種單元測試的方法實施例I所提供的方法相對應,參見圖7,本申請還提供了一種單元測試的裝置實施例1,在本實施例中,該裝置可以包括接收模塊701,用于接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型。查找模塊702,用于依據所述被測方法從所述預先構建的領域對象模型庫查找領域對象,和/或從預先生成的Mock庫中查找Mock類。生成模塊703,用于使用所述領域對象和/或Mock類生成所述被測方法的測試方法。其中,在實際應用中,參考圖8所示,所述生成模塊703具體可以包括第四獲取子模塊801,用于獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調用的方法的參數和返回值類型;第二生成子模塊802,用于根據所述原始類的引用類的類型生成測試方法的方法頭;第三生成子模塊803,用于根據所述引用類的類型及其所調用的方法的返回值類型生成引用類列表;遍歷子模塊804,用于遍歷所述引用類列表,以生成模擬引用類對象行為的代碼;第四生成子模塊805,用于從所述領域對象模型庫中獲取所述引用類的方法參數值,以生成測試方法的方法體; 組成子模塊806,用于將固定的方法尾、所述方法頭以及方法體組成所述測試方法。測試模塊704,用于按照所述測試方法對所述選擇的原始類進行単元測試。采用本申請實施例,可以直接從預先生成的領域對象模型庫以及Mock庫中獲取相關的領域對象以及Mock類,從而可以在進行單元測試的時候,能夠提高單元測試的效率,并且,因為不再需要人工編寫代碼,因此,単元測試的程序代碼的可維護性也較好。與上述本申請ー種單元測試的方法實施例2所提供的方法相對應,參見圖9,本申請還提供了一種單元測試的裝置實施例2,在本實施例中,該裝置可以包括生成Mock庫模塊901,用于生成Mock庫。參考圖10所示,在實際應用中,所述生成Mock庫模塊901具體可以包括第一獲取子模塊1001,用于獲取待測試源代碼中各個需要被Mock的原始類。第一反射子模塊1002,用于通過反射獲得所述各個原始類的類中被測方法的參數,所述類參數包括被測方法名稱、參數類型和返回值類型。第一生成子模塊1003,用于依據所述類參數生成所述原始類對應的各個Mock類。組合子模塊1004,用于將所述各個Mock類組成的集合作為Mock庫。構建模塊902,用于構建領域對象模型庫。參考圖11所示,在實際應用中,所述構建模塊902具體可以包括第二獲取子模塊1101,用于獲取待測試源代碼中被引用的領域對象;排序子模塊1102,用于按照所述被引用的領域對象之間的引用關系對其進行排序;第二反射子模塊1103,用于通過反射獲取所述被引用的領域對象的屬性信息,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型。存儲子模塊1104,用于將所述屬性信息和被引用的領域對象的完整路徑按照引用關系順序存儲至所述領域對象模型庫中,所述領域對象模型庫中的一行數據為ー個領域對象的信息。接收模塊701,用于接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型。加載模塊903,用于加載所述領域對象模型庫。參考圖12所示,在實際應用中,所述加載模塊903具體可以包括第三獲取子模塊1201,用于從所述領域對象模型庫中獲取單條數據,所述單條數據包括領域對象的完整路徑、類型及其初始值;創建子模塊1202,用于依據所述領域對象的完整路徑通過反射調用無參構造方法,以創建所述領域對象的實例;
賦值子模塊1203,用于依據所述類型及其初始值調用屬性的賦值方法對所述類型進行賦值;保存子模塊1204,用于將所述領域對象的完整路徑和所述賦值后的領域對象的實例作為映射關系對保存至內存中。查找模塊702,用于依據所述被測方法從所述預先構建的領域對象模型庫查找領域對象,和/或從預先生成的Mock庫中查找Mock類。生成模塊703,用于按照所述領域對象和/或Mock類生成所述被測方法的測試方法。測試模塊704,用于按照所述測試方法對所述原始類進行単元測試。在本實施例中,因為預先將領域對象模型庫加載到內存中,這樣在查找領域對象 的時候,就可以直接從內存中進行查找,從而能夠提高單元測試的效率,并且節省大量的人力物カ資源。本實施例所述的裝置可以集成到第三方交易平臺的服務器上,也可以單獨作為ー個實體與第三方交易平臺的服務器相連,另外,需要說明的是,當本申請所述的方法采用軟件實現時,可以作為第三方交易平臺的服務器新增的ー個功能,也可以單獨編寫相應的程序,本申請不限定所述方法或裝置的實現方式。需要說明的是,本說明書中的各個實施例均采用遞進的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似的部分互相參見即可。對于裝置類實施例而言,由于其與方法實施例基本相似,所以描述的比較簡單,相關之處參見方法實施例的部分說明即可。最后,還需要說明的是,在本文中,諸如第一和第二等之類的關系術語僅僅用來將一個實體或者操作與另ー個實體或操作區分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關系或者順序。而且,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設備中還存在另外的相同要素。以上對本申請所提供的一種單元測試的方法和裝置進行了詳細介紹,本文中應用了具體個例對本申請的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本申請的方法及其核心思想;同時,對于本領域的一般技術人員,依據本申請的思想,在具體實施方式
及應用范圍上均會有改變之處,綜上所述,本說明書內容不應理解為對本申請的限制。
權利要求
1.一種單元測試的方法,其特征在于,該方法包括 接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型; 依據所述被測方法從所述預先構建的領域對象模型庫查找領域對象,和/或從預先生成的Mock庫中查找Mock類; 使用所述領域對象和/或Mock類生成所述被測方法的測試方法; 按照所述測試方法對所述原始類進行単元測試。
2.根據權利要求I所述的方法,其特征在于,還包括針對所述被測方法的源代碼進行靜態分析,以生成Mock庫的步驟,具體為 獲取待測試源代碼中各個需要被Mock的原始類; 通過反射獲得所述各個原始類的類中被測方法的參數,所述類參數包括被測方法名稱、參數類型和返回值類型; 依據所述類參數生成所述原始類對應的各個Mock類; 將所述各個Mock類組成的集合作為Mock庫。
3.根據權利要求I所述的方法,其特征在于,還包括構建領域對象模型庫的步驟,具體為 獲取待測試源代碼中被引用的領域對象; 按照所述被引用的領域對象之間的引用關系對其進行排序; 通過反射獲取所述被引用的領域對象的屬性信息,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型; 將所述屬性信息和被引用的領域對象的完整路徑按照引用關系順序存儲至所述領域對象模型庫中,所述領域對象模型庫中的一行數據為ー個領域對象的信息。
4.根據權利要求3所述的方法,其特征在干,還包括加載所述領域對象模型庫的步驟,具體為 從所述領域對象模型庫中獲取單條數據,所述單條數據包括領域對象的完整路徑及其初始值; 依據所述領域對象的完整路徑通過反射調用無參構造方法,以創建所述領域對象的實例; 依據所述類型及其初始值調用屬性的賦值方法對所述類型進行賦值; 將所述領域對象的完整路徑和所述賦值后的領域對象的實例作為映射關系對保存至內存中。
5.根據權利要求I所述的方法,其特征在于,所述按照所述領域對象和/或Mock類生成所述被測方法的測試方法,包括 獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調用的方法的參數和返回值類型; 根據所述引用類的類型生成測試方法的方法頭; 根據所述引用類的類型及其所調用的方法的返回值類型生成引用類列表; 遍歷所述引用類列表,以生成模擬引用類對象行為的代碼; 從所述領域對象模型庫中獲取所述引用類的方法參數值,以生成測試方法的方法體;將固定的方法尾、所述方法頭以及方法體組成所述測試方法。
6.一種單元測試的裝置,其特征在于,該裝置包括 接收模塊,用于接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型; 查找模塊,用于依據所述被測方法從所述預先構建的領域對象模型庫查找領域對象,和/或從預先生成的Mock庫中查找Mock類; 生成模塊,用于使用所述領域對象和/或Mock類生成所述被測方法的測試方法; 測試模塊,用于按照所述測試方法對所述原始類進行単元測試。
7.根據權利要求6所述的裝置,其特征在于,還包括生成Mock庫模塊,具體包括 第一獲取子模塊,用于獲取待測試源代碼中各個需要被Mock的原始類; 第一反射子模塊,用于通過反射獲得所述各個原始類的類中被測方法的參數,所述類參數包括被測方法名稱、參數類型和返回值類型; 第一生成子模塊,用于依據所述類參數生成所述原始類對應的各個Mock類; 組合子模塊,用于將所述各個Mock類組成的集合作為Mock庫。
8.根據權利要求7所述的裝置,其特征在于,還包括構建模塊,所述構建模塊具體包括 第二獲取子模塊,用于獲取待測試源代碼中被引用的領域對象; 排序子模塊,用于按照所述被引用的領域對象之間的引用關系對其進行排序; 第二反射子模塊,用于通過反射獲取所述被引用的領域對象的屬性信息,所述屬性信息包括類型及其名稱,所述類型包括基本類型和復雜類型; 存儲子模塊,用于將所述屬性信息和被引用的領域對象的完整路徑按照引用關系順序存儲至所述領域對象模型庫中,所述領域對象模型庫中的一行數據為ー個領域對象的信息。
9.根據權利要求8所述的裝置,其特征在于,還包括加載模塊,所述加載模塊具體包括 第三獲取子模塊,用于從所述領域對象模型庫中獲取單條數據,所述單條數據包括領域對象的完整路徑及其初始值; 創建子模塊,用于依據所述領域對象的完整路徑通過反射調用無參構造方法,以創建所述領域對象的實例; 賦值子模塊,用于依據所述類型及其初始值調用屬性的賦值方法對所述類型進行賦值; 保存子模塊,用于將所述領域對象的完整路徑和所述賦值后的領域對象的實例作為映射關系對保存至內存中。
10.根據權利要求6所述的裝置,其特征在于,所述生成模塊包括 第四獲取子模塊,用于獲取所述被測方法所引用的原始類的引用類的類型,以及該引用類所調用的方法的參數和返回值類型; 第二生成子模塊,用于根據所述引用類的類型生成測試方法的方法頭; 第三生成子模塊,用于根據所述引用類的類型及其所調用的方法的返回值類型生成引用類列表;遍歷子模塊,用于遍歷所述引用類列表,以生成模擬引用類對象行為的代碼; 第四生成子模塊,用于從所述領域對象模型庫中獲取所述引用類的方法參數值,以生成測試方法的方法體; 組成子模塊,用于將固定的方法尾、所述方法頭以及方法體組成所述測試方法。
全文摘要
本發明提供了一種單元測試的方法及裝置,所述方法包括接收輸入的期望字段和測試值;所述期望字段為用戶所選擇的原始類中的被測方法的返回值類型或其屬性的類型;依據所述被測方法從所述預先構建的領域對象模型庫查找領域對象,和/或從預先生成的Mock庫中查找Mock類;使用所述領域對象和/或Mock類生成所述被測方法的測試方法;按照所述測試方法對所述原始類進行單元測試。本發明實施例可以解決現有技術中單元測試的效率低下以及可維護性較差的問題。
文檔編號G06F11/36GK102855177SQ20111018107
公開日2013年1月2日 申請日期2011年6月30日 優先權日2011年6月30日
發明者馮照臨, 劉中勝 申請人:阿里巴巴集團控股有限公司