常见问题解答¶
这与 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。