Testing is the backbone of U-Boot development, but as the test suite grows, so does the friction involved in running it. Whether it is the time it takes to regenerate disk images or the difficulty of parsing test output in CI, there is always room for improvement.
A recent series of 9 patches in Concept smooths out several rough edges in the unit-test (ut) infrastructure. These changes focus on speed, directory cleanliness, and better automation support.
Faster Iteration with Persistence
One of the biggest time-sinks when iterating on C-based filesystem / boot tests is the Python-fixture setup. Every time you ran a test, the system generates fresh disk images, which is slow and repetitive if the images haven’t actually changed.
A new --persist (or -P) flag is now available in the Python-test runner. This tells the system to keep test artefacts—like disk images—after the run completes. Combined with updates to the test drivers, you can now re-run specific C tests immediately without waiting for the Python layer to regenerate the world.
A Cleaner Source Tree
Historically, tests tended to dump their temporary disk images (mmc1.img, spi.bin, etc.) directly into the source tree. This cluttered the workspace and requires a git-ignore rule to avoid making git status noisy.
This series moves all test-generated disk images to the persistent-data directory, i.e. inside the build directory. This keeps your source tree clean and groups all transient test-data in one predictable location.
Parallel Execution Support
Running the full unit test suite on a single core takes a while. Just the driver model tests alone (ut dm) take 13 seconds even on a fast machine. As a step towards improving this, we added support for parallel execution to the ut command.
You can now use the -P <n>:<w> flag to shard tests across multiple sandbox instances. For example, if you want to split the work across 4 workers, you can launch 4 separate sandbox processes:
./u-boot -T -c "ut -P4:0 dm" # Worker 0
./u-boot -T -c "ut -P4:1 dm" # Worker 1
...
The tests are distributed by index, ensuring a disjoint subset for each worker.
Automation and CLI Improvements
Several changes are included to make the ut command friendlier for both humans and machines:
- Machine-Readable Output: A new
-Eflag emits explicitResult: PASS: ...orResult: FAIL: ...lines after each test. This eliminates the need for fragile regex parsing in CI scripts to determine exactly which test failed. - Combined Flags: You can finally combine single-character flags. Instead of typing
ut -f -m -E, you can now simply runut -fmE. - Manual Test Alias: The
-mflag was added as an alias for-f(force), making it more intuitive to run “manual” tests.
These improvements should make the testing experience faster and less intrusive for everyday development.
What’s next?
A new tool is in the works to help productivity when running tests. Watch this space!


