2019-09-23 17:02:45 +08:00
|
|
|
|
.. SPDX-License-Identifier: GPL-2.0
|
|
|
|
|
|
2021-12-17 12:49:05 +08:00
|
|
|
|
=================================
|
|
|
|
|
KUnit - Linux Kernel Unit Testing
|
|
|
|
|
=================================
|
2019-09-23 17:02:45 +08:00
|
|
|
|
|
|
|
|
|
.. toctree::
|
|
|
|
|
:maxdepth: 2
|
2021-12-17 12:49:05 +08:00
|
|
|
|
:caption: Contents:
|
2019-09-23 17:02:45 +08:00
|
|
|
|
|
|
|
|
|
start
|
2021-12-17 12:49:07 +08:00
|
|
|
|
architecture
|
2021-12-17 12:49:08 +08:00
|
|
|
|
run_wrapper
|
|
|
|
|
run_manual
|
2019-09-23 17:02:45 +08:00
|
|
|
|
usage
|
|
|
|
|
api/index
|
2020-09-11 12:24:04 +08:00
|
|
|
|
style
|
2019-09-23 17:02:45 +08:00
|
|
|
|
faq
|
2021-04-15 06:22:56 +08:00
|
|
|
|
running_tips
|
2019-09-23 17:02:45 +08:00
|
|
|
|
|
2021-12-17 12:49:05 +08:00
|
|
|
|
This section details the kernel unit testing framework.
|
|
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
|
============
|
|
|
|
|
|
|
|
|
|
KUnit (Kernel unit testing framework) provides a common framework for
|
|
|
|
|
unit tests within the Linux kernel. Using KUnit, you can define groups
|
|
|
|
|
of test cases called test suites. The tests either run on kernel boot
|
|
|
|
|
if built-in, or load as a module. KUnit automatically flags and reports
|
2022-08-22 10:26:44 +08:00
|
|
|
|
failed test cases in the kernel log. The test results appear in
|
|
|
|
|
:doc:`KTAP (Kernel - Test Anything Protocol) format</dev-tools/ktap>`.
|
|
|
|
|
It is inspired by JUnit, Python’s unittest.mock, and GoogleTest/GoogleMock
|
|
|
|
|
(C++ unit testing framework).
|
2021-12-17 12:49:05 +08:00
|
|
|
|
|
|
|
|
|
KUnit tests are part of the kernel, written in the C (programming)
|
|
|
|
|
language, and test parts of the Kernel implementation (example: a C
|
|
|
|
|
language function). Excluding build time, from invocation to
|
|
|
|
|
completion, KUnit can run around 100 tests in less than 10 seconds.
|
|
|
|
|
KUnit can test any kernel component, for example: file system, system
|
|
|
|
|
calls, memory management, device drivers and so on.
|
|
|
|
|
|
|
|
|
|
KUnit follows the white-box testing approach. The test has access to
|
|
|
|
|
internal system functionality. KUnit runs in kernel space and is not
|
|
|
|
|
restricted to things exposed to user-space.
|
|
|
|
|
|
|
|
|
|
In addition, KUnit has kunit_tool, a script (``tools/testing/kunit/kunit.py``)
|
2022-08-22 10:26:44 +08:00
|
|
|
|
that configures the Linux kernel, runs KUnit tests under QEMU or UML
|
|
|
|
|
(:doc:`User Mode Linux </virt/uml/user_mode_linux_howto_v2>`),
|
|
|
|
|
parses the test results and
|
2021-12-17 12:49:05 +08:00
|
|
|
|
displays them in a user friendly manner.
|
|
|
|
|
|
|
|
|
|
Features
|
|
|
|
|
--------
|
|
|
|
|
|
|
|
|
|
- Provides a framework for writing unit tests.
|
|
|
|
|
- Runs tests on any kernel architecture.
|
|
|
|
|
- Runs a test in milliseconds.
|
|
|
|
|
|
|
|
|
|
Prerequisites
|
|
|
|
|
-------------
|
|
|
|
|
|
|
|
|
|
- Any Linux kernel compatible hardware.
|
|
|
|
|
- For Kernel under test, Linux kernel version 5.5 or greater.
|
|
|
|
|
|
|
|
|
|
Unit Testing
|
|
|
|
|
============
|
|
|
|
|
|
|
|
|
|
A unit test tests a single unit of code in isolation. A unit test is the finest
|
|
|
|
|
granularity of testing and allows all possible code paths to be tested in the
|
|
|
|
|
code under test. This is possible if the code under test is small and does not
|
|
|
|
|
have any external dependencies outside of the test's control like hardware.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Write Unit Tests
|
|
|
|
|
----------------
|
|
|
|
|
|
|
|
|
|
To write good unit tests, there is a simple but powerful pattern:
|
|
|
|
|
Arrange-Act-Assert. This is a great way to structure test cases and
|
|
|
|
|
defines an order of operations.
|
|
|
|
|
|
|
|
|
|
- Arrange inputs and targets: At the start of the test, arrange the data
|
|
|
|
|
that allows a function to work. Example: initialize a statement or
|
|
|
|
|
object.
|
|
|
|
|
- Act on the target behavior: Call your function/code under test.
|
|
|
|
|
- Assert expected outcome: Verify that the result (or resulting state) is as
|
|
|
|
|
expected.
|
|
|
|
|
|
|
|
|
|
Unit Testing Advantages
|
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
|
|
- Increases testing speed and development in the long run.
|
|
|
|
|
- Detects bugs at initial stage and therefore decreases bug fix cost
|
|
|
|
|
compared to acceptance testing.
|
|
|
|
|
- Improves code quality.
|
|
|
|
|
- Encourages writing testable code.
|
2019-09-23 17:02:45 +08:00
|
|
|
|
|
2022-08-13 12:20:55 +08:00
|
|
|
|
Read also :ref:`kinds-of-tests`.
|
|
|
|
|
|
2019-09-23 17:02:45 +08:00
|
|
|
|
How do I use it?
|
|
|
|
|
================
|
|
|
|
|
|
2022-12-07 12:33:19 +08:00
|
|
|
|
You can find a step-by-step guide to writing and running KUnit tests in
|
|
|
|
|
Documentation/dev-tools/kunit/start.rst
|
|
|
|
|
|
|
|
|
|
Alternatively, feel free to look through the rest of the KUnit documentation,
|
|
|
|
|
or to experiment with tools/testing/kunit/kunit.py and the example test under
|
|
|
|
|
lib/kunit/kunit-example-test.c
|
|
|
|
|
|
|
|
|
|
Happy testing!
|