一種單元測試方法和裝置制造方法
【專利摘要】本發明實施例公開了一種單元測試方法和裝置,該方法可包括:對用于進行單元測試的測試數據庫的API進行mock,以得到mock API;生成包括所述mock API的嵌入式關系型數據庫;當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。本發明實施例可以降低單元測試的成本。
【專利說明】
一種單元測試方法和裝置
【技術領域】
[0001]本發明涉及互聯網【技術領域】,尤其涉及一種單元測試方法和裝置。
【背景技術】
[0002]隨著互聯網技術的發展,互聯網產品也越來越多,這樣累積程序項目數量也越來越多。為了保證這些程序項目效率與質量,在開發過程往往需要對程序項目進行單元測試,其中,單元測試可以是對單個程序、函數、過程、類、窗口等測試單元進行驗證,以驗證被測試單元是否存在錯誤或者異常。
[0003]然而現在的單元測試都是需要先準備多個數據環境,即安裝多個測試數據庫,例如:mySql數據庫和redis數據庫,再采用多個測試數據庫對被測單元進行單元測試。這樣當被測試的程序項目很多時,每個程序項目都需要安裝專用的測試數據庫,這樣對多個程序項目進行單元測序時,就需要安裝很多個測試數據庫。
[0004]可見,目前的單元測試技術在實現成本過高。
【發明內容】
[0005]本發明提供了一種單元測試方法和裝置,可以降低單元測試的成本。
[0006]第一方面,本發明提供一種單元測試方法,包括:
[0007]對用于進行單元測試的測試數據庫的應用程序編程接口(Applicat1nProgramming Interface, API)進行模擬 mock,以得到 mock API ;
[0008]生成包括所述mock API的嵌入式關系型數據庫;
[0009]當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。
[0010]第二方面,本發明提供一種單元測試裝置,包括:模擬單元、生成單元和測試單元,其中:
[0011]所述模擬單元,用于對用于進行單元測試的測試數據庫的API進行模擬mock,以得到 mock API ;
[0012]所述生成單元,用于生成包括所述mock API的嵌入式關系型數據庫;
[0013]所述測試單元,用于當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。
[0014]上述技術方案中,對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到mock API ;生成包括所述mock API的嵌入式關系型數據庫;當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。由于嵌入式關系型數據庫是不需要安裝和部署的,相比現在技術需要安裝多個測試數據庫,本發明可以降低單元測試的成本。
【專利附圖】
【附圖說明】
[0015]為了更清楚地說明本發明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對于本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
[0016]圖1是本發明實施例提供的一種單元測試方法的流程示意圖;
[0017]圖2是本發明實施例提供的一種可選的效果示意圖;
[0018]圖3是本發明實施例提供的另一種單元測試方法的流程示意圖;
[0019]圖4是本發明實施例提供的一種單元測試裝置的結構示意圖;
[0020]圖5是本發明實施例提供的另一種單元測試裝置的結構示意圖;
[0021]圖6是本發明實施例提供的另一種單元測試裝置的結構示意圖。
【具體實施方式】
[0022]下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分實施例,而不是全部的實施例。基于本發明中的實施例,本領域普通技術人員在沒有作出創造性勞動前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。
[0023]本發明實施例中,被測單元可以是任何程序、函數、過程、類、窗口等可測試單元程序。
[0024]請參閱圖1,圖1是本發明實施例提供的一種單元測試方法的流程示意圖,如圖1所示,包括以下步驟:
[0025]S101、對用于進行單元測試的測試數據庫的API進行模擬mock,以得到mock API。
[0026]可選的,上述用于進行單元測試的測試數據庫可以是需要在本地安裝和部署才可以使用的數據庫,例如:mysql數據庫和redis數據庫等。另外,上述被mock的API可以是測試數據庫中的一部分或者全部的API,例如:可以選擇被測試數據庫一些常用的API進行
mocko
[0027]需要說明的是,上述mock API的屬性和功能與測試數據庫中的API可以相同。這樣可以實現采用嵌入式關系型數據庫進行單元測試與采用測試數據庫進行單元測試的效果一樣。
[0028]S102、生成包括所述mock API的嵌入式關系型數據庫。
[0029]可選的,上述嵌入式關系型數據庫可以是H2數據庫。
[0030]S103、當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。
[0031]可選的,上述采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試可以是,將被測單元需要測試的數據插入到嵌入式關系型數據庫包括的與該被測單元對應的mock API,嵌入式關系型數據庫再返回相應地測試結果,以確認被測單元是否存在錯誤或者異常。
[0032]通過上述步驟可以實現采用嵌入式關系型數據庫包括的mock API進行單元測試,由于嵌入式關系型數據庫不需要裝置和部署,且嵌入式關系型數據庫可以采用JAVA語言進行編寫,以實現一種低成本技術模擬一種高成本技術實現相同的單元測試,從而可以降低單元測試的成本。另外,由于在單元測試過程中不需要安裝測試數據庫,這樣可以實現被測單元與嵌入式關系型數據庫同在一個沙箱里進行單元測試,例如:以測試數據庫包括mysql數據庫和redis數據庫為例,可以實現如圖2所示的隔離效果,完全隔離了測試數據庫,即不需要安裝測試數據庫,以簡化測試流程,而且還可以保證程序功能的完整性。
[0033]可選的,上述方法可以應用于任何智能設備,例如:服務器、平板電腦、手機、電子閱讀器、遙控器、個人計算機(Personal Computer, PC)、筆記本電腦、車載設備、網絡電視、可穿戴設備等智能設備。
[0034]本實施例中,對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到mock API ;生成包括所述mock API的嵌入式關系型數據庫;當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。由于嵌入式關系型數據庫是不需要安裝和部署的,相比現在技術需要安裝多個測試數據庫,本發明可以降低單元測試的成本。
[0035]請參閱圖3,圖3是本發明實施例提供的另一種單元測試方法的流程示意圖,如圖3所示,包括以下步驟:
[0036]S301、對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到 mock API。
[0037]可選的,上述測試數據庫可以包括非關系型數據庫,例如:redis數據庫,這樣步驟S301可以包括:
[0038]將所述非關系型數據庫中的API的預設基本命令轉換成所述嵌入式關系型數據庫中的基本命令,以得到mock API。
[0039]其中,上述預設基本命令可以是非關系型數據庫中常用的基本命令,例如:set命令和get命令,這樣通過步驟S301就可以將非關系型數據庫中的set命令和get命令轉換為嵌入式關系型數據庫中的新增(例如:insert)命令和讀取(例如:select)命令。當然,本實施例中還可以是將非關系型數據庫中的API的所有基本命令都轉換為嵌入式關系型數據庫中的基本命令。轉換后的命令就得到了上述mock API,即該mock API包含轉換后的命令。
[0040]可選的,上述測試數據庫可以包括關系型數據庫,例如:mySql數據庫,這樣步驟S301進一步驟還可以包括:
[0041]將所述關系型數據庫中的API進行模擬mock,以得到mock API。
[0042]由于上述嵌入式關系型數據庫,例如:H2數據庫也是關系型數據庫,這樣這兩種數據庫的API是兼容的,從而可以直接將關系型數據庫中的API進行模擬mock,以得到上述mock API,即得到上述嵌入式關系型數據庫中的API。這樣在單元測試時,可以直接將被測單元的數據插入至上述嵌入式關系型數據庫中的API,以完成單元測試。另外,還可以將關系型數據庫中的新增(例如:insert)、修改(例如:modify)和刪除(例如:delete)命令mock至嵌入式關系型數據庫。這樣可以實現原來對關系型數據庫的操作都轉移至嵌入式關系型數據庫中執行。
[0043]S302、生成包括所述mock API的嵌入式關系型數據庫。
[0044]可選的,步驟S302可以包括:
[0045]通過注射(inject)技術和開源框架(spring)技術生成包括所述mock API的嵌入式關系型數據庫。
[0046]其中,上述inject技術可以是谷歌(google) inject技術,這樣可以實現通過采用這兩項技術生成上述嵌入式關系型數據庫。
[0047]通過步驟S302就可以實現將上述嵌入式關系型數據庫替代上述測試數據庫,以使用嵌入式關系型數據庫進行單元測試。
[0048]S303、當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。
[0049]S304、清除所述嵌入式關系型數據庫中測試數據,其中,所述測試數據為對所述被測試單元進行測試所產生的數據。
[0050]可選的,上述嵌入式關系型數據庫可以實現對多個被測單元進行測試,每個被測單元的單元測試都是分開的,即每個被測單元的單元測試只占用嵌入式關系型數據庫的一部分數據或者API,多個單元測試是相互隔離的,做得互不影響,且通過步驟S304就可以將進行單元測試時產生的數據清除,從而可以實現單元測試的事務隔離,以及避免內存數據過多給設備造成過多的功耗損失。例如:假設同一類有兩個方法都要測試銀行轉賬功能,且兩個方法都是對同一賬號進行測試,其中方法I賬號的余額10,該賬號接收銀行轉賬10,則賬號的余額是20元;如果方法2賬號的余額是10元,接收銀行轉賬10元,則余額也是20元,因為單元測試都是分開的,所有方法2轉賬后,該賬號的余額還是20元。
[0051]本實施例,在圖1所示的實施例的基礎上增加了多種可選的實施方式,且都可以實現降低單元測試的成本。另外,本實施例中的實施方式都可以應用于圖1所示的實施例中。
[0052]下面為本發明裝置實施例,本發明裝置實施例用于執行本發明方法實施例一至二實現的方法,為了便于說明,僅示出了與本發明實施例相關的部分,具體技術細節未揭示的,請參照本發明實施例一和實施例二。
[0053]請參閱圖4,圖4是本發明實施例提供的一種單元測試裝置的結構示意圖,如圖4所示,包括:模擬單元41、生成單元424和測試單元43,其中:
[0054]模擬單元41,用于對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到mock API。
[0055]可選的,上述用于進行單元測試的測試數據庫可以是需要在本地安裝和部署才可以使用的數據庫,例如:mysql數據庫和redis數據庫等。另外,上述被mock的API可以是測試數據庫中的一部分或者全部的API,例如:可以選擇被測試數據庫一些常用的API進行
mocko
[0056]生成單元42,用于生成包括所述mock API的嵌入式關系型數據庫。
[0057]可選的,上述嵌入式關系型數據庫可以是H2數據庫。
[0058]測試單元43,用于當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。
[0059]可選的,上述采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試可以是,將被測單元需要測試的數據插入到嵌入式關系型數據庫包括的與該被測單元對應的mock API,嵌入式關系型數據庫再返回相應地測試結果,以確認被測單元是否存在錯誤或者異常。
[0060]本實施例中,對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到mock API ;生成包括所述mock API的嵌入式關系型數據庫;當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。由于嵌入式關系型數據庫是不需要安裝和部署的,相比現在技術需要安裝多個測試數據庫,本發明可以降低單元測試的成本。
[0061]請參閱圖5,圖5是本發明實施例提供的另一種單元測試裝置的結構示意圖,如圖5所示,包括:模擬單元51、生成單元52、測試單元53和清除單元54,其中:
[0062]模擬單元51,用于對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到mock API。
[0063]可選的,上述測試數據庫可以包括非關系型數據庫,例如:redis數據庫,模擬單元51可以用于將所述非關系型數據庫中的API的預設基本命令轉換成所述嵌入式關系型數據庫中的基本命令,以得到mock API。
[0064]其中,上述預設基本命令可以是非關系型數據庫中常用的基本命令,例如:set命令和get命令,這樣通過步驟S301就可以將非關系型數據庫中的set命令和get命令轉換為嵌入式關系型數據庫中的新增(例如:insert)命令和讀取(例如:select)命令。當然,本實施例中還可以是將非關系型數據庫中的API的所有基本命令都轉換為嵌入式關系型數據庫中的基本命令。轉換后的命令就得到了上述mock API,即該mock API包含轉換后的命令。
[0065]可選的,上述測試數據庫可以包括關系型數據庫,例如:mySql數據庫,這樣模擬單元51進一步還可以用于將所述關系型數據庫中的API進行模擬mock,以得到mock API。
[0066]由于上述嵌入式關系型數據庫,例如:H2數據庫也是關系型數據庫,這樣這兩種數據庫的API是兼容的,從而可以直接將關系型數據庫中的API進行模擬mock,以得到上述mock API,即得到上述嵌入式關系型數據庫中的API。這樣在單元測試時,可以直接將被測單元的數據插入至上述嵌入式關系型數據庫中的API,以完成單元測試。另外,還可以將關系型數據庫中的新增(例如:insert)、修改(例如:modify)和刪除(例如:delete)命令mock至嵌入式關系型數據庫。這樣可以實現原來對關系型數據庫的操作都轉移至嵌入式關系型數據庫中執行。
[0067]生成單元52,用于生成包括所述mock API的嵌入式關系型數據庫。
[0068]可選的,生成單元52可以用于通過注射(inject)技術和開源框架(spring)技術生成包括所述mock API的嵌入式關系型數據庫。
[0069]其中,上述inject技術可以是谷歌(google) inject技術,這樣可以實現通過采用這兩項技術生成上述嵌入式關系型數據庫。
[0070]測試單元53,用于當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。
[0071]清除單元54,用于清除所述嵌入式關系型數據庫中測試數據,其中,所述測試數據為對所述被測試單元進行測試所產生的數據。
[0072]可選的,上述嵌入式關系型數據庫可以實現對多個被測單元進行測試,每個被測單元的單元測試都是分開的,即每個被測單元的單元測試只占用嵌入式關系型數據庫的一部分數據或者API,多個單元測試是相互隔離的,做得互不影響,且通過清除單元54就可以將進行單元測試時產生的數據清除,從而可以實現單元測試的事務隔離,以及避免內存數據過多給設備造成過多的功耗損失。例如:假設同一類有兩個方法都要測試銀行轉賬功能,且兩個方法都是對同一賬號進行測試,其中方法I賬號的余額10,該賬號接收銀行轉賬10,則賬號的余額是20元;如果方法2賬號的余額是10元,接收銀行轉賬10元,則余額也是20元,因為單元測試都是分開的,所有方法2轉賬后,該賬號的余額還是20元。
[0073]本實施例,在圖4所示的實施例的基礎上增加了多種可選的實施方式,且都可以實現降低單元測試的成本。另外,本實施例中的實施方式都可以應用于圖4所示的實施例中。
[0074]請參見圖6,圖6是本發明實施例提供的另一種單元測試裝置的結構示意圖。如圖6所示,所述裝置I可以包括:至少一個處理器1001,例如CPU,至少一個網絡接口 1004,用戶接口 1003,存儲器1005,至少一個通信總線1002。其中,通信總線1002用于實現這些組件之間的連接通信。其中,用戶接口 1003可以包括顯示屏(Display)、鍵盤(Keyboard),可選用戶接口 1003還可以包括標準的有線接口、無線接口。網絡接口 1004可選的可以包括標準的有線接口、無線接口。存儲器1005可以是高速RAM存儲器,也可以是非不穩定的存儲器(non-volatile memory),例如至少一個磁盤存儲器。存儲器1005可選的還可以是至少一個位于遠離前述處理器1001的存儲裝置。如圖6所示,作為一種計算機存儲介質的存儲器1005中可以包括操作系統、網絡通信模塊、用戶接口模塊以及設備控制應用程序。
[0075]在圖6所示的裝置I中,處理器1001可以用于調用存儲器1005中存儲的設備控制應用程序,以實現
[0076]對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到 mock API ;
[0077]生成包括所述mock API的嵌入式關系型數據庫;
[0078]當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。
[0079]可選的,所述測試數據庫至少包括非關系型數據庫;所述處理器1001在執行所述對用于進行單元測試的測試數據庫的API進行模擬mock,以得到mockAPI時,具體可以用于:
[0080]將所述非關系型數據庫中的API的預設基本命令轉換成所述嵌入式關系型數據庫中的基本命令,以得到mock API。
[0081]可選的,所述測試數據庫進一步包括關系型數據庫;所述處理器1001在執行所述對用于進行單元測試的測試數據庫的API進行模擬mock,以得到mockAPI時,具體可以用于:
[0082]將所述關系型數據庫中的API進行模擬mock,以得到mock API。
[0083]可選的,處理器1001在執行所述生成包括所述mock API的嵌入式關系型數據庫時,具體可以用于:
[0084]通過注射inject技術和開源框架spring技術生成包括所述mock API的嵌入式關系型數據庫。
[0085]可選的,處理器1001具體還可以用于:
[0086]清除所述嵌入式關系型數據庫中測試數據,其中,所述測試數據為對所述被測試單元進行測試所產生的數據。
[0087]本實施例中,對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到mock API ;生成包括所述mock API的嵌入式關系型數據庫;當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。由于嵌入式關系型數據庫是不需要安裝和部署的,相比現在技術需要安裝多個測試數據庫,本發明可以降低單元測試的成本。
[0088]本領域普通技術人員可以理解實現上述實施例方法中的全部或部分流程,是可以通過計算機程序來指令相關的硬件來完成,所述的程序可存儲于一計算機可讀取存儲介質中,該程序在執行時,可包括如上述各方法的實施例的流程。其中,所述的存儲介質可為磁碟、光盤、只讀存儲記憶體(Read-Only Memory, ROM)或隨機存取存儲器(Random AccessMemory,簡稱 RAM)等。
[0089]以上所揭露的僅為本發明較佳實施例而已,當然不能以此來限定本發明之權利范圍,因此依本發明權利要求所作的等同變化,仍屬本發明所涵蓋的范圍。
【權利要求】
1.一種單元測試方法,其特征在于,包括: 對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到mock API ; 生成包括所述mock API的嵌入式關系型數據庫; 當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mockAPI對所述被測單元進行單元測試。
2.如權利要求1所述的方法,其特征在于,所述測試數據庫至少包括非關系型數據庫; 所述對用于進行單元測試的測試數據庫的API進行模擬mock,以得到mock API,包括: 將所述非關系型數據庫中的API的預設基本命令轉換成所述嵌入式關系型數據庫中的基本命令,以得到mock API。
3.如權利要求2所述的方法,其特征在于,所述測試數據庫進一步包括關系型數據庫; 所述對用于進行單元測試的測試數據庫的API進行模擬mock,以得到mock API進一步還包括: 將所述關系型數據庫中的API進行模擬mock,以得到mock API。
4.如權利要求1-3中任一項所述的方法,其特征在于,所述生成包括所述mockAPI的嵌入式關系型數據庫,包括: 通過注射inject技術和開源框架spring技術生成包括所述mock API的嵌入式關系型數據庫。
5.如權利要求1-3中任一項所述的方法,其特征在于,所述采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試之后,所述方法還包括: 清除所述嵌入式關系型數據庫中測試數據,其中,所述測試數據為對所述被測試單元進行測試所產生的數據。
6.一種單元測試裝置,其特征在于,包括:模擬單元、生成單元和測試單元,其中: 所述模擬單元,用于對用于進行單元測試的測試數據庫的應用程序編程接口 API進行模擬mock,以得到mock API ; 所述生成單元,用于生成包括所述mock API的嵌入式關系型數據庫; 所述測試單元,用于當需要對被測單元進行單元測試時,采用所述嵌入式關系型數據庫包括的所述mock API對所述被測單元進行單元測試。
7.如權利要求6所述的裝置,其特征在于,所述測試數據庫至少包括非關系型數據庫; 所述模擬單元用于將所述非關系型數據庫中的API的預設基本命令轉換成所述嵌入式關系型數據庫中的基本命令,以得到mock API。
8.如權利要求7所述的裝置,其特征在于,所述測試數據庫進一步包括關系型數據庫; 所述模擬單元進一步還用于將所述關系型數據庫中的API進行模擬mock,以得到mockAPI。
9.如權利要求6-8中任一項所述的裝置,其特征在于,所述生成單元用于通過注射inject技術和開源框架spring技術生成包括所述mock API的嵌入式關系型數據庫。
10.如權利要求6-8中任一項所述的裝置,其特征在于,所述裝置還包括: 清除單元,用于清除所述嵌入式關系型數據庫中測試數據,其中,所述測試數據為對所述被測試單元進行測試所產生的數據。
【文檔編號】G06F17/30GK104375933SQ201410479968
【公開日】2015年2月25日 申請日期:2014年9月18日 優先權日:2014年9月18日
【發明者】譚海潮, 盧軒華 申請人:廣州華多網絡科技有限公司