无需 kunit_tool 运行测试

如果我们不想使用 kunit_tool(例如:我们想与其他系统集成,或者在真实硬件上运行测试),我们可以在任何内核中包含 KUnit,读取结果并手动解析。

注意

KUnit 不适合在生产系统中使用。测试可能会降低系统的稳定性或安全性。

配置内核

KUnit 测试可以在没有 kunit_tool 的情况下运行。如果出现以下情况,这将非常有用:

  • 我们有现有的内核配置要测试。

  • 需要在真实硬件上运行(或者使用 kunit_tool 不支持的模拟器/VM)。

  • 希望与一些现有的测试系统集成。

KUnit 使用 CONFIG_KUNIT 选项进行配置,并且可以通过在我们的 .config 中启用它们的配置选项来构建单独的测试。KUnit 测试通常(但并非总是)具有以 _KUNIT_TEST 结尾的配置选项。大多数测试可以构建为模块,也可以构建到内核中。

注意

我们可以启用 KUNIT_ALL_TESTS 配置选项以自动启用所有满足依赖关系的测试。这是快速测试适用于当前配置的所有内容的好方法。

一旦我们构建了内核(和/或模块),运行测试就很简单了。如果测试是内置的,它们将在内核启动时自动运行。结果将以 TAP 格式写入内核日志 ( dmesg )。

如果测试构建为模块,它们将在加载模块时运行。

# modprobe example-test

结果将以 TAP 格式出现在 dmesg 中。

debugfs

可以通过 debugfs 文件系统从用户空间访问 KUnit(有关 debugfs 的更多信息,请参阅DebugFS)。

如果启用了 CONFIG_KUNIT_DEBUGFS,则 KUnit debugfs 文件系统会挂载在 /sys/kernel/debug/kunit 下。您可以使用此文件系统执行以下操作。

检索测试结果

您可以使用 debugfs 来检索 KUnit 测试结果。可以从 debugfs 文件系统中以下只读文件访问测试结果

/sys/kernel/debug/kunit/<test_suite>/results

测试结果以 KTAP 文档的形式打印。请注意,此文档与内核日志是分开的,因此,可能具有不同的测试套件编号。

内核启动后运行测试

您可以使用 debugfs 文件系统来触发内置测试在启动后运行。要运行测试套件,您可以使用以下命令写入 /sys/kernel/debug/kunit/<test_suite>/run 文件

echo "any string" > /sys/kernel/debugfs/kunit/<test_suite>/run

结果,测试套件运行,结果将打印到内核日志。

但是,此功能不适用于使用 init 数据的 KUnit 套件,因为 init 数据可能在内核启动后被丢弃。使用 init 数据的 KUnit 套件应使用 kunit_test_init_section_suites() 宏来定义。

此外,您不能使用此功能来并发运行测试。相反,一个测试将等待运行,直到其他测试完成或失败。

注意

对于测试作者来说,要使用此功能,测试将需要正确初始化和/或清理任何数据,以便测试第二次正确运行。