test: Add parallel test execution support

Running the full test suite takes a long time. It would be useful to
distribute tests across multiple sandbox instances to speed up testing.

Add support for running tests in parallel across multiple sandbox
instances. Each worker runs a subset of tests based on its worker ID.

Add -P<n>:<w> option to the ut command where n is the total number of
workers and w is this worker's ID (0 to n-1). Tests are distributed
by index modulo number of workers.

Series-to: u-boot
Series-cc: heinrich
Cover-letter:
test: Various improvements to unit-test infrastructure

This series adds several improvements to the unit-test infrastructure:

- Move disk images to the persistent-data directory so they don't
  pollute the source tree
- Add a way to keep pytest-created artefacts for faster iteration on
  C tests
- Add a helper to simplify running manual unit tests from Python
- Allow combined flags with the ut command (e.g. -Efm)
- Add a -E flag to emit machine-readable result lines
- Add a -P flag to distribute tests across parallel workers
- Add -m as an alias for -f (force manual tests)

These changes make it easier to run and debug tests, especially when
iterating on C test code.
END

Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
This commit is contained in:
Simon Glass
2025-12-29 08:04:01 -07:00
committed by Simon Glass
parent dc6bbb7bdf
commit 20a8d1869b
5 changed files with 58 additions and 2 deletions

View File

@@ -171,6 +171,34 @@ require a large amount of refactoring, e.g. with more use of pytest fixtures.
The code-coverage tests are omitted since they cannot run in parallel due to a
Python limitation.
Parallel C unit tests
~~~~~~~~~~~~~~~~~~~~~
The ``ut`` command supports distributing tests across multiple sandbox
instances using the ``-P`` flag. This is useful when running tests directly
from the command line without pytest.
To run tests in parallel across 4 workers::
# Terminal 1
/tmp/b/sandbox/u-boot -T -c "ut -P4:0 dm"
# Terminal 2
/tmp/b/sandbox/u-boot -T -c "ut -P4:1 dm"
# Terminal 3
/tmp/b/sandbox/u-boot -T -c "ut -P4:2 dm"
# Terminal 4
/tmp/b/sandbox/u-boot -T -c "ut -P4:3 dm"
The format is ``-P<n>:<w>`` where ``n`` is the total number of workers and
``w`` is this worker's ID (0 to n-1). Tests are distributed by index modulo
the number of workers, so each worker runs a disjoint subset.
This can be combined with other flags, e.g. ``-EP4:0`` to emit result lines
while running as worker 0 of 4.
Testing under a debugger
~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -11,7 +11,7 @@ Synopsis
::
ut [-Efmr<runs>] [-R] [-I<n>:<one_test>] [<suite> | all [<test>]] [<args>...]
ut [-Efmr<runs>] [-R] [-I<n>:<one_test>] [-P<n>:<w>] [<suite> | all [<test>]] [<args>...]
ut [-s] info
Description
@@ -44,6 +44,12 @@ test
causes another test to fail. If the one test fails, testing stops
immediately.
-P <n>:<w>
Run as worker `<w>` of `<n>` parallel workers. Tests are distributed by
index modulo number of workers, so each worker runs a disjoint subset of
tests. This allows running tests in parallel across multiple sandbox
instances.
-R
Preserve console recording on test failure. Normally when a test fails,
console recording is disabled so error messages go directly to output.