Your platform for hardware test and measurement.
Write ordinary pytest. Every measurement lands recorded, checked against spec, and ready to query. Free and open source.
What it takes to test hardware
Mapping product specs to a test plan. Designing stations and selecting instruments. Developing test code across multiple test phases. Verifying measurements against spec-traced limits. Analyzing results in their captured context.
You write the test. TesterKit helps with the rest.
Change nothing, get a test record
An ordinary pytest test. Your driver, your fixture, plain assert:
def test_rail_within_spec(psu, dmm):
psu.set_voltage(5.0)
psu.enable_output()
assert 3.2 <= dmm.measure_dc_voltage() <= 3.4Install TesterKit and run it again. The test is untouched, and the run files itself:
$ testerkit show 14cfbe7d
Test Run: 14cfbe7d-30d0-4334-b59c-0c04f7576740
UUT Serial: SN0413
Outcome: passed
Started: 2026-07-25T18:39:00-0600
Steps: 2
Measurements: 0 (0 failed)
Step Results:
0. test_rail_within_spec: passed
1. test_rail_holds_across_input: passedTraceable history per serial, for nothing. Now read the last line of that header. Pytest checked 3.2 <= v <= 3.4 and threw the number away. It has no concept of a measurement, so there was nothing to file.
Give it one, and the same run comes back with the readings in it:
verify("v_rail", dmm.measure_dc_voltage(), limit=V_RAIL)
Measurements: 6 (0 failed)
Measurements:
v_rail: 3.31 V [passed]Every run adds to that history. Run testerkit serve and it is a browser away — every reading for a characteristic, plotted against the limits it was checked against:

And that’s the smallest thing it does. The same tests grow into limits traced to the part spec, benches described in text your ops team can edit, live operator screens, parallel test sites, and a production floor’s worth of results your analysts can query. None of it gets in your way before you want it.
What you get
Pytest-native start
pytestpasses after install — no server, no account, no hardware. You control your tests, config, and data.Configuration in YAML
Stations, parts, fixtures, profiles. Reviewable on a PR, editable by anything that reads text.
The right bench, picked for you
Your part needs DC voltage measured; a station on the floor has a DMM that can. TesterKit pairs them. No hand-wired channel maps per test.
Results you can take anywhere
Every run is a plain file in an open format — query it from DuckDB, Polars, pandas, or Spark, and take it with you if you ever leave.
Operator UI
Browse runs, edit config, launch tests, watch live measurements — all from
testerkit serve.Hand it to your AI agent
Claude Code and Copilot can drive the whole thing — from reading a datasheet to running the tests — through a built-in MCP server, the CLI, and ready-made workflows.
Principles
Batteries included, nothing imposed
Storage, validation, querying, and a UI come decided and wired together — no stack to assemble to get a working platform. The choices that touch your own workflow stay yours.
Configuration is text
Stations, parts, fixtures, profiles are YAML. Reviewable on a PR, editable by anything that handles text.
AI-ready, not AI-dependent
Agents can drive every operation through MCP or the CLI. Nothing about the platform requires one.
Runs anywhere, including offline
Local execution by default. No required server, no required account, no cloud dependency. Works on an air-gapped bench.
Open source, Apache-2.0
The code is yours to read, run, fork, and extend. No paid tier of the same software waiting to take it over once you depend on it.
Try it
From nothing to passing tests
pip install testerkit
testerkit init my_project --starter && cd my_project
pytestThree tests pass against simulated instruments, and their measurements are already recorded and checked against the part spec. No bench required to get here.
Free and open source, Apache-2.0. The PyPI distribution and the Python import are both testerkit.
Or run it in your browser — no install
Open in CodespacesA browser sandbox — mock instruments, the operator UI, analytics, and AI. Real instrument control needs a local install.
Apache-2.0 · pre-1.0 · public on GitHub. APIs may shift before 1.0; pin a version, fork if you have to. Your tests are ordinary pytest; your results are open files on your disk.