BenchCI Documentation¶
Hardware CI for embedded systems¶
BenchCI lets embedded teams flash firmware, run tests on real devices, return results to CI, and preserve review-ready verification evidence.
benchci run --cloud --bench-id my-bench --suite suite.yaml --artifact build/fw.elf
No simulation. No manual serial-terminal testing. Real hardware in the loop.
The problem BenchCI solves¶
Most embedded validation still depends on manual bench work:
flash firmware by hand
open a terminal
send commands manually
watch logs
copy results into a ticket or release note
That is fine for early bring-up.
It is not enough for repeatable CI, shared hardware, pull-request validation, release gates, or remote teams.
What BenchCI gives you¶
BenchCI turns hardware validation into a repeatable CI workflow:
CI builds firmware
↓
BenchCI schedules a hardware run
↓
Agent flashes and tests a real device
↓
Results, logs, artifacts, and evidence return to CI/dashboard
↓
Optional release review packages can collect runs, coverage, identity, and sign-off history
You can start locally, then move the same test model to a remote Agent or BenchCI Cloud.
Fastest path¶
If you already have a board connected to your machine:
pip install benchci
benchci login
benchci init --preset flash-uart
benchci doctor --bench bench.yaml
benchci run --bench bench.yaml --suite suite.yaml --artifact build/fw.elf
BenchCI will load your hardware configuration, flash the firmware, run the suite, and write results under benchci-results/.
If you prefer to start in the browser, the dashboard Config Builder can export starter bench.yaml and suite.yaml files for the same preset-based flows.
Core mental model¶
bench.yaml -> describes the hardware
suite.yaml -> describes the test logic
benchci run -> executes the suite on real hardware
Use benchci init --list-presets to see starter configs for UART smoke tests, flash + UART flows, GPIO reset/ready checks, power cycling, measurements, CAN, Modbus, and bounded protocol fuzzing. The generated files are intentionally editable YAML, not a hidden cloud configuration.
A bench is your physical setup: DUT, debugger, UART/CAN/Modbus adapters, GPIO, relays, power controllers, measurement instruments, and related resources.
A suite is what should happen: flash, reset, send commands, wait for logs, read registers, check GPIO, validate CAN frames, run bounded fuzzing, cycle power, take measurements, and assert metrics.
An Agent is the hardware-connected process that lets CI or remote users run tests without sitting next to the device.
BenchCI Cloud Mode adds workspace-aware scheduling, shared/private benches, dashboard visibility, and CI-friendly execution.
Recommended path for new users¶
Reference pages are available after the getting-started flow.
What BenchCI supports today¶
Communication:
UART
Modbus RTU
Modbus TCP
CAN
I2C (bus scan, register read/write, expect)
SPI (full-duplex transfer, expect)
bounded UART/CAN/Modbus protocol fuzzing
experimental allow-listed power, GPIO, and malformed-UART-byte fault injection
Flashing:
OpenOCD
STM32CubeProgrammer
SEGGER J-Link
esptool
Control:
Linux GPIO
remote GPIO through Agent
GPIO-backed power control
HTTP relay control
serial relay command maps
Power control is exposed through bench-level resources, so suites use generic steps such as power_cycle while bench.yaml defines the concrete GPIO, HTTP, or serial relay backend.
Measurements:
HTTP/lab-controller measurement resources
SCPI measurement resources over TCP/IP, serial/RS232, and USB/VISA-style instruments
SCPI power-supply current/voltage readback with conservative presets
I2C power-monitor measurements
script and serial measurement resources
recorded metrics and threshold assertions
Measurement follows the same bench-level resource pattern, so suites use generic measure steps while bench.yaml defines the concrete measurement backend.
Evidence and traceability:
evidence.jsonmachine-readable run evidenceevidence.htmlhuman-readable evidence reportsinput snapshots of
bench.yamlandsuite.yamlfirmware, suite, and bench config hashes
optional requirement, test case, risk, release, and tag metadata
structured failure explanations and suggested checks
artifact
manifest.jsonwith SHA256 hashescaptured measurements and metrics
fuzz campaign summaries, seeds, first failing cases, and JSONL case logs when fuzzing is used
configured or UART-verified DUT identity
LCOV summaries attached from unit tests or simulation
firmware handling mode, SHA256 verification, deletion state, and audit events
imported JUnit/CTRF results and authenticated external artifacts
experimental controlled fault-injection recovery evidence
optional release bundles with coverage matrices, review sign-off, and HTML/PDF reports
recent reliability history, flaky-test warnings, and advisory failure assessments
Execution:
local runs
direct Agent runs
backend-controlled Cloud Mode runs
Documentation¶
Getting Started¶
Core Reference¶
Core reference
- Bench Configuration
- Suite Configuration
- Protocol Fuzzing
- Power Resources
- Measurement Resources
- I2C and SPI Station Wiring Guide
- UART DUT Self-Identification
- Controlled Fault Injection (Experimental)
- Evidence Reports and Traceability
- JUnit XML and CTRF Import Guide
- BenchCI CLI
- Validation, Self-Test, and Dry-Run Planning
- BenchCI Examples
- Dashboard
- BenchCI Architecture
- Linux GPIO in BenchCI
- Security
- FAQ
- Workspace Owner Operations