Skip to main content
A plugin’s tests run on four surfaces, in order of cost and fidelity. All three SDKs ship a test harness: ados.sdk.testing in Python, ados_sdk::testing in Rust, and @altnautica/plugin-sdk/harness in TypeScript.

1. Agent-side unit tests with a mock backend

The cheapest pass. Driver plugins ship a mock backend that the driver constructor accepts in place of the real device: the FLIR Lepton plugin ships MockUvcBackend, and the MAVLink Gimbal v2 plugin ships a mock router. For a Python agent half, ados.sdk.testing adds PluginTestHarness, FakeVisionEngine and load_fixture. PluginTestHarness wires an in-process plugin context to a fake IPC client, so lifecycle hooks run under pytest without the plugin host, sockets or subprocesses. Grant capabilities explicitly and assert against captured events.
Run the suite through the agent CLI, which validates the manifest first and sets the harness environment:
For a Rust agent half, ados_sdk::testing::FakeVisionEngine emits synthetic frames through the same callback a plugin registers with ctx.vision.subscribe_frames, and captures the detections the plugin publishes:
See the FakeVisionEngine tests in crates/ados-sdk/src/testing/mod.rs for a worked example.

2. The plugin harness, GCS side

@altnautica/plugin-sdk/harness mounts your plugin against an in-memory transport, captures every RPC, and lets you inject telemetry, events, config changes and theme updates without running Mission Control.
The full harness reference is on TypeScript SDK.

3. SITL (software in the loop)

ArduPilot SITL covers the flight-controller side: arming, modes, missions, parameters, mount commands and ROI. The agent binds TCP 5760 itself, so SITL on the same host at 5760 collides. Run SITL (sim_vehicle.py) on another machine, or expose it on another port, then point the agent at it:
SITL does not simulate cameras, LiDARs, payloads or vendor serial protocols. For those, use the mock backend.
SITL tests that arm, take off or upload missions use the same commands as a real vehicle. Read Safety before pointing a test at real hardware.

4. Hardware in the loop on a bench rig

The full pass: a real board with the agent installed, the real device on USB or serial, and your plugin packed and installed with ados plugin install <archive>. Bench testing closes the loop on accuracy, timing jitter, hotplug behaviour and vendor-binary integration. Run it before you tag a release. A good bench session captures:
  • The plugin’s log while you exercise the device: ados plugin logs <id> --follow. The file lives at /var/log/ados/plugins/<id-with-dashes>-<hash>.log; find the unit with systemctl list-units 'ados-plugin-*'.
  • A telemetry log over the test window.
  • A photo or short video of the rig and the device under test.
Attach them to your release notes.

What the reference plugins ship

Next steps

Linting

Analyze the packed archive.

Python SDK

The ados.sdk.testing reference.
Last modified on October 11, 2026