使用 kunit_tool 執行測試

我們可以使用 kunit_tool 執行 KUnit 測試,也可以手動執行測試,然後使用 kunit_tool 來解析結果。要手動執行測試,請參見:不使用 kunit_tool 執行測試。只要我們可以構建核心,就可以執行 KUnit。

kunit_tool 是一個 Python 指令碼,用於配置和構建核心、執行測試以及格式化測試結果。

執行命令

./tools/testing/kunit/kunit.py run

我們應該看到以下內容

Configuring KUnit Kernel ...
Building KUnit kernel...
Starting KUnit kernel...

我們可能想要使用以下選項

./tools/testing/kunit/kunit.py run --timeout=30 --jobs=`nproc --all`
  • --timeout 設定測試執行的最長時間。

  • --jobs 設定構建核心的執行緒數。

如果不存在其他 .kunitconfig 檔案(在構建目錄中),kunit_tool 將生成一個帶有預設配置的 .kunitconfig。此外,它還會驗證生成的 .config 檔案是否包含 .kunitconfig 中的 CONFIG 選項。也可以將單獨的 .kunitconfig 片段傳遞給 kunit_tool。如果我們有幾個不同的測試組要獨立執行,或者我們想要對某些子系統使用預定義的測試配置,這將非常有用。

要使用不同的 .kunitconfig 檔案(例如,為測試特定子系統提供的檔案),請將其作為選項傳遞

./tools/testing/kunit/kunit.py run --kunitconfig=fs/ext4/.kunitconfig

要檢視 kunit_tool 標誌(可選的命令列引數),請執行

./tools/testing/kunit/kunit.py run --help

建立 .kunitconfig 檔案

如果我們想要執行一組特定的測試(而不是 KUnit defconfig 中列出的那些測試),我們可以在 .kunitconfig 檔案中提供 Kconfig 選項。有關預設 .kunitconfig,請參見:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/kunit/configs/default.config.kunitconfig 是一個 minconfig(透過執行 make savedefconfig 生成的 .config),用於執行一組特定的測試。此檔案包含帶有特定測試目標的常規核心配置。.kunitconfig 還包含測試所需的任何其他配置選項(例如:被測功能的依賴項、啟用/停用某些程式碼塊的配置、架構配置等)。

要使用 KUnit defconfig 建立 .kunitconfig,請執行以下操作

cd $PATH_TO_LINUX_REPO
cp tools/testing/kunit/configs/default.config .kunit/.kunitconfig

然後我們可以新增任何其他 Kconfig 選項。例如

CONFIG_LIST_KUNIT_TEST=y

kunit_tool 確保在執行測試之前,核心 .config 中設定了 .kunitconfig 中的所有配置選項。如果我們沒有包含選項依賴項,它會發出警告。

注意

.kunitconfig 中刪除某些內容不會重建 .config file。僅當 .kunitconfig 不是 .config 的子集時,才會更新配置。這意味著我們可以使用其他工具(例如:make menuconfig)來調整其他配置選項。必須設定構建目錄才能使 make menuconfig 正常工作,因此預設情況下使用 make O=.kunit menuconfig

配置、構建和執行測試

如果我們想要手動更改 KUnit 構建過程,我們可以獨立執行 KUnit 構建過程的一部分。從 .kunitconfig 執行 kunit_tool 時,我們可以使用 config 引數生成 .config

./tools/testing/kunit/kunit.py config

要從當前的 .config 構建 KUnit 核心,我們可以使用 build 引數

./tools/testing/kunit/kunit.py build

如果我們已經構建了帶有內建 KUnit 測試的 UML 核心,我們可以執行核心,並使用 exec 引數顯示測試結果

./tools/testing/kunit/kunit.py exec

第 **使用 kunit_tool 執行測試** 節中討論的 run 命令相當於按順序執行上述三個命令。

解析測試結果

KUnit 測試輸出以 TAP(測試協議)格式顯示結果。執行測試時,kunit_tool 會解析此輸出並列印摘要。要以 TAP 格式檢視原始測試結果,我們可以傳遞 --raw_output 引數

./tools/testing/kunit/kunit.py run --raw_output

如果我們有原始 TAP 格式的 KUnit 結果,我們可以解析它們並使用 kunit_tool 的 parse 命令列印人類可讀的摘要。此命令接受一個檔名作為引數,或者從標準輸入讀取。

# Reading from a file
./tools/testing/kunit/kunit.py parse /var/log/dmesg
# Reading from stdin
dmesg | ./tools/testing/kunit/kunit.py parse

過濾測試

透過將 bash 風格的 glob 過濾器傳遞給 execrun 命令,我們可以執行內置於核心中的測試子集。例如:如果我們只想執行 KUnit 資源測試,請使用

./tools/testing/kunit/kunit.py run 'kunit-resource*'

這使用了帶有萬用字元的標準 glob 格式。

在 QEMU 上執行測試

kunit_tool 支援透過 qemu 以及 UML 執行測試。預設情況下,要在 qemu 上執行測試,需要兩個標誌

  • --arch: 選擇一個配置集合(Kconfig、qemu 配置選項等),允許以最小的方式在指定的架構上執行 KUnit 測試。架構引數與 Kbuild 使用的 ARCH 變數傳遞的選項名稱相同。並非所有架構當前都支援此標誌,但我們可以使用 --qemu_config 來處理它。如果傳遞了 um(或者忽略此標誌),測試將透過 UML 執行。非 UML 架構,例如:i386、x86_64、arm 等;在 qemu 上執行。

    --arch help 列出所有有效的 --arch 值。

  • --cross_compile: 指定 Kbuild 工具鏈。它傳遞與 Kbuild 使用的 CROSS_COMPILE 變數相同的引數。作為提醒,這將是工具鏈二進位制檔案(例如 GCC)的字首。例如

    • sparc64-linux-gnu 如果我們的系統上安裝了 sparc 工具鏈。

    • $HOME/toolchains/microblaze/gcc-9.2.0-nolibc/microblaze-linux/bin/microblaze-linux 如果我們從 0-day 網站下載了 microblaze 工具鏈到我們主目錄中名為 toolchains 的目錄。

這意味著對於大多數架構,在 qemu 下執行就像

./tools/testing/kunit/kunit.py run --arch=x86_64

交叉編譯時,我們可能需要指定不同的工具鏈,例如

./tools/testing/kunit/kunit.py run \
        --arch=s390 \
        --cross_compile=s390x-linux-gnu-

如果我們要執行 --arch 標誌不支援的架構上的 KUnit 測試,或者想要使用非預設配置在 qemu 上執行 KUnit 測試;那麼我們可以編寫自己的 ``QemuConfig``。這些 QemuConfigs 是用 Python 編寫的。它們在檔案頂部有一個匯入行 from..qemu_config import QemuArchParams。該檔案必須包含一個名為 QEMU_ARCH 的變數,該變數具有分配給它的 QemuArchParams 例項。請參見以下示例:tools/testing/kunit/qemu_configs/x86_64.py

一旦我們有了 QemuConfig,我們就可以使用 --qemu_config 標誌將其傳遞給 kunit_tool。使用時,此標誌將替換 --arch 標誌。例如:使用 tools/testing/kunit/qemu_configs/x86_64.py,呼叫如下所示

./tools/testing/kunit/kunit.py run \
        --timeout=60 \
        --jobs=12 \
        --qemu_config=./tools/testing/kunit/qemu_configs/x86_64.py

執行命令列引數

kunit_tool 有許多其他命令列引數,這些引數對我們的測試環境很有用。以下是最常用的命令列引數

  • --help: 列出所有可用選項。要列出常用選項,請將 --help 放在命令之前。要列出特定於該命令的選項,請將 --help 放在命令之後。

    注意

    不同的命令(configbuildrun 等)具有不同的支援選項。

  • --build_dir: 指定 kunit_tool 構建目錄。它包括 .kunitconfig.config 檔案和已編譯的核心。

  • --make_options: 指定編譯核心時要傳遞給 make 的其他選項(使用 buildrun 命令)。例如:要啟用編譯器警告,我們可以傳遞 --make_options W=1

  • --alltests: 啟用一組預定義的選項,以便構建儘可能多的測試。

    注意

    可以在 tools/testing/kunit/configs/all_tests.config 中找到已啟用選項的列表。

    如果您只想啟用所有測試以及其他已滿足的依賴項,請改為將 CONFIG_KUNIT_ALL_TESTS=y 新增到您的 .kunitconfig

  • --kunitconfig: 指定 .kunitconfig 檔案的路徑或目錄。例如

    • lib/kunit/.kunitconfig 可以是該檔案的路徑。

    • lib/kunit 可以是該檔案所在的目錄。

    此檔案用於構建和執行一組預定義的測試及其依賴項。例如,執行給定子系統的測試。

  • --kconfig_add: 指定要附加到 .kunitconfig 檔案的其他配置選項。例如

    ./tools/testing/kunit/kunit.py run --kconfig_add CONFIG_KASAN=y
    
  • --arch: 在指定的架構上執行測試。架構引數與 Kbuild ARCH 環境變數相同。例如,i386、x86_64、arm、um 等。非 UML 架構在 qemu 上執行。預設為 *um*。

  • --cross_compile: 指定 Kbuild 工具鏈。它傳遞與 Kbuild 使用的 CROSS_COMPILE 變數相同的引數。這將是工具鏈二進位制檔案(例如 GCC)的字首。例如

    • sparc64-linux-gnu- 如果我們的系統上安裝了 sparc 工具鏈。

    • $HOME/toolchains/microblaze/gcc-9.2.0-nolibc/microblaze-linux/bin/microblaze-linux 如果我們從 0-day 網站下載了 microblaze 工具鏈到我們主目錄中名為 toolchains 的指定路徑。

  • --qemu_config: 指定包含自定義 qemu 架構定義的檔案路徑。這應該是一個包含 QemuArchParams 物件的 python 檔案。

  • --qemu_args: 指定其他 qemu 引數,例如,-smp 8

  • --jobs: 指定要同時執行的作業(命令)數。預設情況下,此值設定為系統上的核心數。

  • --timeout: 指定允許所有測試執行的最長時間(以秒為單位)。這不包括構建測試所花費的時間。

  • --kernel_args: 指定其他核心命令列引數。可以重複。

  • --run_isolated: 如果設定,則為每個單獨的套件/測試啟動核心。這對於除錯非封閉測試很有用,該測試可能會根據之前執行的內容而透過/失敗。

  • --raw_output: 如果設定,則生成來自核心的未格式化輸出。可能的選項有

    • all: 要檢視完整的核心輸出,請使用 --raw_output=all

    • kunit: 這是預設選項,並過濾到 KUnit 輸出。使用 --raw_output--raw_output=kunit

  • --json: 如果設定,則將測試結果儲存為 JSON 格式,並列印到 stdout 或儲存到檔案中(如果指定了檔名)。

  • --filter: 指定對測試屬性的過濾,例如,speed!=slow。可以透過將輸入包裝在引號中並用逗號分隔過濾器來使用多個過濾器。示例:--filter "speed>slow, module=example"

  • --filter_action: 如果設定為 skip,則過濾後的測試將在輸出中顯示為已跳過,而不是不顯示輸出。

  • --list_tests: 如果設定,則列出將要執行的所有測試。

  • --list_tests_attr: 如果設定,則列出將要執行的所有測試及其所有屬性。