testerkit 0.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- testerkit/__init__.py +68 -0
- testerkit/_docs/_assets/operator-ui/channels/table.png +0 -0
- testerkit/_docs/_assets/operator-ui/dashboard/runs.png +0 -0
- testerkit/_docs/_assets/operator-ui/dashboard/stations.png +0 -0
- testerkit/_docs/_assets/operator-ui/events/filters.png +0 -0
- testerkit/_docs/_assets/operator-ui/events/table.png +0 -0
- testerkit/_docs/_assets/operator-ui/explore/chart.png +0 -0
- testerkit/_docs/_assets/operator-ui/explore/filters.png +0 -0
- testerkit/_docs/_assets/operator-ui/explore/plot-controls.png +0 -0
- testerkit/_docs/_assets/operator-ui/files/table.png +0 -0
- testerkit/_docs/_assets/operator-ui/launch/form.png +0 -0
- testerkit/_docs/_assets/operator-ui/metrics/filters.png +0 -0
- testerkit/_docs/_assets/operator-ui/metrics/pareto.png +0 -0
- testerkit/_docs/_assets/operator-ui/metrics/ppk.png +0 -0
- testerkit/_docs/_assets/operator-ui/metrics/yield.png +0 -0
- testerkit/_docs/_assets/operator-ui/results/detail-header.png +0 -0
- testerkit/_docs/_assets/operator-ui/results/detail-measurements.png +0 -0
- testerkit/_docs/_assets/operator-ui/results/detail-overview.png +0 -0
- testerkit/_docs/_assets/operator-ui/results/detail-steps.png +0 -0
- testerkit/_docs/_assets/operator-ui/results/stats.png +0 -0
- testerkit/_docs/_assets/operator-ui/results/table.png +0 -0
- testerkit/_docs/_assets/operator-ui/tour/designer.png +0 -0
- testerkit/_docs/_assets/operator-ui/tour/docs.png +0 -0
- testerkit/_docs/_assets/operator-ui/tour/fixtures.png +0 -0
- testerkit/_docs/_assets/operator-ui/tour/instruments.png +0 -0
- testerkit/_docs/_assets/operator-ui/tour/parts.png +0 -0
- testerkit/_docs/_assets/operator-ui/tour/profiles.png +0 -0
- testerkit/_docs/_assets/operator-ui/tour/stations.png +0 -0
- testerkit/_docs/_assets/operator-ui/tour/tests.png +0 -0
- testerkit/_docs/_assets/operator-ui/tour/uuts.png +0 -0
- testerkit/_docs/concepts/configuration/capabilities.md +447 -0
- testerkit/_docs/concepts/configuration/fixtures.md +335 -0
- testerkit/_docs/concepts/configuration/index.md +14 -0
- testerkit/_docs/concepts/configuration/parts.md +276 -0
- testerkit/_docs/concepts/configuration/stations.md +214 -0
- testerkit/_docs/concepts/data/data-stores.md +199 -0
- testerkit/_docs/concepts/data/event-log.md +185 -0
- testerkit/_docs/concepts/data/event-sourcing.md +76 -0
- testerkit/_docs/concepts/data/flight-streaming.md +58 -0
- testerkit/_docs/concepts/data/index.md +17 -0
- testerkit/_docs/concepts/data/sessions.md +78 -0
- testerkit/_docs/concepts/data/three-verbs.md +260 -0
- testerkit/_docs/concepts/execution/index.md +13 -0
- testerkit/_docs/concepts/execution/outcomes.md +199 -0
- testerkit/_docs/concepts/execution/step-hierarchy.md +170 -0
- testerkit/_docs/concepts/execution/step-manifest.md +115 -0
- testerkit/_docs/concepts/index.md +40 -0
- testerkit/_docs/concepts/overview/ai-integration.md +57 -0
- testerkit/_docs/concepts/overview/architecture.md +357 -0
- testerkit/_docs/concepts/overview/index.md +14 -0
- testerkit/_docs/concepts/overview/platform-vs-framework.md +147 -0
- testerkit/_docs/concepts/overview/pytest.md +53 -0
- testerkit/_docs/concepts/overview/tiers.md +46 -0
- testerkit/_docs/how-to/catalog/datasheet-to-test.md +169 -0
- testerkit/_docs/how-to/catalog/index.md +11 -0
- testerkit/_docs/how-to/configuration/configuring-stations.md +364 -0
- testerkit/_docs/how-to/configuration/custom-drivers.md +484 -0
- testerkit/_docs/how-to/configuration/index.md +13 -0
- testerkit/_docs/how-to/configuration/mock-mode.md +342 -0
- testerkit/_docs/how-to/data/benchmarking.md +120 -0
- testerkit/_docs/how-to/data/capture-an-artifact.md +84 -0
- testerkit/_docs/how-to/data/capture-waveform.md +110 -0
- testerkit/_docs/how-to/data/choosing-a-channel-verb.md +108 -0
- testerkit/_docs/how-to/data/compare-runs.md +120 -0
- testerkit/_docs/how-to/data/export-results.md +104 -0
- testerkit/_docs/how-to/data/find-flaky-tests.md +108 -0
- testerkit/_docs/how-to/data/grafana-dashboards.md +148 -0
- testerkit/_docs/how-to/data/index.md +23 -0
- testerkit/_docs/how-to/data/mcp-debug-failures.md +125 -0
- testerkit/_docs/how-to/data/mcp-query-runs.md +120 -0
- testerkit/_docs/how-to/data/querying-channels.md +117 -0
- testerkit/_docs/how-to/data/querying-events.md +85 -0
- testerkit/_docs/how-to/data/stream-live-channel.md +134 -0
- testerkit/_docs/how-to/execution/custom-operator-ui.md +136 -0
- testerkit/_docs/how-to/execution/index.md +21 -0
- testerkit/_docs/how-to/execution/limits.md +193 -0
- testerkit/_docs/how-to/execution/managing-sessions.md +100 -0
- testerkit/_docs/how-to/execution/multi-uut-testing.md +211 -0
- testerkit/_docs/how-to/execution/operator-prompts.md +151 -0
- testerkit/_docs/how-to/execution/profiles.md +304 -0
- testerkit/_docs/how-to/execution/spec-driven-testing.md +169 -0
- testerkit/_docs/how-to/execution/test-context.md +212 -0
- testerkit/_docs/how-to/execution/traceability.md +252 -0
- testerkit/_docs/how-to/execution/vector-expansion.md +394 -0
- testerkit/_docs/how-to/execution/writing-tests.md +363 -0
- testerkit/_docs/how-to/index.md +59 -0
- testerkit/_docs/how-to/overview/index.md +11 -0
- testerkit/_docs/how-to/overview/mcp-integration.md +168 -0
- testerkit/_docs/how-to/overview/operator-ui-tour.md +234 -0
- testerkit/_docs/integration/data/grafana.md +162 -0
- testerkit/_docs/integration/data/index.md +15 -0
- testerkit/_docs/integration/data/lakehouse-import.md +226 -0
- testerkit/_docs/integration/data/logging.md +131 -0
- testerkit/_docs/integration/data/results-api.md +51 -0
- testerkit/_docs/integration/index.md +20 -0
- testerkit/_docs/integration/runtime/harness.md +281 -0
- testerkit/_docs/integration/runtime/index.md +13 -0
- testerkit/_docs/integration/runtime/instruments.md +284 -0
- testerkit/_docs/integration/runtime/pytest-existing.md +315 -0
- testerkit/_docs/reference/catalog/cookbook.md +389 -0
- testerkit/_docs/reference/catalog/index.md +11 -0
- testerkit/_docs/reference/catalog/schema.md +375 -0
- testerkit/_docs/reference/cli.md +660 -0
- testerkit/_docs/reference/configuration.md +406 -0
- testerkit/_docs/reference/data/channels-schema.md +145 -0
- testerkit/_docs/reference/data/event-types.md +554 -0
- testerkit/_docs/reference/data/events-schema.md +120 -0
- testerkit/_docs/reference/data/files-schema.md +141 -0
- testerkit/_docs/reference/data/index.md +18 -0
- testerkit/_docs/reference/data/models.md +2229 -0
- testerkit/_docs/reference/data/outputs.md +82 -0
- testerkit/_docs/reference/data/parquet-schema.md +529 -0
- testerkit/_docs/reference/data/performance-limits.md +224 -0
- testerkit/_docs/reference/data/query-api.md +247 -0
- testerkit/_docs/reference/index.md +69 -0
- testerkit/_docs/reference/operator-ui/channels/detail.md +82 -0
- testerkit/_docs/reference/operator-ui/channels/list.md +70 -0
- testerkit/_docs/reference/operator-ui/dashboard.md +87 -0
- testerkit/_docs/reference/operator-ui/designer.md +167 -0
- testerkit/_docs/reference/operator-ui/events.md +89 -0
- testerkit/_docs/reference/operator-ui/files.md +74 -0
- testerkit/_docs/reference/operator-ui/fixtures.md +100 -0
- testerkit/_docs/reference/operator-ui/instruments.md +126 -0
- testerkit/_docs/reference/operator-ui/launch.md +79 -0
- testerkit/_docs/reference/operator-ui/live.md +102 -0
- testerkit/_docs/reference/operator-ui/measurements.md +159 -0
- testerkit/_docs/reference/operator-ui/metrics.md +217 -0
- testerkit/_docs/reference/operator-ui/parts.md +98 -0
- testerkit/_docs/reference/operator-ui/profiles.md +103 -0
- testerkit/_docs/reference/operator-ui/results/detail.md +214 -0
- testerkit/_docs/reference/operator-ui/results/list.md +106 -0
- testerkit/_docs/reference/operator-ui/stations.md +98 -0
- testerkit/_docs/reference/operator-ui/tests.md +173 -0
- testerkit/_docs/reference/operator-ui/uuts.md +67 -0
- testerkit/_docs/reference/overview/index.md +11 -0
- testerkit/_docs/reference/overview/pytest-native.md +142 -0
- testerkit/_docs/reference/overview/skills.md +177 -0
- testerkit/_docs/reference/pytest/fixtures.md +342 -0
- testerkit/_docs/reference/pytest/index.md +12 -0
- testerkit/_docs/reference/pytest/markers.md +257 -0
- testerkit/_docs/reference/runtime/api.md +246 -0
- testerkit/_docs/reference/runtime/client.md +280 -0
- testerkit/_docs/reference/runtime/connect.md +140 -0
- testerkit/_docs/reference/runtime/index.md +13 -0
- testerkit/_docs/tutorial/01-first-test.md +113 -0
- testerkit/_docs/tutorial/02-mock-instruments.md +88 -0
- testerkit/_docs/tutorial/03-fixtures.md +169 -0
- testerkit/_docs/tutorial/04-limits.md +139 -0
- testerkit/_docs/tutorial/05-configuration.md +194 -0
- testerkit/_docs/tutorial/06-specifications.md +273 -0
- testerkit/_docs/tutorial/07-real-instruments.md +245 -0
- testerkit/_docs/tutorial/08-capabilities.md +223 -0
- testerkit/_docs/tutorial/09-production.md +374 -0
- testerkit/_docs/tutorial/10-live-monitoring.md +156 -0
- testerkit/_docs/tutorial/11-waveforms-and-evidence.md +169 -0
- testerkit/_docs/tutorial/12-continuous-monitoring.md +145 -0
- testerkit/_docs/tutorial/13-parallel-testing.md +233 -0
- testerkit/_docs/tutorial/index.md +61 -0
- testerkit/_docs/tutorial/quickstart.md +282 -0
- testerkit/analysis/__init__.py +9 -0
- testerkit/analysis/_common.py +24 -0
- testerkit/analysis/measurement_facets.py +524 -0
- testerkit/analysis/measurements_query.py +1458 -0
- testerkit/analysis/metrics.py +389 -0
- testerkit/analysis/runs_query.py +434 -0
- testerkit/analysis/steps_query.py +413 -0
- testerkit/api/__init__.py +6 -0
- testerkit/api/_mime.py +71 -0
- testerkit/api/app.py +1171 -0
- testerkit/api/dialogs/__init__.py +36 -0
- testerkit/api/dialogs/manager.py +617 -0
- testerkit/api/dialogs/models.py +79 -0
- testerkit/api/models.py +80 -0
- testerkit/api/responses.py +205 -0
- testerkit/api/runner.py +222 -0
- testerkit/api/schemas.py +311 -0
- testerkit/benchmark/__init__.py +34 -0
- testerkit/benchmark/concurrency.py +248 -0
- testerkit/benchmark/core.py +232 -0
- testerkit/benchmark/runner.py +628 -0
- testerkit/benchmark/scenario.py +313 -0
- testerkit/benchmark/system.py +191 -0
- testerkit/benchmark/workloads.py +507 -0
- testerkit/catalog/__init__.py +6 -0
- testerkit/catalog/generic/generic_dmm.yaml +61 -0
- testerkit/catalog/generic/generic_eload.yaml +31 -0
- testerkit/catalog/generic/generic_fgen.yaml +56 -0
- testerkit/catalog/generic/generic_oscilloscope.yaml +45 -0
- testerkit/catalog/generic/generic_psu.yaml +77 -0
- testerkit/catalog/generic/generic_smu.yaml +73 -0
- testerkit/channels.py +538 -0
- testerkit/cli/__init__.py +32 -0
- testerkit/cli/_common.py +113 -0
- testerkit/cli/_time.py +179 -0
- testerkit/cli/benchmark_cmd.py +56 -0
- testerkit/cli/catalog_cmd.py +39 -0
- testerkit/cli/daemon.py +157 -0
- testerkit/cli/data_cmd.py +1040 -0
- testerkit/cli/discover_cmd.py +94 -0
- testerkit/cli/docs_cmd.py +100 -0
- testerkit/cli/instrument.py +172 -0
- testerkit/cli/mcp_cmd.py +37 -0
- testerkit/cli/metrics.py +366 -0
- testerkit/cli/project.py +312 -0
- testerkit/cli/root.py +14 -0
- testerkit/cli/runs.py +412 -0
- testerkit/cli/schema_cmd.py +87 -0
- testerkit/cli/serve_cmd.py +50 -0
- testerkit/cli/setup_cmd.py +604 -0
- testerkit/cli/station.py +294 -0
- testerkit/cli/validate.py +112 -0
- testerkit/client.py +463 -0
- testerkit/connect.py +635 -0
- testerkit/data/__init__.py +8 -0
- testerkit/data/_accumulator_pool.py +455 -0
- testerkit/data/_atomic.py +59 -0
- testerkit/data/_collection_indices.py +67 -0
- testerkit/data/_daemon_lifecycle.py +535 -0
- testerkit/data/_duckdb_daemon.py +695 -0
- testerkit/data/_duckdb_flight_server.py +813 -0
- testerkit/data/_event_filters.py +15 -0
- testerkit/data/_event_reader.py +101 -0
- testerkit/data/_flight_errors.py +199 -0
- testerkit/data/_flight_query.py +202 -0
- testerkit/data/_flight_retry.py +148 -0
- testerkit/data/_flight_subscribe.py +67 -0
- testerkit/data/_index_epoch.py +342 -0
- testerkit/data/_ipc_writer.py +185 -0
- testerkit/data/_json_safe.py +63 -0
- testerkit/data/_process.py +18 -0
- testerkit/data/_push_relay.py +124 -0
- testerkit/data/_runs_duckdb_daemon.py +2704 -0
- testerkit/data/_session_reaper.py +110 -0
- testerkit/data/_sql_helpers.py +30 -0
- testerkit/data/_store.py +24 -0
- testerkit/data/backends/__init__.py +7 -0
- testerkit/data/backends/_event_accumulator.py +957 -0
- testerkit/data/backends/_row_helpers.py +1172 -0
- testerkit/data/backends/parquet.py +1143 -0
- testerkit/data/backends/protocol.py +35 -0
- testerkit/data/channels/__init__.py +8 -0
- testerkit/data/channels/_flight_daemon.py +75 -0
- testerkit/data/channels/client.py +242 -0
- testerkit/data/channels/flight_manager.py +88 -0
- testerkit/data/channels/index.py +664 -0
- testerkit/data/channels/models.py +418 -0
- testerkit/data/channels/server.py +162 -0
- testerkit/data/channels/store.py +1481 -0
- testerkit/data/data_dir.py +61 -0
- testerkit/data/duckdb_manager.py +79 -0
- testerkit/data/event_log.py +384 -0
- testerkit/data/event_store.py +768 -0
- testerkit/data/events.py +1025 -0
- testerkit/data/exporters/__init__.py +6 -0
- testerkit/data/exporters/_helpers.py +40 -0
- testerkit/data/exporters/csv_exporter.py +168 -0
- testerkit/data/exporters/hdf5.py +234 -0
- testerkit/data/exporters/json_exporter.py +229 -0
- testerkit/data/exporters/mdf4.py +201 -0
- testerkit/data/exporters/stdf.py +255 -0
- testerkit/data/exporters/tdms.py +292 -0
- testerkit/data/files/__init__.py +71 -0
- testerkit/data/files/_backend.py +207 -0
- testerkit/data/files/_catalog_daemon.py +84 -0
- testerkit/data/files/catalog.py +218 -0
- testerkit/data/files/catalog_manager.py +325 -0
- testerkit/data/files/models.py +60 -0
- testerkit/data/files/serializers.py +414 -0
- testerkit/data/files/store.py +463 -0
- testerkit/data/files/streaming.py +783 -0
- testerkit/data/models.py +604 -0
- testerkit/data/ref.py +152 -0
- testerkit/data/retention.py +297 -0
- testerkit/data/run_store.py +367 -0
- testerkit/data/runs_duckdb_manager.py +103 -0
- testerkit/data/schema_dispatch.py +191 -0
- testerkit/data/schema_migrate.py +76 -0
- testerkit/data/schema_versions.py +85 -0
- testerkit/data/schemas.py +288 -0
- testerkit/data/subscribers/__init__.py +48 -0
- testerkit/data/subscribers/_base.py +20 -0
- testerkit/data/subscribers/_output_file.py +25 -0
- testerkit/data/subscribers/replay.py +55 -0
- testerkit/environment.py +84 -0
- testerkit/execution/__init__.py +11 -0
- testerkit/execution/_git.py +190 -0
- testerkit/execution/_state.py +740 -0
- testerkit/execution/accessors.py +54 -0
- testerkit/execution/audit.py +51 -0
- testerkit/execution/cascade.py +85 -0
- testerkit/execution/connections.py +491 -0
- testerkit/execution/harness.py +1931 -0
- testerkit/execution/instrument_events.py +42 -0
- testerkit/execution/limits.py +154 -0
- testerkit/execution/metadata.py +102 -0
- testerkit/execution/mocks.py +63 -0
- testerkit/execution/profiles.py +616 -0
- testerkit/execution/run_scope.py +1331 -0
- testerkit/execution/session_scope.py +196 -0
- testerkit/execution/sidecar.py +280 -0
- testerkit/execution/site_runner.py +705 -0
- testerkit/execution/sites.py +183 -0
- testerkit/execution/sync.py +294 -0
- testerkit/execution/uut_provider.py +231 -0
- testerkit/execution/vectors.py +205 -0
- testerkit/execution/verify.py +396 -0
- testerkit/expand.py +75 -0
- testerkit/files.py +235 -0
- testerkit/fixtures/__init__.py +6 -0
- testerkit/fixtures/manager.py +357 -0
- testerkit/grafana/__init__.py +1 -0
- testerkit/grafana/bootstrap.py +61 -0
- testerkit/grafana/cli.py +314 -0
- testerkit/grafana/dashboards/asset_utilization.json +92 -0
- testerkit/grafana/dashboards/channel_explorer.json +77 -0
- testerkit/grafana/dashboards/event_log.json +92 -0
- testerkit/grafana/dashboards/failure_pareto.json +104 -0
- testerkit/grafana/dashboards/measurement_distribution.json +97 -0
- testerkit/grafana/dashboards/measurement_trend.json +161 -0
- testerkit/grafana/dashboards/station_comparison.json +95 -0
- testerkit/grafana/dashboards/test_duration.json +104 -0
- testerkit/grafana/dashboards/unit_traceability.json +73 -0
- testerkit/grafana/dashboards/yield_overview.json +189 -0
- testerkit/grafana/provisioning/dashboards.yaml.j2 +12 -0
- testerkit/grafana/provisioning/datasources.yaml.j2 +17 -0
- testerkit/grafana/server.py +282 -0
- testerkit/init.py +724 -0
- testerkit/instruments/__init__.py +10 -0
- testerkit/instruments/base.py +82 -0
- testerkit/instruments/discovery/__init__.py +62 -0
- testerkit/instruments/discovery/_base.py +174 -0
- testerkit/instruments/discovery/lxi.py +152 -0
- testerkit/instruments/discovery/ni.py +95 -0
- testerkit/instruments/discovery/serial.py +73 -0
- testerkit/instruments/discovery/visa.py +98 -0
- testerkit/instruments/lifecycle.py +213 -0
- testerkit/instruments/loader.py +79 -0
- testerkit/instruments/locks.py +178 -0
- testerkit/instruments/mocks.py +230 -0
- testerkit/instruments/observer.py +270 -0
- testerkit/instruments/observers/__init__.py +36 -0
- testerkit/instruments/observers/_base.py +68 -0
- testerkit/instruments/observers/daqmx.py +70 -0
- testerkit/instruments/observers/descriptor.py +69 -0
- testerkit/instruments/observers/generic.py +92 -0
- testerkit/instruments/observers/lantz.py +31 -0
- testerkit/instruments/observers/modbus.py +96 -0
- testerkit/instruments/observers/motion.py +68 -0
- testerkit/instruments/observers/ni_modular.py +73 -0
- testerkit/instruments/observers/ophyd.py +80 -0
- testerkit/instruments/observers/pymeasure.py +120 -0
- testerkit/instruments/observers/qcodes.py +66 -0
- testerkit/instruments/observers/scpi.py +88 -0
- testerkit/instruments/observers/tektronix.py +57 -0
- testerkit/instruments/observers/visa.py +103 -0
- testerkit/instruments/pool.py +459 -0
- testerkit/instruments/proxy.py +59 -0
- testerkit/instruments/route_manager.py +329 -0
- testerkit/instruments/routed_proxy.py +88 -0
- testerkit/instruments/server.py +508 -0
- testerkit/instruments/switch.py +43 -0
- testerkit/instruments/visa.py +294 -0
- testerkit/matching/__init__.py +6 -0
- testerkit/matching/service.py +969 -0
- testerkit/mcp/__init__.py +6 -0
- testerkit/mcp/server.py +681 -0
- testerkit/mcp/tools.py +1868 -0
- testerkit/models/__init__.py +18 -0
- testerkit/models/capability.py +598 -0
- testerkit/models/catalog.py +76 -0
- testerkit/models/data_options.py +153 -0
- testerkit/models/enums.py +334 -0
- testerkit/models/instrument.py +152 -0
- testerkit/models/instrument_asset.py +25 -0
- testerkit/models/part.py +271 -0
- testerkit/models/part_manifest.py +96 -0
- testerkit/models/project.py +114 -0
- testerkit/models/station.py +140 -0
- testerkit/models/test_config.py +748 -0
- testerkit/ontology/__init__.py +39 -0
- testerkit/ontology/schema.py +188 -0
- testerkit/ontology/testerkit.yaml +1420 -0
- testerkit/parts/__init__.py +8 -0
- testerkit/parts/context.py +181 -0
- testerkit/parts/folder.py +251 -0
- testerkit/parts/loader.py +27 -0
- testerkit/prompts/__init__.py +17 -0
- testerkit/prompts/core.py +133 -0
- testerkit/pytest_plugin/__init__.py +1287 -0
- testerkit/pytest_plugin/autouse.py +369 -0
- testerkit/pytest_plugin/helpers.py +354 -0
- testerkit/pytest_plugin/hooks.py +1982 -0
- testerkit/pytest_plugin/markers.py +203 -0
- testerkit/pytest_plugin/retry.py +37 -0
- testerkit/pytest_plugin/sweeps.py +117 -0
- testerkit/queries.py +78 -0
- testerkit/reports/__init__.py +6 -0
- testerkit/reports/core.py +492 -0
- testerkit/reports/datasheet.py +831 -0
- testerkit/reports/templates/datasheet.html +383 -0
- testerkit/reports/templates/default.html +153 -0
- testerkit/sbom.py +142 -0
- testerkit/schema_export.py +101 -0
- testerkit/signals.py +63 -0
- testerkit/skills/README.md +58 -0
- testerkit/skills/templates/project-instructions.md +125 -0
- testerkit/skills/testerkit-analysis/SKILL.md +87 -0
- testerkit/skills/testerkit-capture/SKILL.md +114 -0
- testerkit/skills/testerkit-data/SKILL.md +138 -0
- testerkit/skills/testerkit-datasheets/SKILL.md +100 -0
- testerkit/skills/testerkit-datasheets/agents/scaffold-writer.md +115 -0
- testerkit/skills/testerkit-datasheets/agents/section-extractor.md +98 -0
- testerkit/skills/testerkit-datasheets/agents/section-reviewer.md +153 -0
- testerkit/skills/testerkit-datasheets/agents/section-splitter.md +89 -0
- testerkit/skills/testerkit-datasheets/agents/section-writer.md +226 -0
- testerkit/skills/testerkit-datasheets/references/catalog-pipeline.md +271 -0
- testerkit/skills/testerkit-datasheets/references/process-queue.md +42 -0
- testerkit/skills/testerkit-datasheets/references/scaffold.md +156 -0
- testerkit/skills/testerkit-datasheets/references/test-pipeline.md +312 -0
- testerkit/skills/testerkit-debug/SKILL.md +127 -0
- testerkit/skills/testerkit-interactive/SKILL.md +188 -0
- testerkit/skills/testerkit-interactive/references/live-ui-patterns.md +102 -0
- testerkit/skills/testerkit-mocks/SKILL.md +128 -0
- testerkit/skills/testerkit-parts/SKILL.md +126 -0
- testerkit/skills/testerkit-profiles/SKILL.md +139 -0
- testerkit/skills/testerkit-sites/SKILL.md +140 -0
- testerkit/skills/testerkit-stations/SKILL.md +146 -0
- testerkit/skills/testerkit-tests/SKILL.md +136 -0
- testerkit/store.py +1639 -0
- testerkit/ui/__init__.py +71 -0
- testerkit/ui/_asgi.py +162 -0
- testerkit/ui/app.py +32 -0
- testerkit/ui/components/__init__.py +13 -0
- testerkit/ui/components/artifact_viewer.py +250 -0
- testerkit/ui/components/channel_values.py +159 -0
- testerkit/ui/components/event_timeline.py +222 -0
- testerkit/ui/components/execution_gantt.py +210 -0
- testerkit/ui/components/file_streams.py +147 -0
- testerkit/ui/components/instrument_activity.py +146 -0
- testerkit/ui/components/session_table.py +118 -0
- testerkit/ui/pages/__init__.py +25 -0
- testerkit/ui/pages/channels/__init__.py +4 -0
- testerkit/ui/pages/channels/detail.py +932 -0
- testerkit/ui/pages/channels/list.py +515 -0
- testerkit/ui/pages/dashboard.py +236 -0
- testerkit/ui/pages/designer/__init__.py +5 -0
- testerkit/ui/pages/designer/graph.py +635 -0
- testerkit/ui/pages/designer/matching.py +663 -0
- testerkit/ui/pages/designer/page.py +593 -0
- testerkit/ui/pages/designer/properties.py +591 -0
- testerkit/ui/pages/designer/state.py +468 -0
- testerkit/ui/pages/docs/__init__.py +6 -0
- testerkit/ui/pages/docs/index.py +95 -0
- testerkit/ui/pages/docs/page.py +698 -0
- testerkit/ui/pages/events/__init__.py +3 -0
- testerkit/ui/pages/events/list.py +263 -0
- testerkit/ui/pages/explore.py +1108 -0
- testerkit/ui/pages/files/__init__.py +4 -0
- testerkit/ui/pages/files/detail.py +426 -0
- testerkit/ui/pages/files/list.py +447 -0
- testerkit/ui/pages/fixtures/__init__.py +8 -0
- testerkit/ui/pages/fixtures/detail.py +280 -0
- testerkit/ui/pages/fixtures/edit.py +370 -0
- testerkit/ui/pages/fixtures/list.py +180 -0
- testerkit/ui/pages/fixtures/new.py +195 -0
- testerkit/ui/pages/instruments/__init__.py +4 -0
- testerkit/ui/pages/instruments/detail.py +320 -0
- testerkit/ui/pages/instruments/edit.py +482 -0
- testerkit/ui/pages/instruments/list.py +249 -0
- testerkit/ui/pages/instruments/new.py +200 -0
- testerkit/ui/pages/launch.py +261 -0
- testerkit/ui/pages/live.py +124 -0
- testerkit/ui/pages/metrics_page.py +1229 -0
- testerkit/ui/pages/parts/__init__.py +11 -0
- testerkit/ui/pages/parts/detail.py +202 -0
- testerkit/ui/pages/parts/edit.py +310 -0
- testerkit/ui/pages/parts/list.py +160 -0
- testerkit/ui/pages/parts/new.py +170 -0
- testerkit/ui/pages/parts/requirements.py +153 -0
- testerkit/ui/pages/parts/stations.py +199 -0
- testerkit/ui/pages/profiles/__init__.py +4 -0
- testerkit/ui/pages/profiles/detail.py +113 -0
- testerkit/ui/pages/profiles/list.py +86 -0
- testerkit/ui/pages/results/__init__.py +4 -0
- testerkit/ui/pages/results/detail.py +631 -0
- testerkit/ui/pages/results/list.py +230 -0
- testerkit/ui/pages/stations/__init__.py +4 -0
- testerkit/ui/pages/stations/detail.py +256 -0
- testerkit/ui/pages/stations/edit.py +273 -0
- testerkit/ui/pages/stations/list.py +180 -0
- testerkit/ui/pages/stations/new.py +311 -0
- testerkit/ui/pages/tests/__init__.py +4 -0
- testerkit/ui/pages/tests/detail.py +152 -0
- testerkit/ui/pages/tests/list.py +194 -0
- testerkit/ui/pages/uuts/__init__.py +4 -0
- testerkit/ui/pages/uuts/list.py +97 -0
- testerkit/ui/shared/__init__.py +8 -0
- testerkit/ui/shared/components.py +1826 -0
- testerkit/ui/shared/dialogs.py +105 -0
- testerkit/ui/shared/event_binding.py +194 -0
- testerkit/ui/shared/layout.py +314 -0
- testerkit/ui/shared/services.py +1719 -0
- testerkit/ui/shared/timestamps.py +21 -0
- testerkit/ui/static/branding/favicon-16.png +0 -0
- testerkit/ui/static/branding/favicon-32.png +0 -0
- testerkit/ui/static/branding/favicon-48.png +0 -0
- testerkit/ui/static/branding/testerkit-icon-256.png +0 -0
- testerkit/ui/static/branding/testerkit-mark.svg +1 -0
- testerkit/ui/static/branding/testerkit-wordmark.svg +1 -0
- testerkit/ui/static/global.css +465 -0
- testerkit/utils/__init__.py +17 -0
- testerkit/utils/enum_meta.py +800 -0
- testerkit/utils/paths.py +75 -0
- testerkit/utils/ranges.py +257 -0
- testerkit/validation.py +82 -0
- testerkit/verbs.py +142 -0
- testerkit-0.4.0.dist-info/METADATA +250 -0
- testerkit-0.4.0.dist-info/RECORD +521 -0
- testerkit-0.4.0.dist-info/WHEEL +4 -0
- testerkit-0.4.0.dist-info/entry_points.txt +5 -0
- testerkit-0.4.0.dist-info/licenses/LICENSE +191 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# Fixtures
|
|
2
|
+
|
|
3
|
+
A **fixture** in TesterKit is a YAML file at `fixtures/<name>.yaml` that maps UUT pins to station instruments. It's the bridge that lets a test say "measure the voltage at pin `VOUT`" without knowing which DMM channel `VOUT` happens to be wired to on this particular bench.
|
|
4
|
+
|
|
5
|
+
> **Naming collision.** "Fixture" overloads. Throughout this page, "fixture" means **hardware test fixture** — the YAML pin-map. When the test signature has `def test_x(pins, dmm, verify): ...`, the names `pins`, `dmm`, `verify` are **pytest fixtures** — Python objects the [pytest plugin](../../reference/pytest/fixtures.md) synthesizes (in part from your hardware fixture YAML). When this page needs the pytest sense it says "pytest fixture".
|
|
6
|
+
|
|
7
|
+
## What fixtures model
|
|
8
|
+
|
|
9
|
+
Three things have to line up before a test can measure anything:
|
|
10
|
+
|
|
11
|
+
1. The **part** declares pins (`VIN`, `VOUT`, `GND`) and their measurable characteristics (output voltage, current draw, etc.).
|
|
12
|
+
2. The **station** declares instruments by role (`dmm`, `psu`, `eload`) and where each is physically connected (a VISA address, a serial port).
|
|
13
|
+
3. The **fixture** declares which station instrument (and channel) is currently wired to which part pin.
|
|
14
|
+
|
|
15
|
+
```mermaid
|
|
16
|
+
%%{init: {'flowchart': {'curve': 'stepBefore'}}}%%
|
|
17
|
+
flowchart LR
|
|
18
|
+
subgraph Part
|
|
19
|
+
VIN[VIN]
|
|
20
|
+
VOUT[VOUT]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
subgraph Fixture
|
|
24
|
+
F_VIN["VIN → psu.1"]
|
|
25
|
+
F_VOUT["VOUT → dmm"]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
subgraph Station
|
|
29
|
+
PSU[psu]
|
|
30
|
+
DMM[dmm]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
VIN --- F_VIN
|
|
34
|
+
VOUT --- F_VOUT
|
|
35
|
+
F_VIN --- PSU
|
|
36
|
+
F_VOUT --- DMM
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The fixture is the only piece that changes when you move a board from one bench to another. The part stays the same (it's the device). The station stays the same (it's the bench). The fixture re-maps which pins are on which channels — and every test runs unchanged.
|
|
40
|
+
|
|
41
|
+
This is also what makes a measurement traceable: every value flows through a named fixture connection (`VOUT`, not `dmm channel 1`), and the recorded measurement row carries the UUT-side name. Six months later you can ask "which board's `VOUT` was reading 3.5 V?" — the connection name is the join key.
|
|
42
|
+
|
|
43
|
+
## When you need a fixture
|
|
44
|
+
|
|
45
|
+
| Setup | Fixture? |
|
|
46
|
+
|---|---|
|
|
47
|
+
| One UUT, one bench, you remember which instrument is on which pin | Optional — the `dmm` / `psu` per-role pytest fixtures from your station YAML are enough |
|
|
48
|
+
| Multiple parts on the same bench, or one part across multiple benches | Required — the pin-map is what lets the test code stay portable |
|
|
49
|
+
| Multiple UUTs running in parallel | Required — see [Multi-UUT scaling](#multi-uut-scaling-sites-shared-instruments-switching) |
|
|
50
|
+
| Production traceability — every measurement records its UUT-side pin | Required — `uut_pin` is the connection field that flows into the parquet row |
|
|
51
|
+
|
|
52
|
+
For development without any fixture, see [Mock mode](../../how-to/configuration/mock-mode.md) and the per-role auto-fixtures in [TesterKit fixtures](../../reference/pytest/fixtures.md#per-role-auto-fixtures).
|
|
53
|
+
|
|
54
|
+
## Data model
|
|
55
|
+
|
|
56
|
+
A fixture YAML loads into a `FixtureConfig`. Two top-level shapes:
|
|
57
|
+
|
|
58
|
+
- **Single-UUT** — fields directly on the fixture
|
|
59
|
+
- **Multi-UUT** — `sites:` with one `FixtureSite` per UUT position
|
|
60
|
+
|
|
61
|
+
Both share the same `FixtureConnection` shape underneath.
|
|
62
|
+
|
|
63
|
+
### `FixtureConfig` fields
|
|
64
|
+
|
|
65
|
+
| Field | Description |
|
|
66
|
+
|---|---|
|
|
67
|
+
| `id` | Unique fixture identifier |
|
|
68
|
+
| `name` | Optional display name |
|
|
69
|
+
| `part_id` | Specific part this fixture is wired for (preferred) |
|
|
70
|
+
| `part_family` | Or part family — for fixtures that work for multiple parts in a line |
|
|
71
|
+
| `part_revision` | Optional — for fixtures that differ by board revision |
|
|
72
|
+
| `station_types` | Optional — abstract station-type layouts this fixture can wire against. Validated at session start against the active profile's `station_type`. Empty list = "any station". |
|
|
73
|
+
| `uut_resource` | Optional UUT-side connection string (a COM port, USB serial number, etc.) for tests that talk to the UUT directly |
|
|
74
|
+
| `connections` | UUT-pin ↔ instrument-channel pairings. Single-UUT shape. |
|
|
75
|
+
| `sites` | Ordered list of per-UUT-position connections for multi-UUT fixtures. Multi-UUT shape. |
|
|
76
|
+
| `description` | Free-form documentation |
|
|
77
|
+
|
|
78
|
+
`connections` and `sites` are mutually exclusive — a fixture that sets both is rejected.
|
|
79
|
+
|
|
80
|
+
### `FixtureConnection` fields
|
|
81
|
+
|
|
82
|
+
A connection is the addressable unit — a name that identifies one UUT-side signal path:
|
|
83
|
+
|
|
84
|
+
| Field | Description |
|
|
85
|
+
|---|---|
|
|
86
|
+
| `name` | The connection's identifier (test code uses this; parquet rows record this) |
|
|
87
|
+
| `instrument` | Station role (must match a key in `station.instruments`) |
|
|
88
|
+
| `instrument_channel` | Channel on the instrument (`"1"`, `"CH2"`, `"ai0"`) |
|
|
89
|
+
| `instrument_terminal` | Physical terminal on the channel (`hi`, `lo`, `sense_hi`, `sense_lo`, `signal`). Optional. |
|
|
90
|
+
| `uut_pin` | Part pin this connection is wired to (must match a `pins.<name>` key in the part spec) |
|
|
91
|
+
| `net` | Schematic net name. Alternative to `uut_pin` when matching by net rather than physical pin. |
|
|
92
|
+
| `function` | Optional [`MeasurementFunction`](capabilities.md#measurementfunction) the connection is for. When set, the resolver matches by `(uut_pin, function)` — see [Function as a routing dimension](#function-as-a-routing-dimension). |
|
|
93
|
+
| `route` | Optional `SwitchRoute` for switched signal paths — see [Switched routing](#switched-routing). |
|
|
94
|
+
| `description` | Free-form documentation |
|
|
95
|
+
|
|
96
|
+
## Single-UUT shape
|
|
97
|
+
|
|
98
|
+
The simplest fixture: each UUT pin gets one connection, one instrument, one channel.
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
# fixtures/power_board_fixture.yaml
|
|
102
|
+
id: power_board_fixture
|
|
103
|
+
name: "Power Board Test Fixture"
|
|
104
|
+
part_id: power_board
|
|
105
|
+
|
|
106
|
+
connections:
|
|
107
|
+
VIN:
|
|
108
|
+
name: VIN
|
|
109
|
+
uut_pin: VIN
|
|
110
|
+
net: VIN_5V
|
|
111
|
+
instrument: psu
|
|
112
|
+
instrument_channel: "1"
|
|
113
|
+
instrument_terminal: hi
|
|
114
|
+
VOUT:
|
|
115
|
+
name: VOUT
|
|
116
|
+
uut_pin: VOUT
|
|
117
|
+
net: VOUT_3V3
|
|
118
|
+
instrument: dmm
|
|
119
|
+
instrument_channel: "CH1"
|
|
120
|
+
GND:
|
|
121
|
+
name: GND
|
|
122
|
+
uut_pin: GND
|
|
123
|
+
instrument: psu
|
|
124
|
+
instrument_channel: "GND"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
A test addresses each connection by its `uut_pin` through the `pins` [pytest fixture](../../reference/pytest/fixtures.md#pins-session):
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
def test_output_voltage(pins, verify):
|
|
131
|
+
pins["VIN"].set_voltage(5.0)
|
|
132
|
+
pins["VIN"].enable_output()
|
|
133
|
+
verify("output_voltage", pins["VOUT"].measure_voltage())
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
`pins["VIN"]` resolves to the connected `psu` instrument (because the fixture says `VIN → psu`). The measurement row records `uut_pin=VIN`, the connection's `instrument_channel`, and the resolved instrument identity — the test body never sees those details.
|
|
137
|
+
|
|
138
|
+
## How a measurement reaches the row
|
|
139
|
+
|
|
140
|
+
When `verify("output_voltage", pins["VOUT"].measure_voltage())` runs:
|
|
141
|
+
|
|
142
|
+
1. `pins["VOUT"]` looks up the fixture connection named `VOUT` → finds `{instrument: dmm, instrument_channel: "CH1"}`.
|
|
143
|
+
2. It finds the `dmm` on the bench and runs `measure_voltage()` on channel `CH1`.
|
|
144
|
+
3. `verify()` records the measurement row. Because the active connection is `VOUT`, the row carries `uut_pin=VOUT`, `instrument_channel=CH1`, and the resolved `instrument_name` / `instrument_resource` automatically.
|
|
145
|
+
|
|
146
|
+
That auto-population is the traceability payoff: tests stay clean, parquet rows know exactly which signal path each measurement came through.
|
|
147
|
+
|
|
148
|
+
## Routing one pin to different instruments by measurement
|
|
149
|
+
|
|
150
|
+
One UUT pin can route to different instruments depending on what you're measuring. Set `function:` on each connection and TesterKit picks the connection whose `(pin, function)` matches, instead of pin alone:
|
|
151
|
+
|
|
152
|
+
```yaml
|
|
153
|
+
connections:
|
|
154
|
+
vout_dc:
|
|
155
|
+
name: vout_dc
|
|
156
|
+
uut_pin: VOUT
|
|
157
|
+
function: dc_voltage # DMM measures the DC level
|
|
158
|
+
instrument: dmm
|
|
159
|
+
vout_ac:
|
|
160
|
+
name: vout_ac
|
|
161
|
+
uut_pin: VOUT
|
|
162
|
+
function: ac_voltage # Scope captures the ripple
|
|
163
|
+
instrument: scope
|
|
164
|
+
instrument_channel: "1"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
A test asking for `VOUT` with no function context falls back to first-match by pin. A test bound to a specific characteristic (via `testerkit_characteristics`) picks the connection whose `function` matches.
|
|
168
|
+
|
|
169
|
+
When `function` is unset, the first connection for that pin is used.
|
|
170
|
+
|
|
171
|
+
## Multi-UUT scaling: sites, shared instruments, switching
|
|
172
|
+
|
|
173
|
+
Three independent features scale the single-UUT shape to multiple boards:
|
|
174
|
+
|
|
175
|
+
### Sites — parallel UUT positions
|
|
176
|
+
|
|
177
|
+
A **site** is one parallel UUT position on the bench — the same concept STDF calls `SITE_NUM` and NI TestStand calls a "test socket." When the bench has multiple identical positions and you test them in parallel, use `sites` instead of `connections`. Sites are an ordered list; each site has its own `FixtureConnection` map and an optional `name`:
|
|
178
|
+
|
|
179
|
+
```yaml
|
|
180
|
+
# fixtures/dual_board_fixture.yaml
|
|
181
|
+
id: dual_board_fixture
|
|
182
|
+
part_family: power_board
|
|
183
|
+
|
|
184
|
+
sites:
|
|
185
|
+
- name: left
|
|
186
|
+
description: Left-side board
|
|
187
|
+
uut_resource: /dev/ttyUSB0
|
|
188
|
+
connections:
|
|
189
|
+
vout_measure:
|
|
190
|
+
name: vout_measure
|
|
191
|
+
uut_pin: VOUT
|
|
192
|
+
instrument: dmm
|
|
193
|
+
instrument_channel: "1"
|
|
194
|
+
- name: right
|
|
195
|
+
description: Right-side board
|
|
196
|
+
uut_resource: /dev/ttyUSB1
|
|
197
|
+
connections:
|
|
198
|
+
vout_measure:
|
|
199
|
+
name: vout_measure
|
|
200
|
+
uut_pin: VOUT
|
|
201
|
+
instrument: dmm
|
|
202
|
+
instrument_channel: "2"
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
TesterKit runs each site in parallel; each site's test sees only its own connections. A site's 0-based position in the list is its `site_index` — **never authored**, always the list position, so there's no field to typo or get out of sync with the actual order. This is the same shape as a bare single-UUT fixture: `connections:` directly on the fixture is site_index 0 with no list around it. `connections` and `sites` are two views of one model, not two separate features — the list is what makes a fixture multi-site, and its length is the site count. There's no way to declare a gap in the list; a site exists because it has an entry.
|
|
206
|
+
|
|
207
|
+
`name:` is an optional human label ("left", "right") for a site that otherwise has no identity beyond its index — it's frozen onto every row that site produces, so renaming a site in the fixture YAML later doesn't change what a historical run's rows say. Fixture loading rejects a bare-integer name (`name: "1"`) with a clear error: `--site` and `--uut-serials` resolve a token as an index first and a name second, so a numeric name would be unreachable (shadowed by the index it looks like) rather than silently wrong. Use a non-numeric label (`"S1"`, `"pos1"`) if you need a silkscreen-style number.
|
|
208
|
+
|
|
209
|
+
Per-site `uut_resource` overrides the fixture-level value. See [Multi-UUT testing](../../how-to/execution/multi-uut-testing.md) for the operational guide — CLI serial assignment, per-site parquet columns, and the events that carry `site_index` / `site_name`.
|
|
210
|
+
|
|
211
|
+
### Shared instruments
|
|
212
|
+
|
|
213
|
+
When multiple sites reference the same instrument role (e.g. both sites' `dmm` connections point at the bench's single DMM), TesterKit treats it as a **shared** instrument. It connects once and shares it across the parallel site workers — each one calls it as if it owned it.
|
|
214
|
+
|
|
215
|
+
Locking is per **resource** (the VISA address, COM port, or other connection identifier), so roles sharing one physical connection take turns, while roles on separate connections run at the same time.
|
|
216
|
+
|
|
217
|
+
### Switched routing
|
|
218
|
+
|
|
219
|
+
For a single instrument fanned out to multiple UUT positions through a relay matrix, add a `SwitchRoute` to the connection. The platform closes the listed switch channels before activating the instrument, waits the settling time, then runs the measurement:
|
|
220
|
+
|
|
221
|
+
```yaml
|
|
222
|
+
- name: left
|
|
223
|
+
connections:
|
|
224
|
+
vout_measure:
|
|
225
|
+
name: vout_measure
|
|
226
|
+
uut_pin: VOUT
|
|
227
|
+
instrument: dmm
|
|
228
|
+
route:
|
|
229
|
+
switch: matrix # role of the switch instrument
|
|
230
|
+
channels: ["r0c0"] # crosspoints to close
|
|
231
|
+
settling_ms: 10
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Switch routes activate on demand — the first time a test touches that instrument, TesterKit closes the listed switch channels, waits the settling time, then takes the measurement. Multiple sites can share one instrument through different routes. Switches (instruments with `type: switch`) are exempt from the take-turns locking — closing channels in parallel is the point of the matrix.
|
|
235
|
+
|
|
236
|
+
## Selecting a fixture at run time
|
|
237
|
+
|
|
238
|
+
Stations do not pin a fixture themselves. The active fixture is chosen per session via the `--fixture` CLI flag (or a [profile](../../how-to/execution/profiles.md) that sets it):
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
pytest tests/ \
|
|
242
|
+
--station=bench_1 \
|
|
243
|
+
--fixture=fixtures/power_board_fixture.yaml \
|
|
244
|
+
--uut-serial=SN001
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
The fixture's `part_id` / `part_family` are scoping fields — the resolver uses them to pick the right fixture when multiple are present, but the plugin does not currently cross-check them against the active part spec.
|
|
248
|
+
|
|
249
|
+
## Worked example
|
|
250
|
+
|
|
251
|
+
A complete single-UUT setup, four files:
|
|
252
|
+
|
|
253
|
+
```yaml
|
|
254
|
+
# parts/power_board.yaml
|
|
255
|
+
id: power_board
|
|
256
|
+
pins:
|
|
257
|
+
VIN: {name: "J1.1", role: power}
|
|
258
|
+
VOUT: {name: "J1.3", role: signal}
|
|
259
|
+
GND: {name: "J1.2", role: ground}
|
|
260
|
+
characteristics:
|
|
261
|
+
output_voltage:
|
|
262
|
+
function: dc_voltage
|
|
263
|
+
direction: output
|
|
264
|
+
unit: V
|
|
265
|
+
pin: VOUT
|
|
266
|
+
bands:
|
|
267
|
+
- value: 3.3
|
|
268
|
+
accuracy: {pct_reading: 5}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
```yaml
|
|
272
|
+
# stations/bench_1.yaml
|
|
273
|
+
id: bench_1
|
|
274
|
+
instruments:
|
|
275
|
+
psu:
|
|
276
|
+
type: psu
|
|
277
|
+
driver: pymeasure.instruments.keysight.KeysightE36312A
|
|
278
|
+
resource: "GPIB0::5::INSTR"
|
|
279
|
+
dmm:
|
|
280
|
+
type: dmm
|
|
281
|
+
driver: pymeasure.instruments.keysight.Keysight34461A
|
|
282
|
+
resource: "TCPIP::192.168.1.100::INSTR"
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
```yaml
|
|
286
|
+
# fixtures/power_board_fixture.yaml
|
|
287
|
+
id: power_board_fixture
|
|
288
|
+
part_id: power_board
|
|
289
|
+
connections:
|
|
290
|
+
VIN:
|
|
291
|
+
name: VIN
|
|
292
|
+
uut_pin: VIN
|
|
293
|
+
instrument: psu
|
|
294
|
+
instrument_channel: "1"
|
|
295
|
+
VOUT:
|
|
296
|
+
name: VOUT
|
|
297
|
+
uut_pin: VOUT
|
|
298
|
+
instrument: dmm
|
|
299
|
+
GND:
|
|
300
|
+
name: GND
|
|
301
|
+
uut_pin: GND
|
|
302
|
+
instrument: psu
|
|
303
|
+
instrument_channel: "GND"
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
```python
|
|
307
|
+
# tests/test_power_board.py
|
|
308
|
+
def test_output_voltage(pins, verify):
|
|
309
|
+
pins["VIN"].set_voltage(5.0)
|
|
310
|
+
pins["VIN"].enable_output()
|
|
311
|
+
verify("output_voltage", pins["VOUT"].measure_voltage())
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Run it:
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
pytest tests/ \
|
|
318
|
+
--part=parts/power_board.yaml \
|
|
319
|
+
--station=stations/bench_1.yaml \
|
|
320
|
+
--fixture=fixtures/power_board_fixture.yaml \
|
|
321
|
+
--uut-serial=SN001
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
The recorded measurement row carries `uut_pin=VOUT`, `instrument_name=dmm`, `characteristic_id=output_voltage` — all pulled through the fixture connection automatically.
|
|
325
|
+
|
|
326
|
+
## See also
|
|
327
|
+
|
|
328
|
+
- [Parts](parts.md) — what pins and characteristics get declared on the UUT side
|
|
329
|
+
- [Stations](stations.md) — what instruments and roles get declared on the bench side
|
|
330
|
+
- [Capabilities](capabilities.md) — the function / direction / signal model that drives matching (and the `function:` field on connections)
|
|
331
|
+
- [Tutorial step 9 — Production ready](../../tutorial/09-production.md) — first hands-on with fixtures + sidecar config
|
|
332
|
+
- [How-to — Configuring stations](../../how-to/configuration/configuring-stations.md) — the station YAML reference
|
|
333
|
+
- [How-to — Multi-UUT testing](../../how-to/execution/multi-uut-testing.md) — sites, shared instruments, parallel workers in practice
|
|
334
|
+
- [TesterKit fixtures](../../reference/pytest/fixtures.md) — the `pins`, `instruments`, `instrument`, `fixture_manager`, `connections` pytest fixtures that read this YAML
|
|
335
|
+
- [Configuration reference](../../reference/configuration.md) — fixture YAML schema field-by-field
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Concepts — Configuration
|
|
2
|
+
|
|
3
|
+
The UUT-to-instrument model. Parts and stations are YAML entities you author once; fixtures wire one part's pins to one station's instruments; capabilities are how the matcher pairs them up.
|
|
4
|
+
|
|
5
|
+
- [Parts](parts.md) — what you're testing: part number, revision, pins, characteristics, specs
|
|
6
|
+
- [Stations](stations.md) — where you test: the instruments on a bench plus their roles
|
|
7
|
+
- [Capabilities](capabilities.md) — what an instrument can do (function + direction + signals), and how the matcher uses that to answer "can this station test this part?"
|
|
8
|
+
- [Fixtures](fixtures.md) — the wiring between a part's pins and a station's instrument channels
|
|
9
|
+
|
|
10
|
+
## See also
|
|
11
|
+
|
|
12
|
+
- [How-to → Configuring stations](../../how-to/configuration/configuring-stations.md) — task recipe for writing station YAML
|
|
13
|
+
- [Reference → Configuration](../../reference/configuration.md) — the YAML schemas (generated from the Pydantic models)
|
|
14
|
+
- [Reference → Catalog schema](../../reference/catalog/schema.md) — how catalog entries define instrument capabilities
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# Parts
|
|
2
|
+
|
|
3
|
+
A **Part** is what you're testing — a PCB, module, or device. Part specs define the physical interface and electrical characteristics that need to be tested.
|
|
4
|
+
|
|
5
|
+
## Part Specification
|
|
6
|
+
|
|
7
|
+
Part specs are defined in YAML files, in `parts/{part_id}.yaml`:
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
# parts/power_board.yaml
|
|
11
|
+
id: power_board
|
|
12
|
+
name: "5V to 3.3V Converter"
|
|
13
|
+
part_number: "DPB-001"
|
|
14
|
+
revision: "A"
|
|
15
|
+
|
|
16
|
+
pins:
|
|
17
|
+
VIN:
|
|
18
|
+
name: "J1.1"
|
|
19
|
+
net: "VIN_5V"
|
|
20
|
+
role: power
|
|
21
|
+
VOUT:
|
|
22
|
+
name: "J1.3"
|
|
23
|
+
net: "VOUT_3V3"
|
|
24
|
+
role: signal
|
|
25
|
+
characteristics:
|
|
26
|
+
input_voltage:
|
|
27
|
+
direction: input # UUT receives this
|
|
28
|
+
function: dc_voltage
|
|
29
|
+
unit: V
|
|
30
|
+
pins: [VIN]
|
|
31
|
+
bands:
|
|
32
|
+
- value: 5.0
|
|
33
|
+
accuracy:
|
|
34
|
+
pct_reading: 10 # ±10% tolerance
|
|
35
|
+
|
|
36
|
+
output_voltage:
|
|
37
|
+
direction: output # UUT provides this
|
|
38
|
+
function: dc_voltage
|
|
39
|
+
unit: V
|
|
40
|
+
pins: [VOUT]
|
|
41
|
+
bands:
|
|
42
|
+
- value: 3.3
|
|
43
|
+
accuracy:
|
|
44
|
+
pct_reading: 5 # ±5% tolerance
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Pins
|
|
48
|
+
|
|
49
|
+
**Pins** represent physical connection points on the UUT — connectors, test points, or pads.
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
pins:
|
|
53
|
+
VIN:
|
|
54
|
+
name: "J1.1" # Physical designator
|
|
55
|
+
net: "VIN_5V" # Schematic net name
|
|
56
|
+
role: power
|
|
57
|
+
VOUT:
|
|
58
|
+
name: "J1.3"
|
|
59
|
+
net: "VOUT_3V3"
|
|
60
|
+
role: signal
|
|
61
|
+
SDA:
|
|
62
|
+
name: "J2.1"
|
|
63
|
+
net: "I2C_SDA"
|
|
64
|
+
role: signal
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Pin Types
|
|
68
|
+
|
|
69
|
+
| Role | Description |
|
|
70
|
+
|------|-------------|
|
|
71
|
+
| `signal` | General measured/stimulated signal (default) |
|
|
72
|
+
| `ground` | Current return / reference |
|
|
73
|
+
| `power` | Power input/output (VIN, VOUT) |
|
|
74
|
+
| `reference` | Voltage reference, not driven |
|
|
75
|
+
|
|
76
|
+
## Characteristics
|
|
77
|
+
|
|
78
|
+
**Characteristics** are measurable properties of the part. Each one is written with these keys:
|
|
79
|
+
|
|
80
|
+
- **`direction`** — does the UUT provide or receive this? (`input` / `output` / `bidir`)
|
|
81
|
+
- **`function`** — the measurement function (`dc_voltage`, `ac_voltage`, …); see [MeasurementFunction](../../reference/configuration.md)
|
|
82
|
+
- **`unit`** — the engineering unit (`V`, `mV`, `A`, …)
|
|
83
|
+
- **`pins`** — which pin(s) the measurement is taken on
|
|
84
|
+
- **`bands`** — expected values and tolerances, per operating point
|
|
85
|
+
|
|
86
|
+
### Direction Matters
|
|
87
|
+
|
|
88
|
+
The `direction` field describes the UUT's perspective:
|
|
89
|
+
|
|
90
|
+
| Direction | Meaning | Instrument Needs |
|
|
91
|
+
|-----------|---------|------------------|
|
|
92
|
+
| `input` | UUT receives power/signal | Instrument must **source** |
|
|
93
|
+
| `output` | UUT provides power/signal | Instrument must **measure** |
|
|
94
|
+
| `bidir` | UUT both receives and provides | Instrument must do both |
|
|
95
|
+
|
|
96
|
+
### Multiple Characteristics Per Pin
|
|
97
|
+
|
|
98
|
+
A single pin can have multiple characteristics:
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
pins:
|
|
102
|
+
VOUT:
|
|
103
|
+
name: "J1.3"
|
|
104
|
+
role: signal
|
|
105
|
+
characteristics:
|
|
106
|
+
output_voltage:
|
|
107
|
+
pins: [VOUT]
|
|
108
|
+
direction: output
|
|
109
|
+
function: dc_voltage
|
|
110
|
+
unit: V
|
|
111
|
+
bands:
|
|
112
|
+
- value: 3.3
|
|
113
|
+
accuracy:
|
|
114
|
+
pct_reading: 5
|
|
115
|
+
|
|
116
|
+
output_ripple:
|
|
117
|
+
pins: [VOUT] # Same pin, different measurement
|
|
118
|
+
direction: output
|
|
119
|
+
function: ac_voltage
|
|
120
|
+
unit: mV
|
|
121
|
+
bands:
|
|
122
|
+
- value: 0
|
|
123
|
+
accuracy:
|
|
124
|
+
absolute: 50
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Specifications with Conditions
|
|
128
|
+
|
|
129
|
+
Each characteristic has one or more **spec bands** (the entries under `bands:`) that define expected values at specific operating conditions:
|
|
130
|
+
|
|
131
|
+
```yaml
|
|
132
|
+
characteristics:
|
|
133
|
+
output_voltage:
|
|
134
|
+
direction: output
|
|
135
|
+
function: dc_voltage
|
|
136
|
+
unit: V
|
|
137
|
+
pins: [VOUT]
|
|
138
|
+
bands:
|
|
139
|
+
- when:
|
|
140
|
+
temperature: {min: 0, max: 50}
|
|
141
|
+
load: {min: 0.1, max: 0.5}
|
|
142
|
+
value: 3.3
|
|
143
|
+
accuracy:
|
|
144
|
+
pct_reading: 5 # ±5% tolerance
|
|
145
|
+
|
|
146
|
+
- when:
|
|
147
|
+
temperature: {min: 50, max: 85}
|
|
148
|
+
load: {min: 0.5, max: 1.0}
|
|
149
|
+
value: 3.3
|
|
150
|
+
accuracy:
|
|
151
|
+
pct_reading: 7 # Wider tolerance at high temp
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Accuracy Options
|
|
155
|
+
|
|
156
|
+
| Field | Description |
|
|
157
|
+
|-------|-------------|
|
|
158
|
+
| `pct_reading` | Percentage of the measured value |
|
|
159
|
+
| `pct_range` | Percentage of the full range |
|
|
160
|
+
| `absolute` | Fixed absolute tolerance value |
|
|
161
|
+
|
|
162
|
+
Multiple accuracy components can be combined (e.g., `pct_reading: 1.0, absolute: 0.01` means ±(1% of reading + 0.01)).
|
|
163
|
+
|
|
164
|
+
## Signal Groups (Buses)
|
|
165
|
+
|
|
166
|
+
Group related signals for protocols like I2C, SPI, or UART:
|
|
167
|
+
|
|
168
|
+
```yaml
|
|
169
|
+
pins:
|
|
170
|
+
SDA:
|
|
171
|
+
name: "J2.1"
|
|
172
|
+
role: signal
|
|
173
|
+
SCL:
|
|
174
|
+
name: "J2.2"
|
|
175
|
+
role: signal
|
|
176
|
+
signal_groups:
|
|
177
|
+
i2c_main:
|
|
178
|
+
protocol: i2c
|
|
179
|
+
signals:
|
|
180
|
+
- pin: SDA
|
|
181
|
+
role: data
|
|
182
|
+
- pin: SCL
|
|
183
|
+
role: clock
|
|
184
|
+
parameters:
|
|
185
|
+
frequency: 400000
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Minimal Spec
|
|
189
|
+
|
|
190
|
+
The simplest spec that works:
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
id: minimal_board
|
|
194
|
+
name: "Minimal Example"
|
|
195
|
+
|
|
196
|
+
pins:
|
|
197
|
+
VOUT:
|
|
198
|
+
name: "J1.1"
|
|
199
|
+
|
|
200
|
+
characteristics:
|
|
201
|
+
output_voltage:
|
|
202
|
+
direction: output
|
|
203
|
+
function: dc_voltage
|
|
204
|
+
unit: V
|
|
205
|
+
pins: [VOUT]
|
|
206
|
+
bands:
|
|
207
|
+
- value: 5.0
|
|
208
|
+
accuracy:
|
|
209
|
+
pct_reading: 10
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Part Numbers
|
|
213
|
+
|
|
214
|
+
The `part_number` field is the manufacturing part number — the one printed or scanned on the unit. When set, every test result records it as `uut_part_number`, the operator-facing identifier (distinct from the internal `part_id`). You can override it per run with `--uut-part-number`, then filter yield by part number. See [traceability](../../how-to/execution/traceability.md).
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
id: power_board
|
|
218
|
+
part_number: "DPB-001"
|
|
219
|
+
name: "5V to 3.3V Converter"
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Variant Inheritance
|
|
223
|
+
|
|
224
|
+
Part families can share specs using the `base` field. A variant inherits all fields from its base part and overrides specific sections:
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
# parts/power_board_industrial.yaml
|
|
228
|
+
id: power_board_industrial
|
|
229
|
+
base: power_board # Inherits from parts/power_board.yaml
|
|
230
|
+
part_number: "DPB-001-IND"
|
|
231
|
+
name: "5V to 3.3V Converter (Industrial)"
|
|
232
|
+
|
|
233
|
+
# Omitted sections (pins, signal_groups) are inherited from base.
|
|
234
|
+
# Sections that ARE present replace the base entirely:
|
|
235
|
+
characteristics:
|
|
236
|
+
output_voltage:
|
|
237
|
+
direction: output
|
|
238
|
+
function: dc_voltage
|
|
239
|
+
unit: V
|
|
240
|
+
pins: [VOUT]
|
|
241
|
+
bands:
|
|
242
|
+
- value: 3.3
|
|
243
|
+
accuracy:
|
|
244
|
+
pct_reading: 3 # Tighter tolerance for industrial
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Inheritance rules:
|
|
248
|
+
- **Header fields** (`name`, `description`, `revision`, `part_number`, `datasheet`, `schematic`, `driver`) — inherited when absent in variant
|
|
249
|
+
- **Sections** (`pins`, `characteristics`, `signal_groups`) — variant replaces entirely if present, otherwise inherited
|
|
250
|
+
- `id` and `base` always come from the variant
|
|
251
|
+
- Max inheritance depth: 5 levels. Circular references raise an error.
|
|
252
|
+
|
|
253
|
+
## Loading Parts
|
|
254
|
+
|
|
255
|
+
In Python:
|
|
256
|
+
|
|
257
|
+
```python
|
|
258
|
+
from pathlib import Path
|
|
259
|
+
|
|
260
|
+
from testerkit.store import load_part
|
|
261
|
+
|
|
262
|
+
part = load_part(Path("parts/power_board.yaml"))
|
|
263
|
+
print(part.id)
|
|
264
|
+
# Nominal lives on each SpecBand, not on the characteristic itself.
|
|
265
|
+
# Resolve the right band for the current operating point:
|
|
266
|
+
char = part.characteristics["output_voltage"]
|
|
267
|
+
band = char.get_spec_at({"temperature": 25, "load": 0.5})
|
|
268
|
+
if band is not None:
|
|
269
|
+
print(band.value)
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## Next Steps
|
|
273
|
+
|
|
274
|
+
- [Stations](stations.md) — Configuring test benches
|
|
275
|
+
- [Capabilities](capabilities.md) — Understanding capability matching
|
|
276
|
+
- [Configuration Reference](../../reference/configuration.md) — YAML schema details
|