| .. KUnit documentation master file, created by |
| sphinx-quickstart on Mon Aug 26 16:07:42 2019. |
| You can adapt this file completely to your liking, but it should at least |
| contain the root `toctree` directive. |
| |
| ===== |
| KUnit |
| ===== |
| |
| .. toctree:: |
| :maxdepth: 2 |
| :caption: Contents: |
| |
| usage/index |
| development/index |
| third_party/kernel/index.rst |
| third_party/stable_kernel/index.rst |
| release_notes |
| mocking |
| press |
| |
| What is KUnit? |
| ============== |
| |
| KUnit is a lightweight unit testing 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 |
| Googletest/Googlemock for C++. KUnit provides facilities for defining unit test |
| cases, grouping related test cases into test suites, providing common |
| infrastructure for running tests, and more. |
| |
| Get started now: :doc:`usage/index` |
| |
| Who is it for? |
| ============== |
| |
| If you work on the Linux kernel, then KUnit is for you. |
| |
| Why unit test the kernel? |
| ========================= |
| |
| The first question is, "why write unit tests in the first place?" |
| |
| A unit test is a test focused on testing a small "unit" of code. This is |
| usually on the level of a few functions at most. Unit tests try to avoid |
| external dependencies like hardware and/or stub them out where possible. |
| |
| This ideally makes unit tests more stable, faster, and easier to debug when |
| they fail. |
| |
| In-kernel testing |
| ----------------- |
| |
| .. note:: |
| In our case, "unit test" implies in-kernel test code. It's not really possible |
| to be a "unit test" if you're relying on a kernel working enough to have a |
| functional userspace on top of it. |
| |
| For internal libraries (e.g. ``include/linux/list.h``), there's no good way to |
| test from userspace. It's *far* easier to write in-kernel code to test these. |
| That are some tests that make this work, but if you're starting from scratch, |
| just use KUnit. |
| |
| For code with a user facing component, you'll want some tests in userspace. |
| But it can be useful to have unit tests as well. For example, it can be hard to |
| trigger certain code paths from userspace, particularly error paths. |
| Furthermore, it's probably much faster and more hermetic to build and run the |
| tests under KUnit instead of booting a machine and waiting for all the needed |
| userspace processes to come up. |
| |
| Why KUnit? |
| ========== |
| |
| KUnit provides a library to help making writing tests easy: including making |
| assertions, setting up and cleaning up test resources, and more. |
| It also provides a `python script <third_party/kernel/docs/kunit-tool.html>`__ |
| to make building and running tests easy. |
| |
| kselftest has a way of writing unit tests as kernel modules via the helpers in |
| ``tools/testing/selftests/kselftest_module.h``. But this requires more |
| boilerplate scattered across several files and potentially several directories. |
| |
| UML |
| --- |
| |
| KUnit is 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 to a standalone program 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. User Mode Linux is |
| fast: on my desktop it boots to init process in under a second. |
| |
| The provided tooling (``tools/testing/kunit/kunit.py``) mainly works with UML, |
| but you can use KUnit manually on different architectures, if wanted. See `here |
| <third_party/kernel/docs/start.html>`__ for more details. |
| |
| How do I use it? |
| ================ |
| |
| - :doc:`usage/index` - for new users of KUnit |
| - For upstream KUnit: |
| - `Usage <third_party/kernel/docs/usage.html>`__ - for a more detailed explanation of KUnit features |
| - `API <third_party/kernel/docs/api>`__ - for the list of KUnit APIs used for testing |
| |
| Where do I get it? |
| ================== |
| |
| - Upstream: https://www.kernel.org/ (version 5.5 or later) |
| - Deprecated version: https://kunit.googlesource.com/linux/+/kunit/alpha/master |
| |
| Connect with us |
| =============== |
| |
| - Mailing List: kunit-dev@googlegroups.com |
| - Google Groups (web interface for above): https://groups.google.com/forum/#!forum/kunit-dev |
| - IRC: #kunit on oftc.net |
| - Riot: `#kunit:matrix.org <https://riot.im/app/#/room/#_oftc_#kunit:matrix.org>`_ |
| |
| Contributing |
| ============ |
| |
| If you want to contribute to KUnit in the Linux kernel (which is just the same |
| as contributing to the Linux kernel, please see `the Linux kernel's guide on |
| contributing |
| <https://www.kernel.org/doc/html/latest/#introduction-to-kernel-development>`_. |
| |
| For other KUnit repositories (CI/CD, vim plugin, etc), please see |
| :download:`CONTRIBUTING.md <CONTRIBUTING.md>`. |
| |
| In all cases, you will also want to take a look at :doc:`development/index`. |