專利名稱:一種Linux內核級單元測試的方法
技術領域:
本發明涉及一種單元測試方法,更具體地說,涉及一種Linux內核級單 元測方法。
背景技術:
單元測試被公認為軟件開發過程中的一個關鍵步驟。單元測試能夠簡化 錯誤檢測,在減少開發時間和成本的同時提高軟件質量。
通常而言, 一個單元測試是用于判斷某個特定條件(或者場景)下某個 特定函數的行為。例如,你可能把一個很大的值放入一個有序list中去,然 后確認該值出現在list的尾部。或者,你可能會從字符串中刪除匹配某種模 式的字符,然后確認字符串確實不再包含這些字符了。
當前已經存在多種單元測試框架,但是都是用于用戶空間的應用程序單 元測試。例如,在公開號為CN101055522A的發明專利中公開了一種自動生 成單元測試例的方法和裝置,其中,預先設置程序單元的詳細設計文檔,讀 取詳細設計文檔中接口規格部分,并且從接口規格部分解析出所有針對程序 單元的參數的參數值,然后將各參數的參數值組合生成單元測試例。
在公開號為CN1987821A的發明專利中公開了 一種實現單元測試的方法 及系統,具體地說,該方法和系統利用記錄函數信息的方法,將一函數抽離 開發環境進行單元測試,依據該函數的測試實例對該函數進行測試,產生測 試覆蓋率及測試報告,并且將其作為該函數的品質參考數據。
在公開號為CN1641601A的發明專利中公開了一種軟件的單元測試方 法,在該方法中,啟動測試用例;設置能夠提供被測單元所需數據的樁環境 或數據庫環境;構造被測單元所需的輸入參數,并驅動被測單元執行被測函 數或方法,該被測函數或方法需要的下層數據或外部數據從樁環境或數據庫 環境獲取;檢查被測函數或方法的輸出以驗證被測單元是否工作正常。
目前尚無Linux內核空間的單元測試框架和完善的單元測試方法。因此, 需要一種Linux內核中做單元測試的方法來解決Linux內核級單元測試的問題。
發明內容
本發明的目的在于提供一種Linux內核中做單元測試的方法來解決 Linux內核級單元測試。
根據本發明的一方面,提供一種Linux內核級單元測試的方法,所述方 法包括編譯被測模塊,并將編譯后的被測模塊加載到內核空間;建立并實 現內核級單元測試框架;建立并實現單元測試模塊;將內核級單元測試框架 連同單元測試模塊一起編譯,并且將編譯后的模塊加載到內核空間;以及輸 出單元測試結果。
根據本發明的另 一方面,提供一種Linux內核級單元測試的方法,所述 方法包括編譯被測模塊,并將編譯后的被測模塊加載到內核空間;建立并 實現內核級單元測試框架;建立并實現單元測試模塊;分別編譯內核級單元 測試框架和單元測試模塊,并且先將編譯后的內核級單元測試框架加載到內 核空間,再將編譯后的單元測試模塊加載到內核空間;以及輸出單元測試結 果。
通過下面結合附圖進行的描述,本發明的目的和特點將會變得更加清楚, 其中
圖1是根據本發明的示例性實施例的內核級單元測試方法的流程圖2是根據本發明的示例性實施例的調用關系的示圖;以及
圖3是根據本發明的另一示例性實施例的內核級單元測試方法的流程圖。
具體實施例方式
下面將詳細說明本發明的實施例。首先,明確在本發明的實施例中使用 的幾個概念。 被測模塊
被測模塊是我們編寫的某種用途的內核模塊,需要對它進行單元測試, 在本發明的示例性實施例中假定為被測模塊為mod。
5^皮測函凄t
被測模塊中的被測函數。在本發明的示例性實施例中假定有 一 個單元foo
的凈皮觀'J函凄t foo—bar。 單元測試模塊
單元測試模塊一個獨立的內核模塊,用單元測試模塊來對被測模塊中的 單元進行單元測試。在本發明的示例性實施例中假定為kut_mod。 單元測試函數
單元測試函數包括在單元測試模塊中,用于對被測模塊中的被測函數進 行測試。在本發明的示例性實施例中假定為test—foo—bar, test_foo—baz等。 Linux內核級單元測試(KUnit)框架模塊
KUnit框架可以編譯為一個獨立的內核模塊,這樣它可以同時被多個單 元測試模塊使用。KUnit框架也可以和單元測試模塊一起編譯為一個獨立的 單元測試模塊。
斷言
斷言是一個簡單的方法調用,用于判斷某個語句是否為真。 下面將參照圖l詳細根據本發明的內核級單元測試方法。在步驟SIOI,
當測試被測模塊mod時,可以修改被測模塊的代碼,以使用 EXPORT—SYMBOL宏將被測模塊的被測函數導出到內核空間中,并且將被 測才莫塊編if為mod.ko。
在步驟S102,使用insmod命令將mod.ko加載到內核空間。 在步驟S103,建立并實現KUnit框架。具體地說,建立KUnit框架包括 實現內核空間斷言(kunit_assert )、實現調用單元測試函lt的方法(kunit_run ) 以及實現單元測試結果的收集、管理和輸出(kunit一result )。
在本發明的示例性實施例中,可以按照下述方式來實現內核空間斷言 (kunit—assert ):
# define kunit—assert(condition) \ do { \ if (!(condition)) \ return ^condition; \ } while (O)
其中,參數包含斷言條件(例如,condition )。斷言的關鍵是對條件的判斷,條件condition不滿足時返回不滿足的條件信息。
kunit—run帶有一個參數,該參數是單元測試函數。kunit_mn的主要職責 是調用單元測試函數,收集單元測試函數執行的結果,并且將該結果保存在 某種數據結構中(例如,鏈表)。結果信息至少包含單元測試函數名,ID,測 試成功與否,失敗時的斷言錯誤信息,以便最后輸出。
下面將描述調用單元測試函數,收集測試結果,對測試結果進行管理的 過程。
單元測試模塊(kut_mod )的test_foo函數用于對與被測模塊mod中foo 單元的每個被測函數(如foo一bar, foo_baz等)相應的單元測試模塊中的單 元測試函數(test—foo—bar等)依次調用kunit—run,然而,test—foo函數被單 元測試模塊的入口函數(kut—mod—init)調用。參見如圖2所示的調用關系。
圖中test—foo—bar函數分別用kunit—assert來斷言foo—bar各種測試用例的結果。
最后通過kunit—result函數,遍歷內部的鏈表或其它數據結構,輸出各結 點上保存的結果信息。輸出信息可以顯示在屏幕,內核日志文件或者遠端機器上。
在步驟SI04,建立并實現單元測試模塊kut一mod。 kut—mod包括入口函 數kut—mod—init函lt和test—foo函凄史。kut—modjnit函凄丈是單元測試才莫塊的入 口函數。test—foo函數對每個單元測試函數依次調用kunit—run,并且test—foo 函IU皮kut—mod—init函凄t調用。
在步驟S105 ,將KUnit框架連同單元測試才莫塊kut一mod —起編譯為內核 單元測試模塊kut—mod.ko,并且使用insmod命令將kut—mod.ko力口載到內核 空間。
然后,在步驟S106,在加載kut_mod.ko的同時啟動入口函數kut_mod—init 從而進行自動化的內核單元測試,并輸出結果。
此外,KUnit框架可以不與單元測試才莫塊kut—mod —起凈皮編譯,而是被 單獨編譯。下面將參照圖3描述根據本發明的示例性實施例的將KUnit框架 單獨編譯的單元測試方法。
在步驟S301,當測試被測模塊mod時,可以修改被測模塊的代碼,以 使用EXPORT—SYMBOL宏將被測模塊的被測函數導出到內核空間中,并且 將被測模塊編譯為mod.ko。在步驟S302,使用insmod命令將mod.ko加載到內核空間。 在步驟S303,建立并實現KUnit框架。具體地說,建立KUnit框架包括 實現內核空間斷言(kunit—assert )、實現調用單元測試函^:的方法(kunit—mn ) 以及實現單元測試結果的收集、管理和輸出(kunit—result )。
在本發明的示例性實施例中,可以按照下述方式來實現內核空間斷言 (loinit—assert ):
# define kunit—assert(condition) \ do { \ if ('(condition)) \ return #condition; \ } while (0)
其中,參數包含斷言條件(例如,condition )。斷言的關鍵是對條件的判 斷,條件condition不滿足時返回不滿足的條件信息。
kunit_mn帶有一個參數,該參數是單元測試函數。kunit—run的主要職責 是調用單元測試函數,收集單元測試函數執行的結果,并且將該結果保存在 某種數據結構中(例如,鏈表)。結果信息至少包含單元測試函數名,ID,測 試成功與否,失敗時的斷言錯誤信息,以便最后輸出。
下面將描述調用單元測試函數,收集測試結果,對測試結果進行管理的 過程。
單元測試模塊(kut—mod )的test—foo函數用于對與被測模塊mod中foo 單元的每個被測函數(如foo_bar, foo—baz等)相應的單元測試模塊中的單 元頂'J試函數(test foo bar等)依次調用kunit run, 然而,test foo函數被單 元測試模塊的入口函數(kut_mod_init)調用。參見如圖2所示的各函數之間 的調用關系。
圖中test—foo—bar函數分別用kunit—assert來斷言foo—bar各種測試用例的 結果。
最后通過kunit—result函數,遍歷內部的鏈表或其它數據結構,輸出各結 點上保存的結果信息。輸出信息可以顯示在屏幕,內核日志文件或者遠端機器上。
在步驟S304,建立并實現單元測試模塊kut_mod。 kut—mod包括入口函 凄丈kut—mod—init函凄t和test—foo函數。kut—mod—init函凄i是單元測試才莫塊的入口函數。test—foo函數對每個單元測試函數依次調用kunit—mn,并且test—foo 函數被kut—mod一init函數調用。
在步驟S305,分別將KUnit框架和kut—mod編譯為kunit.ko和 kut—mod.ko,并且使用insmod命令將其加載到內核空間。因為KUnit框架被 編譯為一個獨立的內核模塊,在該內核模塊中,用EXPORT—SYMBOL宏導 出kunit_assert, kunit—run, kunit—result符號,并將KUnit才匡架編譯為kunit.ko。 在一導kunit.ko禾口 kut—mod.ko力口載至li內#亥空間日于,先力口載kunit.ko,再力口載 kut—mod.ko 。
然后,在步驟S306,在加載kut—mod.ko的同時啟動入口函數kut—mod—init 從而進行自動化的內核單元測試,并輸出結果。
根據本發明的Linux內核級單元測試方法能夠有效地對內核中的被測模 塊進行自動化的單元測試。
盡管已經參照本發明的特定的示例性實施例顯示和描述了本發明,但本 領域的技術人員應該理解,在不脫離由權利要求限定的本發明的精神和范圍 的情況下,可以對其進行各種形式和細節的變形。
9
權利要求
1、一種Linux內核級單元測試的方法,包括編譯被測模塊,并將編譯后的被測模塊加載到內核空間;建立并實現內核級單元測試框架;建立并實現單元測試模塊;將內核級單元測試框架連同單元測試模塊一起編譯,并且將編譯后的模塊加載到內核空間;以及輸出單元測試結果。
2、 如權利要求l所述的方法,其中,建立內核級單元測試框架包括實現內核空間斷言、實現調用單元測試函數的方法以及實現單元測試結果的收集、管理和輸出。
3、 如權利要求2所述的方法,其中,實現調用單元測試函數的方法包括調用單元測試函數,收集單元測試函數執行的結果,并且將該結果保存在數據結構中。
4、 如權利要求3所述的方法,其中,所述結果的信息至少包含單元測試函數名、ID、測試成功與否、失敗時的斷言錯誤信息等。
5、 如權利要求2所述的方法,其中,實現單元測試結果的收集、管理和輸出包括遍歷內部的鏈表或其它數據結構,并且輸出各結點上保存的結果信息。
6、 如權利要求1所述的方法,其中,所述單元測試模塊包括入口函數kut—mod—init和對每個單元測試函數依次調用實現調用單元測試函數的方法的函數test_foo,其中,入口函數kut_mod—init調用test—foo。
7、 一種Linux內核級單元測試的方法,包括編譯被測模塊,并將編譯后的被測模塊加載到內核空間;建立并實現內核級單元測試框架;建立并實現單元測試模塊;分別編譯內核級單元測試框架和單元測試模塊,并且先將編譯后的內核級單元測試框架加載到內核空間,再將編譯后的單元測試模塊加載到內核空間;以及輸出單元測試結果。
8、 如權利要求7所述的方法,其中,建立內核級單元測試框架包括實現內核空間斷言、實現調用單元測試函數的方法以及實現單元測試結果的收集、管理和輸出。
9、 如權利要求8所述的方法,其中,實現調用單元測試函數的方法包括調用單元測試函數,收集單元測試函數執行的結果,并且將該結果保存在數據結構中。
10、 如權利要求9所述的方法,其中,所述結果的信息至少包含單元測試函數名、ID、測試成功與否、失敗時的斷言錯誤信息等。
11、 如權利要求8所述的方法,其中,實現單元測試結果的收集、管理和輸出包括遍歷內部的鏈表或其它數據結構,并且輸出各結點上保存的結果信息。
12、 如權利要求7所述的方法,其中,所述單元測試模塊包括入口函數kut—mod—init和對每個單元測試函數依次調用實現調用單元測試函數的方法的函數test—foo,其中,入口函數kut mod init調用test foo。
全文摘要
提供一種Linux內核級單元測試的方法,包括編譯被測模塊,并將編譯后的被測模塊加載到內核空間;建立并實現內核級單元測試框架;建立并實現單元測試模塊;將內核級單元測試框架連同單元測試模塊一起編譯,并且將編譯后的模塊加載到內核空間;以及輸出單元測試結果。
文檔編號G06F11/36GK101634965SQ20081013408
公開日2010年1月27日 申請日期2008年7月24日 優先權日2008年7月24日
發明者石 王, 王儀科, 理素霞, 晨 紀, 姝 譚, 邱龍斌 申請人:三星電子(中國)研發中心;三星電子株式會社