| .. SPDX-License-Identifier: GPL-2.0 | |
| ================================= | |
| KUnit - Linux Kernel Unit Testing | |
| ================================= | |
| .. toctree:: | |
| :maxdepth: 2 | |
| :caption: Contents: | |
| start | |
| architecture | |
| run_wrapper | |
| run_manual | |
| usage | |
| api/index | |
| style | |
| faq | |
| running_tips | |
| 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 | |
| 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). | |
| 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``) | |
| 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 | |
| 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. | |
| Read also :ref:`kinds-of-tests`. | |
| How do I use it? | |
| ================ | |
| 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! |