常見問題解答¶
這與 Autotest、kselftest 等有什麼不同?¶
KUnit 是一個單元測試框架。 Autotest、kselftest(以及其他一些)不是。
單元測試 應該孤立地測試單個程式碼單元,因此得名 *單元測試*。 單元測試應該是最精細的測試粒度,並且應該允許在被測程式碼中測試所有可能的程式碼路徑。 只有當被測程式碼很小並且在測試的控制範圍之外沒有任何外部依賴項(如硬體)時,這才有可能。
目前沒有可用於核心的測試框架不需要將核心安裝在測試機器或虛擬機器中。 所有測試框架都要求測試以使用者空間編寫並在被測核心上執行。 Autotest、kselftest 和其他一些也是如此,這使得它們都不被認為是單元測試框架。
KUnit 是否支援在 UML 之外的其他架構上執行?¶
是的,大部分情況下是。
在大多數情況下,KUnit 核心框架(我們用來編寫測試的東西)可以編譯為任何架構。 它的編譯方式就像核心的另一部分一樣,並在核心啟動時或作為模組構建時,在模組載入時執行。 但是,有些基礎設施(例如 KUnit Wrapper (tools/testing/kunit/kunit.py))可能不支援某些架構(請參閱 在 QEMU 上執行測試)。
簡而言之,是的,您可以在其他架構上執行 KUnit,但這可能比在 UML 上使用 KUnit 需要更多的工作。
有關更多資訊,請參閱 為其他架構編寫測試。
單元測試與其他型別的測試有什麼區別?¶
Linux 核心的大多數現有測試都將被歸類為整合測試或端到端測試。
單元測試應該孤立地測試單個程式碼單元。 單元測試應該是最精細的測試粒度,因此,允許在被測程式碼中測試所有可能的程式碼路徑。 只有當被測程式碼很小並且在測試的控制範圍之外沒有任何外部依賴項(如硬體)時,這才有可能。
整合測試測試最小元件集(通常只有兩到三個)之間的互動。 例如,有人可能會編寫一個整合測試來測試驅動程式和硬體之間的互動,或者測試核心提供的使用者空間庫和核心本身之間的互動。 但是,其中一項測試可能不會測試整個核心以及硬體互動和與使用者空間的互動。
端到端測試通常從被測程式碼的角度測試整個系統。 例如,有人可能會透過在生產硬體上使用生產使用者空間安裝核心的生產配置來編寫核心的端到端測試,然後嘗試執行一些依賴於硬體、核心和使用者空間之間互動的行為。
KUnit 無法正常工作,我該怎麼辦?¶
不幸的是,有很多事情可能會中斷,但這裡有一些可以嘗試的事情。
使用
--raw_output引數執行./tools/testing/kunit/kunit.py run。 這可能會顯示 kunit_tool 解析器隱藏的詳細資訊或錯誤訊息。不要執行
kunit.py run,而是嘗試獨立執行kunit.py config、kunit.py build和kunit.py exec。 這可以幫助追蹤問題發生的位置。(如果您認為解析器有問題,您可以針對stdin或檔案手動執行kunit.py parse。)直接執行 UML 核心通常可以顯示
kunit_tool忽略的問題或錯誤訊息。 在構建 UML 核心後,這應該像執行./vmlinux一樣簡單(例如,透過使用kunit.py build)。 請注意,UML 有一些不尋常的要求(例如,主機需要掛載 tmpfs 檔案系統),並且在靜態構建並且主機啟用了 KASLR 時,過去曾出現過問題。(在較舊的主機核心上,您可能需要執行setarch `uname -m` -R ./vmlinux來停用 KASLR。)確保核心 .config 具有
CONFIG_KUNIT=y並且至少有一個測試(例如CONFIG_KUNIT_EXAMPLE_TEST=y)。 kunit_tool 將保留其 .config,因此您可以在執行kunit.py run後檢視使用了哪個配置。 它還會保留您可能進行的任何配置更改,因此您可以使用make ARCH=um menuconfig或類似方法啟用/停用事物,然後重新執行 kunit_tool。嘗試在執行
kunit.py run之前執行make ARCH=um defconfig。 這可能有助於清理任何可能導致問題的剩餘配置項。最後,嘗試在 UML 之外執行 KUnit。 KUnit 和 KUnit 測試可以構建到任何核心中,或者可以構建為模組並在執行時載入。 這樣做應該允許您確定 UML 是否導致您看到的問題。 當測試是內建的時,它們將在核心啟動時執行,模組將在載入時自動執行關聯的測試。 測試結果可以從
/sys/kernel/debug/kunit/<test suite>/results收集,並且可以使用kunit.py parse進行解析。 有關更多詳細資訊,請參閱 在 QEMU 上執行測試。
如果以上技巧都無法幫助您,歡迎您隨時透過電子郵件將任何問題傳送至 kunit-dev@googlegroups.com。