1.. SPDX-License-Identifier: GPL-2.0 2 3========================================= 4KUnit - Unit Testing for the Linux Kernel 5========================================= 6 7.. toctree:: 8 :maxdepth: 2 9 10 start 11 usage 12 api/index 13 faq 14 15What is KUnit? 16============== 17 18KUnit is a lightweight unit testing and mocking framework for the Linux kernel. 19These tests are able to be run locally on a developer's workstation without a VM 20or special hardware. 21 22KUnit is heavily inspired by JUnit, Python's unittest.mock, and 23Googletest/Googlemock for C++. KUnit provides facilities for defining unit test 24cases, grouping related test cases into test suites, providing common 25infrastructure for running tests, and much more. 26 27Get started now: :doc:`start` 28 29Why KUnit? 30========== 31 32A unit test is supposed to test a single unit of code in isolation, hence the 33name. A unit test should be the finest granularity of testing and as such should 34allow all possible code paths to be tested in the code under test; this is only 35possible if the code under test is very small and does not have any external 36dependencies outside of the test's control like hardware. 37 38Outside of KUnit, there are no testing frameworks currently 39available for the kernel that do not require installing the kernel on a test 40machine or in a VM and all require tests to be written in userspace running on 41the kernel; this is true for Autotest, and kselftest, disqualifying 42any of them from being considered unit testing frameworks. 43 44KUnit addresses the problem of being able to run tests without needing a virtual 45machine or actual hardware with User Mode Linux. User Mode Linux is a Linux 46architecture, like ARM or x86; however, unlike other architectures it compiles 47to a standalone program that can be run like any other program directly inside 48of a host operating system; to be clear, it does not require any virtualization 49support; it is just a regular program. 50 51KUnit is fast. Excluding build time, from invocation to completion KUnit can run 52several dozen tests in only 10 to 20 seconds; this might not sound like a big 53deal to some people, but having such fast and easy to run tests fundamentally 54changes the way you go about testing and even writing code in the first place. 55Linus himself said in his `git talk at Google 56<https://gist.github.com/lorn/1272686/revisions#diff-53c65572127855f1b003db4064a94573R874>`_: 57 58 "... a lot of people seem to think that performance is about doing the 59 same thing, just doing it faster, and that is not true. That is not what 60 performance is all about. If you can do something really fast, really 61 well, people will start using it differently." 62 63In this context Linus was talking about branching and merging, 64but this point also applies to testing. If your tests are slow, unreliable, are 65difficult to write, and require a special setup or special hardware to run, 66then you wait a lot longer to write tests, and you wait a lot longer to run 67tests; this means that tests are likely to break, unlikely to test a lot of 68things, and are unlikely to be rerun once they pass. If your tests are really 69fast, you run them all the time, every time you make a change, and every time 70someone sends you some code. Why trust that someone ran all their tests 71correctly on every change when you can just run them yourself in less time than 72it takes to read their test log? 73 74How do I use it? 75================ 76 77* :doc:`start` - for new users of KUnit 78* :doc:`usage` - for a more detailed explanation of KUnit features 79* :doc:`api/index` - for the list of KUnit APIs used for testing 80