| .. SPDX-License-Identifier: GPL-2.0 |
| |
| =========================== |
| Test Style and Nomenclature |
| =========================== |
| |
| To make finding, writing, and using KUnit tests as simple as possible, it is |
| strongly encouraged that they are named and written according to the guidelines |
| below. While it is possible to write KUnit tests which do not follow these rules, |
| they may break some tooling, may conflict with other tests, and may not be run |
| automatically by testing systems. |
| |
| It is recommended that you only deviate from these guidelines when: |
| |
| 1. Porting tests to KUnit which are already known with an existing name. |
| 2. Writing tests which would cause serious problems if automatically run. For |
| example, non-deterministically producing false positives or negatives, or |
| taking a long time to run. |
| |
| Subsystems, Suites, and Tests |
| ============================= |
| |
| To make tests easy to find, they are grouped into suites and subsystems. A test |
| suite is a group of tests which test a related area of the kernel. A subsystem |
| is a set of test suites which test different parts of a kernel subsystem |
| or a driver. |
| |
| Subsystems |
| ---------- |
| |
| Every test suite must belong to a subsystem. A subsystem is a collection of one |
| or more KUnit test suites which test the same driver or part of the kernel. A |
| test subsystem should match a single kernel module. If the code being tested |
| cannot be compiled as a module, in many cases the subsystem should correspond to |
| a directory in the source tree or an entry in the ``MAINTAINERS`` file. If |
| unsure, follow the conventions set by tests in similar areas. |
| |
| Test subsystems should be named after the code being tested, either after the |
| module (wherever possible), or after the directory or files being tested. Test |
| subsystems should be named to avoid ambiguity where necessary. |
| |
| If a test subsystem name has multiple components, they should be separated by |
| underscores. *Do not* include "test" or "kunit" directly in the subsystem name |
| unless we are actually testing other tests or the kunit framework itself. For |
| example, subsystems could be called: |
| |
| ``ext4`` |
| Matches the module and filesystem name. |
| ``apparmor`` |
| Matches the module name and LSM name. |
| ``kasan`` |
| Common name for the tool, prominent part of the path ``mm/kasan`` |
| ``snd_hda_codec_hdmi`` |
| Has several components (``snd``, ``hda``, ``codec``, ``hdmi``) separated by |
| underscores. Matches the module name. |
| |
| Avoid names as shown in examples below: |
| |
| ``linear-ranges`` |
| Names should use underscores, not dashes, to separate words. Prefer |
| ``linear_ranges``. |
| ``qos-kunit-test`` |
| This name should use underscores, and not have "kunit-test" as a |
| suffix. ``qos`` is also ambiguous as a subsystem name, because several parts |
| of the kernel have a ``qos`` subsystem. ``power_qos`` would be a better name. |
| ``pc_parallel_port`` |
| The corresponding module name is ``parport_pc``, so this subsystem should also |
| be named ``parport_pc``. |
| |
| .. note:: |
| The KUnit API and tools do not explicitly know about subsystems. They are |
| a way of categorizing test suites and naming modules which provides a |
| simple, consistent way for humans to find and run tests. This may change |
| in the future. |
| |
| Suites |
| ------ |
| |
| KUnit tests are grouped into test suites, which cover a specific area of |
| functionality being tested. Test suites can have shared initialization and |
| shutdown code which is run for all tests in the suite. Not all subsystems need |
| to be split into multiple test suites (for example, simple drivers). |
| |
| Test suites are named after the subsystem they are part of. If a subsystem |
| contains several suites, the specific area under test should be appended to the |
| subsystem name, separated by an underscore. |
| |
| In the event that there are multiple types of test using KUnit within a |
| subsystem (for example, both unit tests and integration tests), they should be |
| put into separate suites, with the type of test as the last element in the suite |
| name. Unless these tests are actually present, avoid using ``_test``, ``_unittest`` |
| or similar in the suite name. |
| |
| The full test suite name (including the subsystem name) should be specified as |
| the ``.name`` member of the ``kunit_suite`` struct, and forms the base for the |
| module name. For example, test suites could include: |
| |
| ``ext4_inode`` |
| Part of the ``ext4`` subsystem, testing the ``inode`` area. |
| ``kunit_try_catch`` |
| Part of the ``kunit`` implementation itself, testing the ``try_catch`` area. |
| ``apparmor_property_entry`` |
| Part of the ``apparmor`` subsystem, testing the ``property_entry`` area. |
| ``kasan`` |
| The ``kasan`` subsystem has only one suite, so the suite name is the same as |
| the subsystem name. |
| |
| Avoid names, for example: |
| |
| ``ext4_ext4_inode`` |
| There is no reason to state the subsystem twice. |
| ``property_entry`` |
| The suite name is ambiguous without the subsystem name. |
| ``kasan_integration_test`` |
| Because there is only one suite in the ``kasan`` subsystem, the suite should |
| just be called as ``kasan``. Do not redundantly add |
| ``integration_test``. It should be a separate test suite. For example, if the |
| unit tests are added, then that suite could be named as ``kasan_unittest`` or |
| similar. |
| |
| Test Cases |
| ---------- |
| |
| Individual tests consist of a single function which tests a constrained |
| codepath, property, or function. In the test output, an individual test's |
| results will show up as subtests of the suite's results. |
| |
| Tests should be named after what they are testing. This is often the name of the |
| function being tested, with a description of the input or codepath being tested. |
| As tests are C functions, they should be named and written in accordance with |
| the kernel coding style. |
| |
| .. note:: |
| As tests are themselves functions, their names cannot conflict with |
| other C identifiers in the kernel. This may require some creative |
| naming. It is a good idea to make your test functions `static` to avoid |
| polluting the global namespace. |
| |
| Example test names include: |
| |
| ``unpack_u32_with_null_name`` |
| Tests the ``unpack_u32`` function when a NULL name is passed in. |
| ``test_list_splice`` |
| Tests the ``list_splice`` macro. It has the prefix ``test_`` to avoid a |
| name conflict with the macro itself. |
| |
| |
| Should it be necessary to refer to a test outside the context of its test suite, |
| the *fully-qualified* name of a test should be the suite name followed by the |
| test name, separated by a colon (i.e. ``suite:test``). |
| |
| Test Kconfig Entries |
| ==================== |
| |
| Every test suite should be tied to a Kconfig entry. |
| |
| This Kconfig entry must: |
| |
| * be named ``CONFIG_<name>_KUNIT_TEST``: where <name> is the name of the test |
| suite. |
| * be listed either alongside the config entries for the driver/subsystem being |
| tested, or be under [Kernel Hacking]->[Kernel Testing and Coverage] |
| * depend on ``CONFIG_KUNIT``. |
| * be visible only if ``CONFIG_KUNIT_ALL_TESTS`` is not enabled. |
| * have a default value of ``CONFIG_KUNIT_ALL_TESTS``. |
| * have a brief description of KUnit in the help text. |
| |
| If we are not able to meet above conditions (for example, the test is unable to |
| be built as a module), Kconfig entries for tests should be tristate. |
| |
| For example, a Kconfig entry might look like: |
| |
| .. code-block:: none |
| |
| config FOO_KUNIT_TEST |
| tristate "KUnit test for foo" if !KUNIT_ALL_TESTS |
| depends on KUNIT |
| default KUNIT_ALL_TESTS |
| help |
| This builds unit tests for foo. |
| |
| For more information on KUnit and unit tests in general, |
| please refer to the KUnit documentation in Documentation/dev-tools/kunit/. |
| |
| If unsure, say N. |
| |
| |
| Test File and Module Names |
| ========================== |
| |
| KUnit tests are often compiled as a separate module. To avoid conflicting |
| with regular modules, KUnit modules should be named after the test suite, |
| followed by ``_kunit`` (e.g. if "foobar" is the core module, then |
| "foobar_kunit" is the KUnit test module). |
| |
| Test source files, whether compiled as a separate module or an |
| ``#include`` in another source file, are best kept in a ``tests/`` |
| subdirectory to not conflict with other source files (e.g. for |
| tab-completion). |
| |
| Note that the ``_test`` suffix has also been used in some existing |
| tests. The ``_kunit`` suffix is preferred, as it makes the distinction |
| between KUnit and non-KUnit tests clearer. |
| |
| So for the common case, name the file containing the test suite |
| ``tests/<suite>_kunit.c``. The ``tests`` directory should be placed at |
| the same level as the code under test. For example, tests for |
| ``lib/string.c`` live in ``lib/tests/string_kunit.c``. |
| |
| If the suite name contains some or all of the name of the test's parent |
| directory, it may make sense to modify the source filename to reduce |
| redundancy. For example, a ``foo_firmware`` suite could be in the |
| ``foo/tests/firmware_kunit.c`` file. |