# Screenshot Tests

> Use when writing or running Paparazzi screenshot tests in stripe-android — covers PaparazziRule setup, recording/verifying commands, and test structure

- Skill: `tomevault-io/screenshot-tests` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/screenshot-tests`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/screenshot-tests/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/screenshot-tests

---


# Screenshot Tests (Paparazzi)

We use [Paparazzi](https://github.com/cashapp/paparazzi) for screenshot testing via the `screenshot-testing` module.

## Recording Screenshots

Record (update) screenshots after UI changes:

```bash
./gradlew :<module>:recordPaparazziDebug
```

To record a specific test class only:

```bash
./gradlew :<module>:recordPaparazziDebug --tests "com.stripe.android.package.MyScreenshotTest"
```

Wildcard form also works:

```bash
./gradlew :<module>:recordPaparazziDebug --tests "*.MyScreenshotTest"
```

New or updated screenshots are written to `<module>/src/test/snapshots/images/` and added to the Git staging area.

## Verifying Screenshots

Verify screenshots match recorded baselines (used on CI):

```bash
./gradlew :<module>:verifyPaparazziDebug
```

Failure diffs are written to `<module>/out/failures` (git-ignored).

## Test Class Structure

```kotlin
internal class MyScreenshotTest {

    @get:Rule
    val paparazziRule = PaparazziRule(
        SystemAppearance.entries,        // Light/Dark
        PaymentSheetAppearance.entries,  // Default/Custom/Crazy appearances
        FontSize.entries,                // Default/Large font
        boxModifier = Modifier.padding(horizontal = 16.dp),
    )

    @Test
    fun testDefault() {
        paparazziRule.snapshot {
            MyComposable(/* ... */)
        }
    }
}
```

- `PaparazziRule` generates all permutations of the config options automatically.
- Each test produces one snapshot per permutation (e.g., 12 images for 2 themes x 3 appearances x 2 font sizes).
- Snapshots are named `<package>_<class>_<method>[<permutation>].png`.

## Available Config Options

| Option | Values | Import |
|--------|--------|--------|
| `SystemAppearance` | `LightTheme`, `DarkTheme` | `com.stripe.android.screenshottesting` |
| `FontSize` | `DefaultFont`, `LargeFont` | `com.stripe.android.screenshottesting` |
| `PaymentSheetAppearance` | `DefaultAppearance`, `CustomAppearance`, `CrazyAppearance` | `com.stripe.android.utils.screenshots` |

## Common Mistakes

- **Using `-Precord` or other flags** — Paparazzi uses a separate `recordPaparazziDebug` task, not a project property.
- **Running `testDebugUnitTest` to record** — this only _verifies_ against existing snapshots; use `recordPaparazziDebug` to update them.
- **Forgetting to commit updated snapshots** — recorded images go into `src/test/snapshots/images/` and must be committed.

---
> Source: [stripe/stripe-android](https://github.com/stripe/stripe-android) — distributed by [TomeVault](https://tomevault.io).
<!-- tomevault:4.0:skill_md:2026-07-02 -->

