Skip to main content

Snapshot Testing

This tutorial walks you through setting up and running snapshot tests for your component storybook. By the end, you'll have baseline screenshots for your components and know how to catch unintended visual changes.

Prerequisites​

That's it — Holt uses doco to run a Caddy server and headless Chrome inside Docker containers, so there's nothing else to install.

Step 1: Run Your First Snapshot Test​

From your project root (where holt.toml lives), run:

holt snapshot

You'll see output like:

Holt Visual Regression Testing
================================

Running trunk build...
Build complete: /path/to/dist

Processing 12 story variants...

[new] card/default (new baseline)
[new] card/fixed_width (new baseline)
...

================================
Results: 0 passed, 12 new

The first run creates baselines for every variant — there's nothing to compare against yet.

Step 2: Explore the Baseline Directory​

Check what was created:

ls -la tests/visual-baselines/

You'll see a directory structure like:

tests/visual-baselines/
├── card/
│ ├── default.png
│ ├── fixed_width.png
│ └── minimal.png
└── button/
├── default.png
└── secondary.png

Each story variant gets its own screenshot, organized by story name.

Step 3: Verify Baselines Pass​

Run the test again:

holt snapshot

Now you should see:

Processing 12 story variants...

[ok] card/default matches baseline
[ok] card/fixed_width matches baseline
...

================================
Results: 12 passed, 0 failed

All tests pass because the screenshots match the baselines.

Step 4: Make a Visual Change​

Let's see what happens when a component changes. Open one of your components and make a visible change — perhaps change a padding value, border color, or font size.

For example, if you have a Card component:

// Change this:
let base_classes = "rounded-lg border bg-card";
// To this:
let base_classes = "rounded-xl border-2 bg-card";

Step 5: See the Diff​

Run the snapshot tests again:

holt snapshot

For any changed component, a comparison window opens showing:

  • Baseline tab: The original screenshot
  • New Screenshot tab: What the component looks like now

You can toggle between views to spot the differences.

Step 6: Accept or Reject the Change​

In the comparison window:

  • Click Accept to update the baseline with the new screenshot
  • Click Reject to keep the old baseline (test stays failed)

If you accept, the baseline file is updated immediately.

On headless systems (SSH sessions, containers), Holt falls back to terminal mode — it opens both images in your default viewer and prompts you to accept or reject.

Step 7: Commit Your Baselines​

Baseline images should be committed to version control so CI can compare against them:

git add tests/visual-baselines/
git commit -m "Update baselines for card component"

Troubleshooting​

Docker not running​

Holt needs Docker to run the Caddy server and browser. Make sure the Docker daemon is running:

docker info

Comparison window doesn't open​

On headless systems (like SSH sessions), Holt falls back to terminal mode. It will print file paths and ask for yes/no input instead of showing a GUI.

Next Steps​