本發明涉及計算機
技術領域:
,具體涉及一種白盒測試的方法和系統。
背景技術:
:白盒測試是基于程序的內在邏輯進行的代碼級測試。白盒測試要求測試人員為每個功能單元編寫測試用例,因此白盒測試的編碼工作量很大,對測試人員的編碼能力要求很高。目前已有的一些測試框架,如java的junit和testing測試框架,測試人員可以在框架中編寫、編譯和執行測試代碼,雖然能減輕測試人員的一部分編碼工作,但無法使測試人員完全從編碼工作中擺脫出來。在項目前期,測試人員需要花費大量的時間和精力去編寫測試代碼。在項目延續期間,測試人員需要持續地對測試代碼進行維護。例如,一個類的某個方法的變量個數由兩個變為三個,那這個類的測試代碼也需要進行修改,這個類所在的測試工程文件需要重新編譯。再例如,一個類方法的變量類型發生改變,也需要重復上述過程。此類修改要求測試人員及時掌握被測代碼單元的變動情況,并據此修改測試代碼。但在現實場景中,研發人員可能會忘記或者忽略此類修改,測試人員不能及時更正測試代碼,導致的結果是測試工程無法編譯通過或執行錯誤。技術實現要素:有鑒于此,本發明提供一種白盒測試的方法和系統,以解決上述問題。根據本發明的第一方面,提供一種白盒測試的方法,包括:讀取測試數據,所述測試數據包括被測代碼單元的標識、入口參數和預期結果;根據所述被測代碼單元的標識和入口參數生成所述被測代碼單元的測試 代碼;根據所述測試代碼的執行結果和所述預期結果的比對,輸出所述被測代碼單元的測試狀態。優選地,所述被測代碼單元的標識為面向對象設計語言的類的類名稱和類方法,所述入口參數為所述類方法的入口參數。優選地,所述生成所述被測代碼單元的測試代碼包括:根據所述類名稱生成構造所述類的實例化對象的測試代碼;根據所述類方法和所述入口參數生成調用所述實例化對象中的類方法的測試代碼。優選地,所述被測代碼單元的標識為過程化設計語言的函數名稱,所述入口參數為所述函數的入口參數。優選地,還包括:校驗所述入口參數。優選地,輸出所述被測代碼單元的測試狀態包括:通過郵件發送所述被測代碼單元的測試狀態。根據本發明的第二方面,提供一種用于白盒測試的系統,包括:接收模塊,用于讀取測試數據,所述測試數據包括被測代碼單元的標識、入口參數和預期結果;生成模塊,用于根據所述被測代碼單元的標識和入口參數生成所述被測代碼單元的測試代碼;輸出模塊,用于根據測試代碼的執行結果和預期結果的比對,輸出所述被測代碼單元的測試狀態。優選地,所述被測代碼單元的標識為面向對象設計語言的類的類名稱和類方法,所述入口參數為所述類方法的入口參數。優選地,所述被測代碼單元的標識為過程化設計語言的函數名稱,所述入口參數為所述函數的入口參數。優選地,還包括:校驗模塊,用于校驗所述入口參數。本發明實施例提供的一種白盒測試的方法,包括:讀取測試數據,所述測試數據包括被測代碼單元的標識、入口參數、預期結果;根據所述被測代碼單元的標識和入口參數生成所述被測代碼單元的測試代碼;根據所述測試代碼的執行結果和所述預期結果的比對,輸出所述被測代碼單元的測試狀態。本發明實施例提供的用于白盒測試的方法解除了測試代碼對被測 代碼的依賴,實現測試代碼和被測代碼單元的松耦合,使測試環境更加的獨立,易于維護和使用。測試人員可以不編寫測試代碼實現多個測試用例,減少測試成本,提高測試效率。測試系統生成的測試報告直接發送給研發人員,并在其中增加了對錯誤的描述,對于問題的追蹤起到積極效果。附圖說明通過參照以下附圖對本發明實施例的描述,本發明的上述以及其它目的、特征和優點將更為清楚,在附圖中:圖1是根據本發明實施例的白盒測試的方法的流程圖;圖2是根據本發明另一實施例的白盒測試的方法的流程圖;圖3是根據本發明實施例的用于白盒測試的系統的結構圖;圖4是根據本發明實施例的使用白盒測試系統的測試效果比對。具體實施方式以下基于實施例對本發明進行描述,但是本發明并不僅僅限于這些實施例。在下文對本發明的細節描述中,詳盡描述了一些特定的細節部分。對本領域技術人員來說沒有這些細節部分的描述也可以完全理解本發明。為了避免混淆本發明的實質,公知的方法、過程、流程沒有詳細敘述。另外附圖不一定是按比例繪制的。附圖中的流程圖、框圖圖示了本發明實施例的系統、方法、裝置的可能的體系框架、功能和操作,流程圖和框圖上的方框可以代表一個模塊、程序段或僅僅是一段代碼,所述模塊、程序段和代碼都是用來實現規定邏輯功能的可執行指令。也應當注意,所述實現規定邏輯功能的可執行指令可以重新組合,從而生成新的模塊和程序段。因此附圖的方框以及方框順序只是用來更好的圖示實施例的過程和步驟,而不應以此作為對發明本身的限制。圖1是根據本發明實施例的白盒測試的方法的流程圖,包括步驟100-102。在步驟100中,讀取測試數據。本步驟中的測試數據包括被測代碼單元的標識、入口參數和預期結果。被測代碼單元在面向對象的編程語言(如,java,c#)中指類的方法,入口參數為類的方法的入口參數。在過程化編程語言(如,c)設計時,被測代碼單元為函數,入口參數為函數的入口參數。預期結果是將入口參數代入到被測代碼單元執行時預期的返回值。在本步驟中,將測試數據讀取到內存中,在內存中對測試數據進行處理。在步驟101中,根據被測代碼單元的標識和入口參數生成被測代碼單元的測試代碼。在使用面向對象設計語言時,測試一個類或類的方法首先需要將類實例化,通過實例化對象調用每個類方法;如果是過程設計語言,不需要構造實例化對象,直接調用每個函數。在步驟102中,根據測試代碼的執行結果和預期結果的比對,輸出被測代碼單元的測試狀態。在本步驟中,記錄類方法或函數的執行結果,將該執行結果和每個方法或函數的預期結果比對,判斷被測代碼單元是否通過,并作為測試狀態輸出。本發明實施例提供的白盒測試的方法,讀取測試數據,生成被測代碼單元的測試代碼,并根據預期結果和測試代碼的執行結果輸出測試狀態。該方法根據測試數據直接生成測試代碼,使測試人員免于編寫測試代碼,節省了人力資源,從而提高了測試效率。圖2是根據本發明另一實施例的白盒測試的方法的流程圖,包括步驟201-204。在步驟201中,讀取測試數據。表1是java的一個測試數據的示例。在本步驟中,將下述的測試數據讀取到內存中,將類名和方法名去重,針對于同一個類的多個方法采用map的形式進行組裝,組裝后進行排序分類。表格1在上表中,將類com.jd.easytest.service.userservice(其中com.jd.easytest.service為類所屬的包的名稱)的方法findbyerp、findbyname和addbyname和對應的入口參數組織在一起。將類com.jd.easytest.service.usercase的方法readcount、accessbyname和對應的入口參數組織在一起。在步驟202中,根據類名稱生成構造類的實例化對象的代碼。在步驟203中,生成調用實例化對象中的每個方法的測試代碼。在步驟202和203中,首先根據類的名稱生成實例化對象,然后生成調用實例對象的每個方法的測試代碼。在java/c++中最常用的是通過new語句創建對象,然后通過對象指針依次調用類的方法。下面是根據表1的測試數據生成示意性的測試代碼。userservice*p=newuserservice();//實例化usercase*q=newusercase();//實例化stringa,b,d;//返回值定義integere,f;//返回值定義a=p->findbyerp("name");//方法調用b=p->findbyname("name","addr");//方法調用d=p->addbyname("mingming");//方法調用e=q->readcount("name");//方法調用f=q->accessbyname("name","addr");//方法調用p,q為兩個實例化對象的指針,通過指針調用設定的類方法,并將方法的執行結果保存在變量中。在步驟204中,根據測試代碼的執行結果和預期結果的比對,輸出被測代碼單元的測試狀態。下面的代碼是根據步驟202、203續寫的測試代碼。if(a=="jiaou")system.out("測試通過");if(b=="aa")system.out("測試通過");if(d=="bb")system.out("測試通過");if(e==0)system.out("測試通過");if(f==0)system.out("測試通過");為了方便研發人員對測試用例進行復查,上述比對結果會保存到一個文件中,如excel表格,并通過郵件或其他方式發送給相應的研發人員。表2為表1的測試結果的excel表格,其中測試狀態用pass(通過)和fail(失敗)標識。表格2類名稱方法名入口參數預期結果測試狀態com.jd.easytest.service.userservicefindbyerpnamejiaoupasscom.jd.easytest.service.userservicefindbynamename,addraapasscom.jd.easytest.service.userserviceaddbynamemingmingbbpasscom.jd.easytest.service.usercasereadcountname0passcom.jd.easytest.service.usercaseaccessbynamename,addr0fail在上述實施例的方法中,如果測試數據中編寫的入口參數和被測代碼單元的入口參數不一致,可能導致程序異常中斷或執行錯誤。因此有必要在調用每個方法前,對入口參數進行校驗,并根據校驗結果確定是否跳過該方法。例如,上表中的findbyname有兩個入口參數,但是在被測代碼中的findbyname中如果只有一個入口參數,則該方法的入參有誤,跳過該方法的執行。在一個可選的實施例中,在測試數據中增加上一次執行時所使用的入口參數類型,比較本次入口參數和上一次的入口參數,如果個數或類型不一致,則跳過該方法的執行。表3是另一個示例性的測試數據。表格3類名稱方法名入口參數預期結果上次入參com.jd.easytest.service.userservicefindbyerpnamejiaoustringcom.jd.easytest.service.userservicefindbynamename,addraastringcom.jd.easytest.service.userserviceaddbynamemingmingbbstringcom.jd.easytest.service.usercasereadcountname0stringcom.jd.easytest.service.usercaseaccessbynamename,addr0string,string其中,方法findbyname上次測試時的入口參數包括1個string類型的入參,本次入口參數卻有兩個,因此,本次測試不執行該方法。圖3是根據本發明實施例的用于白盒測試的系統的結構圖,包括接收模塊301、生成模塊302和輸出模塊303。接收模塊301讀取測試數據,其中測試數據包括被測代碼單元的標 識、入口參數和預期結果。被測代碼單元為函數或類的方法。生成模塊302根據被測代碼單元的標識和入口參數生成被測代碼單元的測試代碼。如上述所述,面向對象的編程語言設計時,根據類名稱構造類的實例化對象,然后生成調用實例化對象中的每個方法的測試代碼。過程化設計語言時,生成調用每個函數的代碼,其中,將入口參數代入到對應的函數中。輸出模塊303用于根據測試代碼的執行結果和預期結果的比對,輸出被測代碼單元的測試狀態。在一個優選的實施例中,根據測試結果生成測試報告,將測試報告通過郵件或其他方式發送給研發人員。在一個可選的實施例中,上述系統包括一個校驗模塊,校驗模塊在生成測試代碼前,對被測代碼單元的入口參數進行校驗。檢驗方法有多種。例如,將上一次測試的入口參數和本次測試的入口參數進行比對,判斷是否一致,如果一致,則繼續生成測試代碼,如果不一致,則跳過該待測代碼單元的測試。圖4是根據本發明實施例的使用白盒測試系統的測試效果比對。左圖是傳統的測試流程,右圖是使用白盒測試系統的測試流程。在左圖中,測試人員需要編寫測試數據和測試代碼,并將測試數據和測試代碼組裝在一起,執行組裝后的測試代碼,得到測試報告。在右圖上,測試人員只需要編寫測試數據,然后使用白盒測試系統進行測試,即可以得到一個完整的測試報告。白盒測試的系統不依賴于開發代碼,可以用于測試不同的研發項目。本發明實施例提供的用于白盒測試的系統解除了測試代碼對開發代碼的依賴,測試代碼和被測代碼單元實現松耦合,使測試環境更加的獨立、易于維護和使用。測試人員可以不編寫測試代碼實現多個測試用例,因此,減少測試成本,提高測試效率。測試系統生成的測試報告直接發送給研發人員,并在其中增加對錯誤的描述,對于問題的追蹤起到積極效果。系統的各個模塊或單元可以通過硬件、固件或軟件實現。軟件例如包括采用java、c/c++/c#、sql等各種編程語言形成的編碼程序。雖然 在方法以及方法圖例中給出本發明實施例的步驟以及步驟的順序,但是所述步驟實現規定的邏輯功能的可執行指令可以重新組合,從而生成新的步驟。所述步驟的順序也不應該僅僅局限于所述方法以及方法圖例中的步驟順序,可以根據功能的需要隨時進行調整。例如將其中的某些步驟并行或按照相反順序執行。根據本發明的系統和方法可以部署在單個或多個服務器上。例如,可以將不同的模塊分別部署在不同的服務器上,形成專用服務器。或者,可以在多個服務器上分布式部署相同的功能單元、模塊或系統,以減輕負載壓力。所述服務器包括但不限于在同一個局域網以及通過internet連接的多個pc機、pc服務器、刀片機、超級計算機等。以上所述僅為本發明的優選實施例,并不用于限制本發明,對于本領域技術人員而言,本發明可以有各種改動和變化。凡在本發明的精神和原理之內所作的任何修改、等同替換、改進等,均應包含在本發明的保護范圍之內。當前第1頁12