Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Try: Visual regression test coverage for Cover block #28554

Open
wants to merge 19 commits into
base: trunk
Choose a base branch
from

Conversation

ockham
Copy link
Contributor

@ockham ockham commented Jan 28, 2021

Description

Add basic visual regression testing for the Cover block by taking a screenshot of the block (and nothing else) both in the editor and on the frontend, and comparing the screenshots to image snapshots stored in git.

Visual regression testing is added to the exisiting end-to-end test for the Cover block. This seems to make sense to me and is analogous to how 'textual' snapshot testing is currently done in unit tests: In both cases, some preparatory steps are required to create the conditions under which the snapshot can be produced (and then compared to the stored one).

If the snapshot is found to differ from what is stored in git, a visual diff is created. When run in CI (i.e. via a GitHub Actions workflow), that visual diff is included with the workflow's artifacts.

Uses Jest Image Snapshot (h/t @johngodley) which basically adds a new expect(image).toMatchImageSnapshot() assertion to Jest. Combining this with Puppeteer's ability to take a screenshot, this fits in very nicely with our existing test framework.

Fixes #28477.

How has this been tested?

Locally:

npm run test-e2e -- packages/e2e-tests/specs/editor/blocks/cover.test.js

Visual diffs

The following diffs were created by the test by checking out packages/block-library/src/cover/style.scss from a commit (3de1114) that was known to suffer from a visual regression. To reproduce, run the following while on this branch:

git checkout 3de1114 -- packages/block-library/src/cover/style.scss
npm run build
npm run test-e2e -- packages/e2e-tests/specs/editor/blocks/cover.test.js

This gives

  ● Cover › renders correctly in the editor

    Expected image to be the same size as the snapshot (610x450), but was different (610x468).
    See diff for details: ~/src/gutenberg/artifacts/cover-renders-correctly-in-the-editor-diff.png

      133 | 		const coverBlockElement = await page.$( '.wp-block-cover' );
      134 | 		const screenshot = await coverBlockElement.screenshot();
    > 135 | 		expect( screenshot ).toMatchImageSnapshot();
          | 		                     ^
      136 | 	} );
      137 | 
      138 | 	it( 'renders correctly on the frontend', async () => {

      at Object.<anonymous> (specs/editor/blocks/cover.test.js:135:24)
          at runMicrotasks (<anonymous>)

(plus the same error for the frontend, omitted for brevity).

Refer to the error message to locate the generated visual diffs.
In each of the diffs, the expected image is on the left, the actual image is on the right, and the diff is shown in the middle (differences highlighted in red):

Editor

cover-renders-correctly-in-the-editor-diff

Frontend

cover-renders-correctly-on-the-frontend-diff

Possible future additions:

Cover block: Add visual regression tests for different alignments, and different themes, to prevent the kind of regressions documented in #28404 (comment).

Prior art / related projects

Prior art (using systems hosted on 3rd party servers) (h/t @gziolo):

And finally, there's a wordpress-develop PR to add visual regresston testing to Core by @tellthemachines.

@ockham ockham added [Status] In Progress Tracking issues with work in progress [Type] Automated Testing Testing infrastructure changes impacting the execution of end-to-end (E2E) and/or unit tests. labels Jan 28, 2021
@ockham ockham self-assigned this Jan 28, 2021
@@ -0,0 +1,13 @@
/**
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@github-actions
Copy link

github-actions bot commented Jan 28, 2021

Size Change: +1.81 kB (0%)

Total Size: 1.37 MB

Filename Size Change
build/annotations/index.js 3.77 kB -4 B (0%)
build/block-directory/index.js 9.08 kB +4 B (0%)
build/block-editor/index.js 124 kB +461 B (0%)
build/block-editor/style-rtl.css 12 kB -4 B (0%)
build/block-editor/style.css 12 kB -5 B (0%)
build/block-library/blocks/embed/style-rtl.css 396 B +21 B (+6%) 🔍
build/block-library/blocks/embed/style.css 395 B +20 B (+5%) 🔍
build/block-library/blocks/navigation/style-rtl.css 174 B -9 B (-5%)
build/block-library/blocks/navigation/style.css 174 B -9 B (-5%)
build/block-library/blocks/social-links/style-rtl.css 1.37 kB +1 B (0%)
build/block-library/index.js 144 kB +18 B (0%)
build/block-library/style-rtl.css 8.62 kB +4 B (0%)
build/block-library/style.css 8.62 kB +4 B (0%)
build/blocks/index.js 48.3 kB -1 B (0%)
build/components/index.js 279 kB +1.06 kB (0%)
build/compose/index.js 11.2 kB -1 B (0%)
build/data-controls/index.js 827 B -1 B (0%)
build/data/index.js 8.81 kB -1 B (0%)
build/date/index.js 31.8 kB -1 B (0%)
build/deprecated/index.js 768 B -1 B (0%)
build/dom-ready/index.js 570 B -1 B (0%)
build/dom/index.js 4.93 kB +2 B (0%)
build/edit-navigation/index.js 11.2 kB +39 B (0%)
build/edit-navigation/style-rtl.css 1.01 kB +73 B (+8%) 🔍
build/edit-navigation/style.css 1.01 kB +69 B (+7%) 🔍
build/edit-post/index.js 307 kB -4 B (0%)
build/edit-site/index.js 24.2 kB +28 B (0%)
build/edit-widgets/index.js 20.1 kB -1 B (0%)
build/editor/index.js 41.9 kB +34 B (0%)
build/element/index.js 4.61 kB -1 B (0%)
build/format-library/index.js 6.77 kB +2 B (0%)
build/i18n/index.js 3.74 kB -1 B (0%)
build/list-reusable-blocks/index.js 3.15 kB +1 B (0%)
build/media-utils/index.js 5.35 kB +19 B (0%)
build/notices/index.js 1.85 kB +2 B (0%)
build/plugins/index.js 2.54 kB -1 B (0%)
build/primitives/index.js 1.42 kB -2 B (0%)
build/redux-routine/index.js 2.84 kB +1 B (0%)
build/reusable-blocks/index.js 2.92 kB +1 B (0%)
build/rich-text/index.js 13.4 kB +1 B (0%)
build/token-list/index.js 1.27 kB -1 B (0%)
build/url/index.js 3.01 kB -1 B (0%)
build/warning/index.js 1.14 kB -1 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 665 B 0 B
build/block-directory/style-rtl.css 1.01 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 103 B 0 B
build/block-library/blocks/audio/style.css 103 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 453 B 0 B
build/block-library/blocks/button/style.css 451 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 227 B 0 B
build/block-library/blocks/buttons/editor.css 227 B 0 B
build/block-library/blocks/buttons/style-rtl.css 297 B 0 B
build/block-library/blocks/buttons/style.css 297 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 421 B 0 B
build/block-library/blocks/columns/style.css 421 B 0 B
build/block-library/blocks/cover/editor-rtl.css 392 B 0 B
build/block-library/blocks/cover/editor.css 393 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.25 kB 0 B
build/block-library/blocks/cover/style.css 1.25 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/file/editor-rtl.css 199 B 0 B
build/block-library/blocks/file/editor.css 198 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 679 B 0 B
build/block-library/blocks/gallery/editor.css 679 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.07 kB 0 B
build/block-library/blocks/gallery/style.css 1.06 kB 0 B
build/block-library/blocks/group/editor-rtl.css 318 B 0 B
build/block-library/blocks/group/editor.css 317 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 477 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/editor-rtl.css 159 B 0 B
build/block-library/blocks/latest-comments/editor.css 158 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 269 B 0 B
build/block-library/blocks/latest-comments/style.css 269 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/list/editor-rtl.css 65 B 0 B
build/block-library/blocks/list/editor.css 65 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 392 B 0 B
build/block-library/blocks/navigation-link/editor.css 394 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 704 B 0 B
build/block-library/blocks/navigation-link/style.css 702 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.38 kB 0 B
build/block-library/blocks/navigation/editor.css 1.37 kB 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 109 B 0 B
build/block-library/blocks/paragraph/editor.css 109 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 273 B 0 B
build/block-library/blocks/paragraph/style.css 273 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 249 B 0 B
build/block-library/blocks/post-comments-form/style.css 249 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 63 B 0 B
build/block-library/blocks/preformatted/style.css 63 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 316 B 0 B
build/block-library/blocks/pullquote/style.css 316 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 90 B 0 B
build/block-library/blocks/query-loop/editor.css 89 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query/editor-rtl.css 159 B 0 B
build/block-library/blocks/query/editor.css 160 B 0 B
build/block-library/blocks/quote/editor-rtl.css 61 B 0 B
build/block-library/blocks/quote/editor.css 61 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 165 B 0 B
build/block-library/blocks/search/editor.css 165 B 0 B
build/block-library/blocks/search/style-rtl.css 342 B 0 B
build/block-library/blocks/search/style.css 344 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 236 B 0 B
build/block-library/blocks/separator/style.css 236 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 504 B 0 B
build/block-library/blocks/shortcode/editor.css 504 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 201 B 0 B
build/block-library/blocks/site-logo/editor.css 201 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 117 B 0 B
build/block-library/blocks/site-logo/style.css 117 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 711 B 0 B
build/block-library/blocks/social-links/editor.css 712 B 0 B
build/block-library/blocks/social-links/style.css 1.37 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 302 B 0 B
build/block-library/blocks/spacer/editor.css 302 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/subhead/editor-rtl.css 99 B 0 B
build/block-library/blocks/subhead/editor.css 99 B 0 B
build/block-library/blocks/subhead/style-rtl.css 80 B 0 B
build/block-library/blocks/subhead/style.css 80 B 0 B
build/block-library/blocks/table/editor-rtl.css 489 B 0 B
build/block-library/blocks/table/editor.css 489 B 0 B
build/block-library/blocks/table/style-rtl.css 386 B 0 B
build/block-library/blocks/table/style.css 386 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 680 B 0 B
build/block-library/blocks/template-part/editor.css 679 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/editor-rtl.css 62 B 0 B
build/block-library/blocks/verse/editor.css 62 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 193 B 0 B
build/block-library/blocks/video/style.css 193 B 0 B
build/block-library/common-rtl.css 1.01 kB 0 B
build/block-library/common.css 1.01 kB 0 B
build/block-library/editor-rtl.css 9.06 kB 0 B
build/block-library/editor.css 9.05 kB 0 B
build/block-library/theme-rtl.css 748 B 0 B
build/block-library/theme.css 748 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 kB 0 B
build/core-data/index.js 16.8 kB 0 B
build/edit-post/style-rtl.css 6.79 kB 0 B
build/edit-post/style.css 6.78 kB 0 B
build/edit-site/style-rtl.css 4.04 kB 0 B
build/edit-site/style.css 4.04 kB 0 B
build/edit-widgets/style-rtl.css 3.2 kB 0 B
build/edit-widgets/style.css 3.2 kB 0 B
build/editor/editor-styles-rtl.css 543 B 0 B
build/editor/editor-styles.css 545 B 0 B
build/editor/style-rtl.css 3.89 kB 0 B
build/editor/style.css 3.89 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 2.27 kB 0 B
build/html-entities/index.js 622 B 0 B
build/is-shallow-equal/index.js 698 B 0 B
build/keyboard-shortcuts/index.js 2.54 kB 0 B
build/keycodes/index.js 1.93 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/nux/index.js 3.41 kB 0 B
build/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/priority-queue/index.js 790 B 0 B
build/server-side-render/index.js 2.77 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/viewport/index.js 1.86 kB 0 B
build/wordcount/index.js 1.22 kB 0 B

compressed-size-action

@ockham
Copy link
Contributor Author

ockham commented Jan 28, 2021

I wish I could run these locally to generate the initial snapshot, but unfortunately, e2e tests are locally failing with

TimeoutError: waiting for selector `.edit-post-layout` failed: timeout 30000ms exceeded

@vindl seems to experience something similar. Curious what's wrong 🤔

@ockham
Copy link
Contributor Author

ockham commented Jan 28, 2021

I wish I could run these locally to generate the initial snapshot, but unfortunately, e2e tests are locally failing with

TimeoutError: waiting for selector `.edit-post-layout` failed: timeout 30000ms exceeded

@vindl seems to experience something similar. Curious what's wrong

I found the answer 😅 and posted it here.

@ockham
Copy link
Contributor Author

ockham commented Jan 28, 2021

FYI @tellthemachines 👋 (b/c WordPress/wordpress-develop#209)

@gziolo
Copy link
Member

gziolo commented Jan 29, 2021

We better don't include images in the repository. It's huge already. You don't want to download all those data on every git clone run. 😅

@ockham
Copy link
Contributor Author

ockham commented Jan 29, 2021

We better don't include images in the repository. It's huge already. You don't want to download all those data on every git clone run.

Well, that's basically how jest-image-snapshot works I'm afraid, and I'd hate to dismiss it so easily as an option 😕 FWIW, the two image snapshot files this PR is adding currently add about 8.4 kB total. I realize that that would grow, but it doesn't differ from code files or unit test snapshots by some order of magnitude.

We could probably do some contortions to run the tests against master, produce the snapshots there, only store them locally and temporarily, and then switch to the branch we'd like to test to run the same tests again. But TBH I don't think it's worth doing that from the onset.

@ockham ockham removed the [Status] In Progress Tracking issues with work in progress label Jan 29, 2021
@ockham ockham marked this pull request as ready for review January 29, 2021 19:26
@ockham ockham requested a review from a team January 29, 2021 19:26
@gziolo
Copy link
Member

gziolo commented Jan 29, 2021

I don’t think you should be worried about the general approach here regarding how the tests work. It’s mostly about how the process of storing and comparing visual changes could work. The tools I listed store images externally and provided advanced UI with workflows that help the team to decide whether proposed visual changes are intended.

Anyway, for v1, we can use the approach you have. In the long run, it won’t scale because every change to standard UI components will trigger updates for existing image snapshots, and since those are binary files, it will replace all the content. Could we maybe use another repository to keep those images or some special instance of WordPress where every post links to the GitHub PR? I’m just sharing ideas on how to mitigate this issue. We already store all images used in documentation outside of the Gutenberg repository, but still, we see reports that people have to download over 1 GB of data to run Gutenberg locally (npm + git) 😅

@tellthemachines
Copy link
Contributor

We could probably do some contortions to run the tests against master, produce the snapshots there, only store them locally and temporarily, and then switch to the branch we'd like to test to run the same tests again. But TBH I don't think it's worth doing that from the onset.

This is the approach I'm taking for Core, not because of storage (though that definitely should be taken into account), but to solve the problem of cross-environment false positives. Even a very basic snapshot such as the editor one in this PR is failing on CI, and I can reproduce that failure locally. I think the only reason the front end snapshot doesn't fail is it's a monochrome image 😅

I tried fiddling with all the settings: image size, failure thresholds, even blurring the images, and wasn't able to come up with a way of getting the tests to pass on CI. So for Core, the plan is to run the tests on trunk to generate the snapshots and then again on the feature branch. For local runs, it'll be done manually for now, but might be nice to automate it sometime in the future.

Note: in my PR, I set up the visual regression tests as a separate task from the e2e tests, so that we can have the choice of not running them for changesets that don't touch anything browser-rendered, because the tests are pretty slow to run, but that probably doesn't make sense with the approach in this PR.

@ockham ockham force-pushed the add/visual-diff-testing branch 2 times, most recently from 8bc8924 to 253fa50 Compare February 1, 2021 13:42
@ockham
Copy link
Contributor Author

ockham commented Feb 1, 2021

Hey @tellthemachines 👋 Thanks for chiming in!

We could probably do some contortions to run the tests against master, produce the snapshots there, only store them locally and temporarily, and then switch to the branch we'd like to test to run the same tests again. But TBH I don't think it's worth doing that from the onset.

This is the approach I'm taking for Core, not because of storage (though that definitely should be taken into account), but to solve the problem of cross-environment false positives. Even a very basic snapshot such as the editor one in this PR is failing on CI, and I can reproduce that failure locally. I think the only reason the front end snapshot doesn't fail is it's a monochrome image

I tried fiddling with all the settings: image size, failure thresholds, even blurring the images, and wasn't able to come up with a way of getting the tests to pass on CI. So for Core, the plan is to run the tests on trunk to generate the snapshots and then again on the feature branch. For local runs, it'll be done manually for now, but might be nice to automate it sometime in the future.

Interesting, the visual regression test added by my PR seemed to pass reliably on CI at first, but lately, it always fails 😕 I had a look at the visual diffs from the latest run (ZIP file, look for cover-renders-correctly-in-the-editor-diff.png and cover-renders-correctly-on-the-frontened-diff.png), and it looks to me like maybe different fonts are used to render the text in either? 🤔 (Enlarge to see better.) I wonder if we can make it more reliable if we fine-tune some editor settings -- such as the font family (via Global Styles, if possible).

Editor:

cover-renders-correctly-in-the-editor-diff

Frontend:

cover-renders-correctly-on-the-frontend-diff

Note: in my PR, I set up the visual regression tests as a separate task from the e2e tests, so that we can have the choice of not running them for changesets that don't touch anything browser-rendered, because the tests are pretty slow to run, but that probably doesn't make sense with the approach in this PR.

FWIW, I've been more inclined to co-locate and couple visual regression tests with e2e tests rather tightly, since it turns out that we need to use quite a few e2e tools to insert and customize the block. Maybe indvidual if conditionals at job level could be used to skip visual regression testing for PRs that don't touch relevant files?

@tellthemachines
Copy link
Contributor

Interesting, the visual regression test added by my PR seemed to pass reliably on CI at first, but lately, it always fails 😕 I had a look at the visual diffs from the latest run (ZIP file, look for cover-renders-correctly-in-the-editor-diff.png and cover-renders-correctly-on-the-frontened-diff.png), and it looks to me like maybe different fonts are used to render the text in either?

Hmm, we're using system fonts so that makes sense; I'm getting much the same diff when running them locally. This is another argument for building a custom theme to use in e2e tests 😄

With the Core tests, I got all sorts of diffs when comparing local snapshots with CI-generated ones, but we're testing whole pages there so there'll always be a higher chance of failure. I'd say let's give this approach a go (assuming we can work around the font issue), and if it starts failing enough to be annoying we can scrap it and try something else.

@kevin940726
Copy link
Member

In my past experience, the font difference is always going to happen even if we use the same font. The problem is that different OS have different font rendering engine and will produce slightly different outputs. The solution is to always run the tests in the same environment, i.e. a docker instance. This is definitely going to be tedious in local development though, not sure how we can do that. Another possible solution is to use external tools like Chromatic or Percy.

@gziolo
Copy link
Member

gziolo commented Feb 2, 2021

Chromatic might be in theory free for WordPress. At the bottom of the
https://www.chromatic.com/pricing page you can find:

✌️Free for open source

@kevin940726
Copy link
Member

Chromatic is heavily coupled with Storybook though. Depending on what we want to test, it might not be the perfect fit for now. But if our goal is to create more stories then it should be the recommended solution.

AFAIK, there aren't many stories for blocks. We can start by adding a story for the cover block and see if it makes sense? BlockBook is a thing, but probably still experimental. I'm not sure if it's possible to just use Storybook and leverage its ecosystem?

@ockham
Copy link
Contributor Author

ockham commented Feb 3, 2021

I've looked around a bit, it seems like lack of cross-platform, pixel-perfect rendering is a problem for pretty much everyone attempting to use puppeteer for visual regression testing (see puppeteer/puppeteer#661).

One recurring mitigation strategy was to set Chrome's --font-render-hinting arg to none when launching puppeteer -- this seems to have at least brought down the number of differing pixels for some people, see e.g. this comparison table.

I'll give that a quick try. For the record, currently, our snapshots differ by 887 (editor) and 486 (frontend) pixels, respectively.

@ockham
Copy link
Contributor Author

ockham commented Feb 3, 2021

I'll give that a quick try. For the record, currently, our snapshots differ by 887 (editor) and 486 (frontend) pixels, respectively.

Still at 887/486. It also didn't make a change when I ran it locally.

I'm starting to wonder if puppeteer is respecting packages/scripts/config/puppeteer.config.js. I find it a bit hard to track what Jest (and/or puppeteer) config is used for what 😕

@gziolo
Copy link
Member

gziolo commented Feb 3, 2021

Your answer is here:

"test-e2e": "wp-scripts test-e2e --config packages/e2e-tests/jest.config.js",

@ockham
Copy link
Contributor Author

ockham commented Feb 3, 2021

Your answer is here:

"test-e2e": "wp-scripts test-e2e --config packages/e2e-tests/jest.config.js",

Thanks! That points me to

...require( '@wordpress/scripts/config/jest-e2e.config' ),

which then takes me to this file: https://github.com/WordPress/gutenberg/blob/0105c9a2312272d768f1ecb77c0b9e6dca77d0a0/packages/scripts/config/jest-e2e.config.js

But that's a Jest config, not a puppeteer config 🤔 How can I pass the puppeteer arg through that?

Unless you meant the test-e2e script in wp-scripts -- but that actually points me to puppeteer.config.js (which is what I started with 😅 ):

if (
! hasProjectFile( 'jest-puppeteer.config.js' ) &&
! process.env.JEST_PUPPETEER_CONFIG
) {
process.env.JEST_PUPPETEER_CONFIG = fromConfigRoot( 'puppeteer.config.js' );
}

@gziolo
Copy link
Member

gziolo commented Feb 3, 2021

Right, there are two config files, and both of them can be overridden. I think you are changing the correct file.

Base automatically changed from master to trunk March 1, 2021 15:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Type] Automated Testing Testing infrastructure changes impacting the execution of end-to-end (E2E) and/or unit tests.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add visual diffs
4 participants