| name | analyses-snapshot-testing |
| description | Conventions for the analyses snapshot testing framework in analyses-snapshot-testing/. Use when working with protocol analysis snapshots, adding protocols, updating snapshots, or running snapshot tests. |
Analyses Snapshot Testing Instructions
Overview
The analyses-snapshot-testing directory validates that protocol analysis output remains consistent across code changes by comparing JSON results against committed snapshots.
- Regression testing: Detect unintended changes in protocol analysis behavior
- Protocol validation: Ensure protocols analyze correctly for OT-2
- CI/CD: Automated testing in GitHub Actions with matrix-based parallel execution
- Snapshot management: Track expected output and flag deviations
Architecture
Core Components
- Protocol Files (
files/protocols/) — testing protocols organized by source (standard, Protocol Designer exports, Protocol Library imports, generators)
- Analysis Engine (
automation/analyze.py) — runs protocol analysis in subprocess, 120-second timeout, JSON output
- Snapshot Storage (
tests/__snapshots__/) — committed JSON snapshots managed by syrupy with custom JSON extension
- Test Suite (
tests/) — analyses_snapshot_test.py (main), audit_snapshot_test.py (audit), custom_json_snapshot_extension.py (serialization)
- Audit (
automation/audit_snapshots.py) — validates snapshots: OT2_S protocols must have zero errors; OT2_X protocols are expected to have errors
- Protocol Registry (
automation/data/) — protocols.py (auto-generated), protocols_with_overrides.py (manual), protocol_registry.py (combined)
- CI/CD (
citools/, .github/workflows/) — matrix-based parallel execution via Docker
Protocol Naming Convention
{Robot}_{Status}_{Version}_{Source}_{Pipettes}_{Modules}_{Overrides}\_{Description}
- Robot:
OT2
- Status:
S (Success) or X (Failure expected)
- Version: API version (e.g.,
v2_19) or PD (Protocol Designer)
- Source (optional):
PL_ (Protocol Library) or MPL_ (Manual Protocol Library)
- Pipettes: e.g.,
P1000M_P50M
- Modules:
GRIP, HS, MM, MB, TC, TM
- Overrides:
Overrides if protocol has parameter overrides
- Description: Max 25 characters
Example: OT2_S_v2_19_P300M_P20S_HS_TC_TM_SmokeTestV3.py
Development Workflow
Adding New Protocols
- Create protocol file in
files/protocols/ following naming convention
- Run
make prep (auto-updates automation/data/protocols.py, displays snapshot command)
- Generate snapshots:
make snapshot-test-update PROTOCOL_NAMES=YourProtocolName OVERRIDE_PROTOCOL_NAMES=none
- Commit protocol file + snapshot + updated
protocols.py
Adding Override Protocols
- Create generator in
files/protocols/generators/
- Add entry to
automation/data/protocols_with_overrides.py
- Generate snapshots:
make snapshot-test-update PROTOCOL_NAMES=none OVERRIDE_PROTOCOL_NAMES=YourOverrideProtocol
- Commit generator + snapshot + updated registry
Updating Snapshots
make snapshot-test-update
make snapshot-test-update PROTOCOL_NAMES="P1,P2" OVERRIDE_PROTOCOL_NAMES=none
Running Tests Locally
make snapshot-test
make snapshot-test PROTOCOL_NAMES=OT2_S_v2_7_P20S_None_Walkthrough OVERRIDE_PROTOCOL_NAMES=none
uv run python -m pytest -k analyses_snapshot_test -vv --tb=short
Code Modification Guidelines
When Modifying Analysis Logic (api/, shared-data/)
- Run snapshot tests to detect changes
- Review diffs carefully
- Update snapshots only if changes are intentional
- Document breaking changes in commit messages
Protocol Registry (automation/data/protocols.py)
- DO NOT manually edit — auto-generated by
make prep
- Regenerate after adding/removing protocols
Snapshot Extension (tests/custom_json_snapshot_extension.py)
- Normalizes timestamps, IDs, file paths for stable comparisons
- Add new normalization rules to
replacement_patterns
- Add new ID-like fields to
id_keys_to_replace
Environment Setup
Prerequisites: Python 3.12, uv, Node.js/pnpm (for prettier)
cd analyses-snapshot-testing
make setup
The setup script (bootstrap_uv_env.py) installs api and shared-data as editable packages so analysis uses local code.
Common Commands
make setup
make teardown
make snapshot-test
make snapshot-test-update
make snapshot-audit-test
make prep
make generate-protocols
make format
make ruff
make gen-chunks
make analyze-chunk CHUNK=chunk_0.json
CI/CD Integration
Workflow (analyses-snapshot-test.yaml) triggers on:
- PRs affecting
api/, shared-data/, or this directory
- Scheduled daily at 7:26 AM UTC
- Manual dispatch
PR label gen-analyses-snapshot-pr auto-opens a PR with updated snapshots on failure.
Troubleshooting
- Snapshot mismatch: Review diff, update if intentional (
make snapshot-test-update PROTOCOL_NAMES=...), fix code if not
- Protocol not found: Check registry, run
make prep, verify file exists and follows naming convention
- Analysis timeout (120s): Simplify protocol or increase timeout in
automation/analyze.py
- Environment issues: Run
make setup, ensure uv is installed