KUnit - Linux 内核单元测试

本节详细介绍内核单元测试框架。

简介

KUnit(内核单元测试框架)为 Linux 内核中的单元测试提供了一个通用框架。 使用 KUnit,您可以定义称为测试套件的测试用例组。 这些测试要么在内核启动时运行(如果已内置),要么作为模块加载。 KUnit 会自动标记并报告内核日志中失败的测试用例。 测试结果以 KTAP(内核 - 测试协议)格式显示。 它受到 JUnit、Python 的 unittest.mock 和 GoogleTest/GoogleMock(C++ 单元测试框架)的启发。

KUnit 测试是内核的一部分,用 C(编程)语言编写,并测试内核实现的各个部分(例如:一个 C 语言函数)。 从调用到完成,不包括构建时间,KUnit 可以在不到 10 秒的时间内运行大约 100 个测试。 KUnit 可以测试任何内核组件,例如:文件系统、系统调用、内存管理、设备驱动程序等。

KUnit 遵循白盒测试方法。 该测试可以访问内部系统功能。 KUnit 在内核空间中运行,并且不限于暴露给用户空间的内容。

此外,KUnit 还有一个 kunit_tool 脚本(tools/testing/kunit/kunit.py),它可以配置 Linux 内核,在 QEMU 或 UML(用户模式 Linux)下运行 KUnit 测试,解析测试结果,并以用户友好的方式显示它们。

特点

  • 提供用于编写单元测试的框架。

  • 在任何内核架构上运行测试。

  • 在几毫秒内运行测试。

先决条件

  • 任何与 Linux 内核兼容的硬件。

  • 对于被测内核,Linux 内核版本 5.5 或更高版本。

单元测试

单元测试会隔离地测试单个代码单元。 单元测试是测试的最精细粒度,允许测试被测代码中的所有可能的代码路径。 如果被测代码很小并且没有任何测试控制之外的外部依赖项(如硬件),则这是可能的。

编写单元测试

要编写好的单元测试,有一个简单而强大的模式:Arrange-Act-Assert(安排-执行-断言)。 这是一种构建测试用例的好方法,并定义了操作顺序。

  • 安排输入和目标:在测试开始时,安排允许函数工作的数据。 示例:初始化语句或对象。

  • 对目标行为执行操作:调用您的函数/被测代码。

  • 断言预期结果:验证结果(或最终状态)是否符合预期。

单元测试优势

  • 从长远来看,提高测试速度和开发速度。

  • 在初始阶段检测到错误,因此与验收测试相比,降低了错误修复成本。

  • 提高代码质量。

  • 鼓励编写可测试的代码。

另请阅读 单元测试与其他类型的测试有什么区别?

如何使用它?

您可以在 入门 中找到编写和运行 KUnit 测试的逐步指南。

或者,您可以随意浏览 KUnit 文档的其余部分,或者试验 tools/testing/kunit/kunit.py 和 lib/kunit/kunit-example-test.c 下的示例测试

测试愉快!