Skip to content

[Benchmark, reference only] Robolectric vs Compose Desktop preview screenshot tests - #903

Closed
takahirom wants to merge 1 commit into
tm/desktop-preview-review-fixesfrom
tm/bench-desktop-vs-robolectric
Closed

[Benchmark, reference only] Robolectric vs Compose Desktop preview screenshot tests#903
takahirom wants to merge 1 commit into
tm/desktop-preview-review-fixesfrom
tm/bench-desktop-vs-robolectric

Conversation

@takahirom

@takahirom takahirom commented Jul 18, 2026

Copy link
Copy Markdown
Owner

What

Reference benchmark setup and results comparing the Robolectric preview tests (latest beta) against the new Compose Desktop preview tests, on 30 identical commonMain previews in sample-generate-preview-tests-multiplatform (both generators enabled with separateOutputDirs, Robolectric forced to 4.17-beta-2).

This PR is intentionally closed without merging — it exists so the numbers and setup are reproducible when we need comparison evidence (docs, release notes, discussions).

Results

gradle-profiler 0.24.0, 2 warm-ups + 6 measured iterations each, warm daemon, configuration cache on, pixelCopyRenderMode=hardware, default sdk=[33] / Pixel4a qualifiers, Apple Silicon macOS:

Compose Desktop Robolectric 4.17-beta-2
record task total (mean of 6) 1.95 s (1.93–1.98) 7.42 s (7.27–7.59)
test suite time (30 tests) 0.96 s 6.31 s
first test (environment init) 0.52 s (Skia) 3.44 s (Robolectric env + resources)
per-preview steady state (median) 15 ms 89 ms

→ ~3.8x faster end-to-end for 30 previews; the per-preview steady state is ~6x, so the gap widens as suites grow.

Output fidelity notes

Both sides wrap to preview content (no window-sized captures). The images are not cross-comparable:

  • density 2.75 (Pixel4a) vs 1.0 (desktop ComposeUiTest default) — exactly 2.75x height difference
  • Roboto vs host font (different metrics, so width ratio is ~2.59x)
  • Android hardware pixel copy vs host Skia rendering

Per-platform goldens (via separateOutputDirs) are the intended workflow. The density gap could be closed later by applying preview parameters to the desktop capture (proposals/02 future work).

Reproduce

gradle-profiler --benchmark --project-dir . \
  --scenario-file sample-generate-preview-tests-multiplatform/preview-bench.scenarios \
  --iterations 6 --gradle-user-home ~/.gradle \
  -D org.gradle.java.installations.paths=<jdk17-path>

Summary by CodeRabbit

  • New Features

    • Added multiplatform Compose preview support for Android and desktop environments.
    • Added 30 sample previews for generating and evaluating preview screenshots.
    • Added benchmark scenarios for comparing preview generation performance across platforms.
  • Tests

    • Added automated preview screenshot generation and benchmark coverage for Robolectric and Compose Desktop.
    • Updated desktop test configuration for consistent JVM 17 execution.

@takahirom

Copy link
Copy Markdown
Owner Author

Closing as intended: this is a reference-only benchmark (setup + results + reproduction steps), not for merging. See the PR description for the numbers.

@takahirom takahirom closed this Jul 18, 2026
@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f60eb765-2db4-42b3-bc3a-85793e53f8d8

📥 Commits

Reviewing files that changed from the base of the PR and between afd1371 and 9422535.

📒 Files selected for processing (4)
  • sample-generate-preview-tests-multiplatform/build.gradle.kts
  • sample-generate-preview-tests-multiplatform/preview-bench.scenarios
  • sample-generate-preview-tests-multiplatform/src/commonMain/kotlin/com/github/takahirom/preview/tests/BenchmarkPreviews.kt
  • sample-generate-preview-tests-multiplatform/src/commonMain/kotlin/com/github/takahirom/preview/tests/Previews.kt

📝 Walkthrough

Walkthrough

The sample now contains 30 benchmark Compose previews and supports generating and benchmarking preview screenshot tests through both Robolectric and Compose Desktop/JVM targets.

Changes

Multiplatform preview benchmarks

Layer / File(s) Summary
Benchmark preview fixtures
sample-generate-preview-tests-multiplatform/src/commonMain/.../BenchmarkPreviews.kt, sample-generate-preview-tests-multiplatform/src/commonMain/.../Previews.kt
Adds 30 numbered @Preview composables and removes the previous preview examples and parameter provider.
Multiplatform generation and compilation wiring
sample-generate-preview-tests-multiplatform/build.gradle.kts
Enables Robolectric and Compose Desktop preview generation, configures separate outputs, adds the desktop JVM target and dependencies, and applies JVM 17 settings.
Benchmark execution scenarios
sample-generate-preview-tests-multiplatform/preview-bench.scenarios
Defines Robolectric and Desktop recording scenarios with cleanup tasks and two warm-up iterations.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Gradle
  participant PreviewGenerator
  participant BenchmarkPreviews
  participant ScreenshotTasks
  Gradle->>PreviewGenerator: enable Robolectric and Desktop preview generation
  PreviewGenerator->>BenchmarkPreviews: scan numbered `@Preview` composables
  PreviewGenerator->>ScreenshotTasks: generate recording tests
  ScreenshotTasks->>BenchmarkPreviews: render preview content
Loading

Possibly related PRs

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch tm/bench-desktop-vs-robolectric

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

Snapshot diff report

File name Image
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview20_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview05_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview09_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview17_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview15_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview00_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview28_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview13_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview19_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview14_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview29_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview10_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview18_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview27_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview06_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview24_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview07_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview12_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview26_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview03_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview01_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview11_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview25_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview23_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview22_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview02_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview16_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview04_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview21_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview08_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview20_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview05_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview09_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview17_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview15_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview00_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview28_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview13_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview19_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview14_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview29_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview10_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview18_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview27_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview06_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview24_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview07_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview12_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview26_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview03_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview01_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview11_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview25_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview23_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview22_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview02_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview16_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview04_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview21_compare.pn
g
com.github.takahirom
.preview.tests.Bench
markPreviewsKt.Bench
Preview08_compare.pn
g

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant