tofupilot framework · OPEN SOURCE · MIT

An open-source alternative to TestStand.

Build production tests in Python and YAML. Coordinate phases, instruments and fixture slots with an execution engine you can inspect and adapt.

tofupilot CLI runs onWindowsLinuxmacOS

LOGIC + LIMITS

Python for the test logic.
YAML for the procedure.

Record a named measurement. Its units and limits travel with the result.

procedure.yaml
name: PCB Functional Test
version: 1.4.2

plugs:
  - name: multimeter
    python: plugs.dmm:Multimeter

main:
  - name: Reference voltage
    python: phases.voltage:check_voltage
    measurements:
      - name: reference_voltage
        unit: V
        validators:
          - operator: ">="
            expected_value: 3.250
          - operator: "<="
            expected_value: 3.350
phases/voltage.py
def check_voltage(measurements, multimeter):
    measurements.reference_voltage = (
        multimeter.read_voltage()
    )
Show the PyVISA instrument driver
plugs/dmm.py
import pyvisa

class Multimeter:
    def __init__(self):
        self.rm = pyvisa.ResourceManager()
        self.device = self.rm.open_resource(
            "TCPIP0::192.168.1.42::INSTR"
        )

    def read_voltage(self):
        return float(self.device.query("MEAS:VOLT:DC?"))

    def __del__(self):
        self.device.close()
        self.rm.close()
RUN LOCALLYtofupilot run ./pcb-functional-test

OPERATOR UI

Add the prompt.
Get the interface.

Collect a serial number, confirm a fixture is closed, or guide a visual inspection. Bind operator inputs to the unit and its measurements.

See operator components A blue control board in a test fixture with a barcode scanner and operator display
procedure.yaml
ui:
  components:
    - key: serial_number
      type: text_input
      label: Scan the board
      bind: unit.serial_number
      required: true
IDENTIFY UNITScan the board
Waiting for the board identifier…

BUILT AROUND THE TEST BENCH

One script is a start.
A fixture needs more.

Run independent phases in parallel.

Set workers and dependencies. Run independent phases together while instruments take their measurements.

Explore the capability

Test every slot in the fixture.

Define a slot for each unit. Track its phases, serial number and outcome independently within one execution.

Explore the capability

Connect the equipment you use.

Write plugs as Python classes. Share resources at slot, execution or station scope, with a managed lifecycle.

Explore the capability

THE CONNECTED WORKFLOW

Prove it locally.
Run it on the line.

01 / DEVELOP

Run the procedure.

Exercise phases and equipment connections on your bench with the CLI.

Local development
02 / DEPLOY

Ship a known version.

Connect a station to the platform and deploy the procedure version it should run.

Station deployments
03 / RECORD

Keep testing offline.

Queue completed runs locally, then upload automatically when your connection returns.

Offline upload queue

INSPECT IT. ADAPT IT. OWN YOUR TESTS.

Open source, at the core.

MIT-licensed: inspect the engine, adapt your tests, and run locally. Connected dashboards, deployments, and AI analysis have separate plans.

Moving from TestStand? Map your sequence to Python

Give it a run.

See how a measured voltage becomes a test result.