專利名稱:一種實現單元測試的方法及系統的制作方法
技術領域:
一種單元測試系統及方法,尤其是一種利用記錄函數信息的方式,將一函數抽離開發環境進行單元測試,依據該函數的測試實例(test case)對該函數進行測試產生的測試覆蓋率及測試報告,做為該函數的品質參考數據的單元測試系統及方法。
背景技術:
單元測試是程序設計領域中多種測試的其中一種。通常是為了測試程序中的一個單元,例如一個類別(class)、一個函數(function)等,由負責該單元的程序設計人員作測試。所測試的是,其所撰寫的程序代碼單元是否依據程序設計人員所設想的方式執行,從而產生出符合預期的結果。單元測試是程序設計很重要的一環,它起著問題報告(bug report)的作用,告訴我們程序代碼中那里有錯誤。由于當我們完成或修改一個單元后都需要再進行單元測試,若程序代碼還有問題的話會繼續顯示出來。
隨著軟件的功能越來越強大,軟件的程序代碼也越來越冗長,軟件的各模塊在進行整合時所產生的臭蟲(bug)也越來越多,因此在整合時要找出bug的復雜度也相對的提升,如果純以人工的方式來找bug,往往僅能夠發現該bug而無法提供更有價值的信息。
為了提供更有價值的測試信息,有程序設計師會撰寫單元測試的程序,但卻無法離開其開發的環境來做測試,以致于萬一在軟件各單元進行整合時的開發環境稍有不同,一旦整合的結果不如預期,依然無法得知究竟是整合環境造成的影響,或是兩個單元的接口(interface)在數據傳遞上出了問題,如是前者,那么先前所做的單元測試就失去了意義。
另外,因為有單元測試的程序,那么就會需要有單元測試的測試實例來進行單元測試。不過測試實例能否測到多少部分的程序代碼,也就是單元的測試覆蓋率,就目前來說,還沒有更好的測試方式。
發明內容
本發明為解決背景技術中存在的上述技術問題,而提供一種可產生的測試覆蓋率及測試報告做為該函數的品質參考數據,以提高軟件品質的單元測試的方法及其系統。
本發明的技術解決方案是本發明為一種實現單元測試的方法,其特殊之處在于該方法包括以下步驟1)首先記錄待測試函數的函數信息、將待測試函數的測試實例以及與測試實例對應的預期結果儲存在測試數據庫中;2)接著將所記錄的待測試函數加載,并且在加載后將待測試函數初始化;3)跟著由測試數據庫中讀出待測試函數的測試實例與測試實例對應的預期結果;4)將讀出的測試實例依序對待測試函數進行測試,以得到測試實例的測試結果;5)判斷測試實例是否全部測完,否則返回步驟4),是則進至步驟6);6)在所有的測試實例全部測試完成之后產生本次測試的測試覆蓋率,并借助比較測試實例對應的預期結果與測試結果,產生本次測試的測試報告,輸出測試覆蓋率與測試報告。
上述步驟6)之后還包括有步驟7)將測試時覆蓋的程序代碼完全相同的測試實例只保留一個,將其余的測試實例全數刪除,把測試所產生的測試報告、測試覆蓋率、以及刪除后剩余的各測試實例的測試結果存入數據庫中。
上述步驟2)中待測試函數初始化的過程中發現待測試的函數有呼叫其它的函數,則以被呼叫的函數的回傳值取代被呼叫的函數。
一種實現上述的實現單元測試的方法的測試系統,其特殊之處在于該系統包括測試數據庫模塊110、函數注冊模塊120、函數加載模塊130、函數測試模塊140、結果比較模塊150、結果記錄模塊160,函數注冊模塊120分別接入測試數據庫模塊110和函數加載模塊130,函數加載模塊130接入函數測試模塊140,函數測試模塊140接入結果比較模塊150,結果比較模塊150接入結果記錄模塊160,結果記錄模塊160接入測試數據庫模塊110,測試數據庫模塊110接入函數加載模塊130。
本發明利用記錄函數信息的方式,將一函數抽離開發環境進行單元測試,根據該函數的測試實例對該函數進行測試,并且產生測試覆蓋率及測試報告,通過本發明所產生的測試覆蓋率及測試報告,可以獲得一個量化的數值,使軟件有一個品質上的指針,依次發現找出軟件中的bug,以達到提高軟件品質的效果。
圖1為本發明測試方法的流程圖;圖2本發明測試的系統框圖;圖3本發明實施例中的第一測試函數的程序代碼;圖4為本發明實施中的第一測試函數修改過后的程序代碼;圖5為本發明實施例中的執行本發明方法的過程;圖6為本發明實施例中由第一測試實例測試第一測試函數產生的測試覆蓋率示意圖;圖7為本發明實施例中由第一測試實例測試第一測試函數產生的測試報告;圖8為本發明實施例中由第一與第二測試實例測試修改后的第一測試函數產生的測試覆蓋率示意圖;圖9為本發明實施例中由第一與第二測試實例測試修改后的第一測試函數產生的測試報告;圖10為本發明實施例由第三與第四測試實例測試第二測試函數產生的測試覆蓋率示意圖;圖11為本發明實施例由第三與第四測試實例測試第二測試函數產生的測試報告;圖12為本發明實施例由第三測試實例測試第二測試函數的測試覆蓋率示意圖;圖13為本發明實施例由第四測試實例測試第二測試函數的測試覆蓋率示意圖。
具體實施例方式
參見圖1,本發明的具體方法步驟如下
1)首先記錄待測試函數的函數信息、將待測試函數的測試實例以及與測試實例對應的預期結果儲存在測試數據庫中;2)接著將所記錄的待測試函數加載,并且在加載后將待測試函數初始化,該初始化的過程中發現待測試的函數有呼叫其它的函數,則以被呼叫的函數的回傳值取代被呼叫的函數;3)跟著由測試數據庫中讀出待測試函數的測試實例與測試實例對應的預期結果;4)將讀出的測試實例依序對待測試函數進行測試,以得到測試實例的測試結果;5)判斷測試實例是否全部測完,否則返回步驟4),是則進至步驟6);6)在所有的測試實例全部測試完成之后產生本次測試的測試覆蓋率,并借助比較測試實例對應的預期結果與測試結果,產生本次測試的測試報告,輸出測試覆蓋率與測試結果。
7)將測試時覆蓋的程序代碼完全相同的測試實例只保留一個,將其余的測試實例全數刪除,把測試所產生的測試報告、測試覆蓋率、以及刪除后剩余的各測試實例的測試結果存入數據庫中。
參見圖2,本發明的系統包含有測試數據庫模塊110、函數注冊模塊120、函數加載模塊130、函數測試模塊140、結果比較模塊150、結果記錄模塊160。其中測試數據庫模塊110負責儲存函數注冊模塊120所記錄的待測試函數之函數信息、被記錄之待測試函數之測試實例、及測試實例對應的預期結果;函數注冊模塊120負責將待測試函數的函數名稱、回傳值與各參數的定義等函數信息存入測試數據庫模塊110中;函數加載模塊130負責由測試數據庫模塊110讀出透過函數注冊模塊120所儲存的函數信息,依據讀出的函數信息將待測試函數加載函數測試模塊140中,并進行初始化,如初始化的過程中發現待測試的函數有呼叫其它的函數,則必需要以被呼叫的函數的回傳值取代被呼叫的函數,這樣可確保一次測試僅針對一個函數,這樣如果出現問題,可斷定是此函數本身問題。函數測試模塊140負責讀出儲存在測試數據庫模塊110的待測試函數的測試實例及測試實例對應的預期結果,將讀出的測試實例依序對待測試的函數進行測試,可以產生測試實例對應的測試結果,同時可以在所有的測試實例全部測試完成之后產生并輸出所有測試實例對待測試函數進行測試的測試覆蓋率;結果比較模塊150負責比較由函數測試模塊140產生的測試結果與測試結果對應的測試實例對應的預期結果,產生測試報告,并將該測試報告輸出;結果記錄模塊160會于稍后說明。
當使用者欲使用本發明時,首先要經由函數注冊模塊120將待測試函數的函數信息儲存至測試數據庫110中,并將測試實例與其對應的預期結果也存入測試數據庫模塊110中,接著開始進行測試,函數加載模塊130會由測試數據庫模塊110讀出待測試函數的函數信息,依據讀出的函數信息取得待測試函數的程序代碼,將取得的程序代碼加載在函數測試模塊140中,并將待測試的函數初始化,跟著函數測試模塊140會讀出存于測試數據庫模塊110的待測試函數的測試實例,以及測試實例對應的預期結果,函數測試模塊140在讀出測試實例之后,會將讀出的測試實例依序對待測試的函數進行測試,并產生測試實例對應的測試結果,同時函數測試模塊140會將各測試實例進行測試所覆蓋過的待測試函數的程序代碼記錄下來,當所有的測試實例全部測試完成之后,函數測試模塊140會依據各測試實例所覆蓋的程序代碼產生測試覆蓋率并顯示,接著結果比較模塊150會比較由函數測試模塊140產生的測試結果與測試結果對應的測試實例對應的預期結果,產生測試報告并顯示。
下面結合具體實施例對本發明做進一步的詳細描述參見圖3至9,第一測試函數310實現由輸入的變量i與j找出較大的變量后輸出,程序設計人員使用本發明進行測試,首先會輸入第一測試函數310的函數資料-函數名稱3311、回傳值3312、參數一3313、參數二3314-來執行本發明的注冊程序331,并另外將第一測試函數310的第一測試實例“(5,3))”與第一預期結果“(5)”存入數據庫中,接著執行本發明的測試程序332,本發明便會去數據庫中取得第一測試函數310的第一測試實例并將第一測試函數加載并進行測試,測試完成之后產生測試覆蓋率340,其中第一測試函數310前面的粗黑體數字為該行程序代碼被測試時所執行到的次數,前面的次數為零的該行程序代碼341表示本次測試的測試實例沒有覆蓋到該行程序代碼。測試完成后產生測試報告350,由測試報告350中的測試失敗訊息352可以知道第一測試函數310以第一測試實例進行測試時出現問題,可以提供程序設計人員對第一測試函數310進行修改。同時,由測試覆蓋率340可知第一測試函數310的程序代碼未全部經過測試,因此須要再增加測試實例來測試該行程序代碼。程序設計人員在第一測試函數修改完成320之后,將第二測試實例“(2,7)”與第二預期結果“(7)”存至數據庫中,再次對修改完成后的第一測試函數320進行測試,測試完成之后產生的測試覆蓋率360顯示第一測試實例與第二測試實例已將第一測試函數的程序代碼全部測試完成,測試報告所顯示的訊息373表示為全部測試實例均如預期結果,如此一來,第一測試函數310的品質便可以有所憑依,將來會出錯的機率大幅減少。
本發明中結果比較模塊150還可以在函數測試模塊140進行測試時,將覆蓋的程序代碼完全相同的測試實例中只保留一個進行測試,其余的測試實例全數刪除,將一組程序代碼完全相同的測試實例中只選擇一個作為代表去執行測試,這樣可節省大量執行測試實例的時間,結果記錄模塊160負責將結果比較模塊150產生的測試報告、函數測試模塊140產生的測試覆蓋率與測試得到的測試結果存入測試數據庫模塊110中,如此可以便可以提供后續的回歸測試使用,以使測試實例有不斷重用的功效。因此結果比較模塊150在比較由函數測試模塊140產生的各測試結果與對應于各測試實例的預期結果之后,會依據各測試實例的測試覆蓋率,將覆蓋的程序代碼完全相同的測試實例只保留一個,其余的全部刪除,接著才會產生測試報告并顯示,并且把測試所產生的測試報告、測試覆蓋率、以及將刪除后剩余的各測試實例的測試結果存入數據庫中。
參見圖10-13,第二測試函數410實現由輸入的變量i與j找出較小的變量后輸出,程序設計人員執行本發明的注冊程序后,將第二測試函數410的第三測試實例“(2,7)”與第三預期結果“(2)”、第四測試實例“(4,8)”與第四預期結果“(4)”存入數據庫中,對第二測試函數410進行測試,測試完成之后產生測試覆蓋率420與測試報告430,并將產生的測試覆蓋率420與測試報告430以及第三、第四測試實例的測試結果存入數據庫中,接著,第三測試實例的測試覆蓋率421與第四測試實例的測試覆蓋率422完全相同,測試報告430顯示第三測試實例的刪除訊息433。
權利要求
1.一種實現單元測試的方法,其特征在于該方法包括以下步驟1)首先記錄待測試函數的函數信息、將待測試函數的測試實例以及與測試實例對應的預期結果儲存在測試數據庫中;2)接著將所記錄的待測試函數加載,并且在加載后將待測試函數初始化;3)跟著由測試數據庫中讀出待測試函數的測試實例與測試實例對應的預期結果;4)將讀出的測試實例依序對待測試函數進行測試,以得到測試實例的測試結果;5)判斷測試實例是否全部測完,否則返回步驟4),是則進至步驟6);6)在所有的測試實例全部測試完成之后產生本次測試的測試覆蓋率,并借助比較測試實例對應的預期結果與測試結果,產生本次測試的測試報告,輸出測試覆蓋率與測試結果。
2.根據權利要求1所述的實現單元測試的方法,其特征在于所述步驟6)之后還包括有步驟7)將測試時覆蓋的程序代碼完全相同的測試實例只保留一個,將其余的測試實例全數刪除,把測試所產生的測試報告、測試覆蓋率、以及刪除后剩余的各測試實例的測試結果存入數據庫中。
3.根據權利要求1或2所述的實現單元測試的方法,其特征在于所述步驟2)中待測試函數初始化的過程中發現待測試的函數有呼叫其它的函數,則以被呼叫的函數的回傳值取代被呼叫的函數。
4.一種實現權利要求1所述的實現單元測試的方法的測試系統,其特征在于該系統包括測試數據庫模塊110、函數注冊模塊120、函數加載模塊130、函數測試模塊140、結果比較模塊150、結果記錄模塊160,所述函數注冊模塊120分別接入測試數據庫模塊110和函數加載模塊130,所述函數加載模塊130接入函數測試模塊140,所述函數測試模塊140接入結果比較模塊150,所述結果比較模塊150接入結果記錄模塊160,所述結果記錄模塊160接入測試數據庫模塊110,所述測試數據庫模塊110接入函數加載模塊130。
全文摘要
本發明為一種單元測試系統及方法,尤其是一種利用記錄函數信息的方式,將一函數抽離開發環境進行單元測試,依據該函數的測試實例對該函數進行測試產生的測試覆蓋率及測試報告,做為該函數的品質參考數據的單元測試系統及方法。其技術解決方案為該方法包括以下步驟1)記錄待測試函數的函數信息、儲存測試實例以及對應的預期結果;2)將所記錄的待測試函數加載,并初始化;3)讀出存儲的測試實例與預期結果;4)依序測試讀出的測試實例,得到測試結果;5)判斷是否測完,否則返回4),是則進6);6)產生本次測試的測試覆蓋率,比較預期結果與測試結果,產生本次測試的測試報告,輸出測試覆蓋率與測試結果。
文檔編號G06F11/36GK1987821SQ20061010489
公開日2007年6月27日 申請日期2006年11月14日 優先權日2006年11月14日
發明者陳淮琰, 王軍 申請人:無敵科技(西安)有限公司