Documentation: kunit: Make the KUnit documentation less UML-specific

Remove some of the outmoded "Why KUnit" rationale, and move some
UML-specific information to the kunit_tool page. Also update the Getting
Started guide to mention running tests without the kunit_tool wrapper.

Signed-off-by: David Gow <davidgow@google.com>
Reviewed-by: Frank Rowand <frank.rowand@sony.com>
Acked-by: Shuah Khan <skhan@linuxfoundation.org>
Reviewed-by: Brendan Higgins <brendanhiggins@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
This commit is contained in:
David Gow 2020-02-28 11:18:21 -08:00 committed by Shuah Khan
parent cb88577bb6
commit 0d5792c9bc
3 changed files with 98 additions and 27 deletions

View File

@ -17,14 +17,23 @@ What is KUnit?
============== ==============
KUnit is a lightweight unit testing and mocking framework for the Linux kernel. KUnit is a lightweight unit testing and mocking framework for the Linux kernel.
These tests are able to be run locally on a developer's workstation without a VM
or special hardware.
KUnit is heavily inspired by JUnit, Python's unittest.mock, and KUnit is heavily inspired by JUnit, Python's unittest.mock, and
Googletest/Googlemock for C++. KUnit provides facilities for defining unit test Googletest/Googlemock for C++. KUnit provides facilities for defining unit test
cases, grouping related test cases into test suites, providing common cases, grouping related test cases into test suites, providing common
infrastructure for running tests, and much more. infrastructure for running tests, and much more.
KUnit consists of a kernel component, which provides a set of macros for easily
writing unit tests. Tests written against KUnit will run on kernel boot if
built-in, or when loaded if built as a module. These tests write out results to
the kernel log in `TAP <https://testanything.org/>`_ format.
To make running these tests (and reading the results) easier, KUnit offers
:doc:`kunit_tool <kunit-tool>`, which builds a `User Mode Linux
<http://user-mode-linux.sourceforge.net>`_ kernel, runs it, and parses the test
results. This provides a quick way of running KUnit tests during development,
without requiring a virtual machine or separate hardware.
Get started now: :doc:`start` Get started now: :doc:`start`
Why KUnit? Why KUnit?
@ -36,21 +45,20 @@ allow all possible code paths to be tested in the code under test; this is only
possible if the code under test is very small and does not have any external possible if the code under test is very small and does not have any external
dependencies outside of the test's control like hardware. dependencies outside of the test's control like hardware.
Outside of KUnit, there are no testing frameworks currently KUnit provides a common framework for unit tests within the kernel.
available for the kernel that do not require installing the kernel on a test
machine or in a VM and all require tests to be written in userspace running on
the kernel; this is true for Autotest, and kselftest, disqualifying
any of them from being considered unit testing frameworks.
KUnit addresses the problem of being able to run tests without needing a virtual KUnit tests can be run on most architectures, and most tests are architecture
machine or actual hardware with User Mode Linux. User Mode Linux is a Linux independent. All built-in KUnit tests run on kernel startup. Alternatively,
architecture, like ARM or x86; however, unlike other architectures it compiles KUnit and KUnit tests can be built as modules and tests will run when the test
to a standalone program that can be run like any other program directly inside module is loaded.
of a host operating system; to be clear, it does not require any virtualization
support; it is just a regular program.
Alternatively, kunit and kunit tests can be built as modules and tests will .. note::
run when the test module is loaded.
KUnit can also run tests without needing a virtual machine or actual
hardware under User Mode Linux. User Mode Linux is a Linux architecture,
like ARM or x86, which compiles the kernel as a Linux executable. KUnit
can be used with UML either by building with ``ARCH=um`` (like any other
architecture), or by using :doc:`kunit_tool <kunit-tool>`.
KUnit is fast. Excluding build time, from invocation to completion KUnit can run KUnit is fast. Excluding build time, from invocation to completion KUnit can run
several dozen tests in only 10 to 20 seconds; this might not sound like a big several dozen tests in only 10 to 20 seconds; this might not sound like a big
@ -81,3 +89,5 @@ How do I use it?
* :doc:`start` - for new users of KUnit * :doc:`start` - for new users of KUnit
* :doc:`usage` - for a more detailed explanation of KUnit features * :doc:`usage` - for a more detailed explanation of KUnit features
* :doc:`api/index` - for the list of KUnit APIs used for testing * :doc:`api/index` - for the list of KUnit APIs used for testing
* :doc:`kunit-tool` - for more information on the kunit_tool helper script
* :doc:`faq` - for answers to some common questions about KUnit

View File

@ -12,6 +12,13 @@ the Linux kernel as UML (`User Mode Linux
<http://user-mode-linux.sourceforge.net/>`_), running KUnit tests, parsing <http://user-mode-linux.sourceforge.net/>`_), running KUnit tests, parsing
the test results and displaying them in a user friendly manner. the test results and displaying them in a user friendly manner.
kunit_tool addresses the problem of being able to run tests without needing a
virtual machine or actual hardware with User Mode Linux. User Mode Linux is a
Linux architecture, like ARM or x86; however, unlike other architectures it
compiles the kernel as a standalone Linux executable that can be run like any
other program directly inside of a host operating system. To be clear, it does
not require any virtualization support: it is just a regular program.
What is a kunitconfig? What is a kunitconfig?
====================== ======================

View File

@ -9,11 +9,10 @@ Installing dependencies
KUnit has the same dependencies as the Linux kernel. As long as you can build KUnit has the same dependencies as the Linux kernel. As long as you can build
the kernel, you can run KUnit. the kernel, you can run KUnit.
KUnit Wrapper Running tests with the KUnit Wrapper
============= ====================================
Included with KUnit is a simple Python wrapper that helps format the output to Included with KUnit is a simple Python wrapper which runs tests under User Mode
easily use and read KUnit output. It handles building and running the kernel, as Linux, and formats the test results.
well as formatting the output.
The wrapper can be run with: The wrapper can be run with:
@ -21,22 +20,42 @@ The wrapper can be run with:
./tools/testing/kunit/kunit.py run --defconfig ./tools/testing/kunit/kunit.py run --defconfig
For more information on this wrapper (also called kunit_tool) checkout the For more information on this wrapper (also called kunit_tool) check out the
:doc:`kunit-tool` page. :doc:`kunit-tool` page.
Creating a .kunitconfig Creating a .kunitconfig
======================= -----------------------
The Python script is a thin wrapper around Kbuild. As such, it needs to be If you want to run a specific set of tests (rather than those listed in the
configured with a ``.kunitconfig`` file. This file essentially contains the KUnit defconfig), you can provide Kconfig options in the ``.kunitconfig`` file.
regular Kernel config, with the specific test targets as well. This file essentially contains the regular Kernel config, with the specific
test targets as well. The ``.kunitconfig`` should also contain any other config
options required by the tests.
A good starting point for a ``.kunitconfig`` is the KUnit defconfig:
.. code-block:: bash .. code-block:: bash
cd $PATH_TO_LINUX_REPO cd $PATH_TO_LINUX_REPO
cp arch/um/configs/kunit_defconfig .kunitconfig cp arch/um/configs/kunit_defconfig .kunitconfig
Verifying KUnit Works You can then add any other Kconfig options you wish, e.g.:
--------------------- .. code-block:: none
CONFIG_LIST_KUNIT_TEST=y
:doc:`kunit_tool <kunit-tool>` will ensure that all config options set in
``.kunitconfig`` are set in the kernel ``.config`` before running the tests.
It'll warn you if you haven't included the dependencies of the options you're
using.
.. note::
Note that removing something from the ``.kunitconfig`` will not trigger a
rebuild of the ``.config`` file: the configuration is only updated if the
``.kunitconfig`` is not a subset of ``.config``. This means that you can use
other tools (such as make menuconfig) to adjust other config options.
Running the tests
-----------------
To make sure that everything is set up correctly, simply invoke the Python To make sure that everything is set up correctly, simply invoke the Python
wrapper from your kernel repo: wrapper from your kernel repo:
@ -62,6 +81,41 @@ followed by a list of tests that are run. All of them should be passing.
Because it is building a lot of sources for the first time, the Because it is building a lot of sources for the first time, the
``Building KUnit kernel`` step may take a while. ``Building KUnit kernel`` step may take a while.
Running tests without the KUnit Wrapper
=======================================
If you'd rather not use the KUnit Wrapper (if, for example, you need to
integrate with other systems, or use an architecture other than UML), KUnit can
be included in any kernel, and the results read out and parsed manually.
.. note::
KUnit is not designed for use in a production system, and it's possible that
tests may reduce the stability or security of the system.
Configuring the kernel
----------------------
In order to enable KUnit itself, you simply need to enable the ``CONFIG_KUNIT``
Kconfig option (it's under Kernel Hacking/Kernel Testing and Coverage in
menuconfig). From there, you can enable any KUnit tests you want: they usually
have config options ending in ``_KUNIT_TEST``.
KUnit and KUnit tests can be compiled as modules: in this case the tests in a
module will be run when the module is loaded.
Running the tests
-----------------
Build and run your kernel as usual. Test output will be written to the kernel
log in `TAP <https://testanything.org/>`_ format.
.. note::
It's possible that there will be other lines and/or data interspersed in the
TAP output.
Writing your first test Writing your first test
======================= =======================