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

Add visual regression tests for the Navigate Regions focus style #46210

Draft
wants to merge 9 commits into
base: trunk
Choose a base branch
from

Conversation

afercia
Copy link
Contributor

@afercia afercia commented Nov 30, 2022

Related: #43393

What?

For now, visual regression testing is implemented only for a couple components in the Storybook and the tests only run locally. See #43393. However, there are several features in Gutenberg that would greatly benefit from visual regression tests.

Why?

The Navigate Regions focus style is one of them. It already broke and was fixed a few times, for example in #45369 and #8554

Worth noting the focus style has been broken for quite a long time as it's hard to notice a breakage if the feature isn't actually used or manually tested. Normal E2E tests can test for the interaction to work as expected. Instead, only visual regression tests can test the blue outline focus style is actually visible and prevent from breaking again in the future.

This PR is a proof of concept to consider what is the best way to introduce more visual regression tests in the project.
Any thoughts and feedback welcome.
/Cc @kevin940726, @mirka, @aristath

How?

  • Uses Playwright visual regression testing via toHaveScreenshot().
  • Screenshots target specific parts of the editor and not the full page, to reduce the reference images size.
  • Adds 7 reference images in the test/e2e/specs/editor/various/__snapshots__ directory, for a total size of ~57 KB.

Considerations:

  • Maybe the visual regression tests should live in a dedicated directory test/e2e/specs/visual-regression.
  • If the total repository size is a concern, this directory could maybe be git-ignored. Worth noting that when the reference images are missing, the related test will fail on a first run, but it will also generate the missing images. On the second run, the test will be able to use the new reference images.
  • To my knowledge, the whole test directory is already excluded from the release build.
  • When the test fails, 3 new images will be generated in the artifacts/test-results directory: 'expected', 'actual', and 'diff'.
  • The toHaveScreenshot() assertion has a few optional parameters that may come in handy,

Testing Instructions

npm run test:e2e:playwright -- editor/various/navigate-regions.spec.js

To see the browser in action:
npm run test:e2e:playwright -- --headed editor/various/navigate-regions.spec.js

Only if you need to update the reference images after edits to the test:
$ npm run test:e2e:playwright -- --headed --update-snapshots editor/various/navigate-regions.spec.js

Testing Instructions for Keyboard

Screenshots or screencast

@afercia afercia added [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Type] Automated Testing Testing infrastructure changes impacting the execution of end-to-end (E2E) and/or unit tests. [a11y] Keyboard & Focus labels Nov 30, 2022
@github-actions
Copy link

github-actions bot commented Nov 30, 2022

Size Change: -4.16 kB (0%)

Total Size: 1.32 MB

Filename Size Change
build/block-directory/style-rtl.css 1.04 kB +1 B (0%)
build/block-directory/style.css 1.04 kB +2 B (0%)
build/block-editor/default-editor-styles-rtl.css 403 B +2 B (0%)
build/block-editor/default-editor-styles.css 403 B +2 B (0%)
build/block-editor/index.min.js 181 kB +839 B (0%)
build/block-editor/style-rtl.css 14.6 kB -1.91 kB (-12%) 👏
build/block-editor/style.css 14.6 kB -1.9 kB (-12%) 👏
build/block-library/blocks/archives/editor-rtl.css 61 B -46 B (-43%) 🎉
build/block-library/blocks/archives/editor.css 60 B -46 B (-43%) 🎉
build/block-library/blocks/archives/style-rtl.css 90 B -39 B (-30%) 🎉
build/block-library/blocks/archives/style.css 90 B -39 B (-30%) 🎉
build/block-library/blocks/audio/editor-rtl.css 150 B -35 B (-19%) 👏
build/block-library/blocks/audio/editor.css 150 B -35 B (-19%) 👏
build/block-library/blocks/audio/style-rtl.css 122 B -36 B (-23%) 🎉
build/block-library/blocks/audio/style.css 122 B -36 B (-23%) 🎉
build/block-library/blocks/audio/theme-rtl.css 138 B -34 B (-20%) 🎉
build/block-library/blocks/audio/theme.css 138 B -34 B (-20%) 🎉
build/block-library/blocks/avatar/editor-rtl.css 116 B -38 B (-25%) 🎉
build/block-library/blocks/avatar/editor.css 116 B -38 B (-25%) 🎉
build/block-library/blocks/avatar/style-rtl.css 84 B -42 B (-33%) 🎉
build/block-library/blocks/avatar/style.css 84 B -42 B (-33%) 🎉
build/block-library/blocks/block/editor-rtl.css 305 B -33 B (-10%) 👏
build/block-library/blocks/block/editor.css 305 B -33 B (-10%) 👏
build/block-library/blocks/button/editor-rtl.css 485 B -32 B (-6%)
build/block-library/blocks/button/editor.css 485 B -32 B (-6%)
build/block-library/blocks/button/style-rtl.css 532 B -34 B (-6%)
build/block-library/blocks/button/style.css 532 B -34 B (-6%)
build/block-library/blocks/buttons/editor-rtl.css 337 B -36 B (-10%) 👏
build/block-library/blocks/buttons/editor.css 337 B -36 B (-10%) 👏
build/block-library/blocks/buttons/style-rtl.css 332 B -36 B (-10%) 👏
build/block-library/blocks/buttons/style.css 332 B -36 B (-10%) 👏
build/block-library/blocks/calendar/style-rtl.css 239 B -31 B (-11%) 👏
build/block-library/blocks/calendar/style.css 239 B -31 B (-11%) 👏
build/block-library/blocks/categories/editor-rtl.css 84 B -41 B (-33%) 🎉
build/block-library/blocks/categories/editor.css 83 B -41 B (-33%) 🎉
build/block-library/blocks/categories/style-rtl.css 100 B -38 B (-28%) 🎉
build/block-library/blocks/categories/style.css 100 B -38 B (-28%) 🎉
build/block-library/blocks/code/editor-rtl.css 53 B -49 B (-48%) 🎉
build/block-library/blocks/code/editor.css 53 B -49 B (-48%) 🎉
build/block-library/blocks/code/style-rtl.css 121 B -38 B (-24%) 🎉
build/block-library/blocks/code/style.css 121 B -38 B (-24%) 🎉
build/block-library/blocks/code/theme-rtl.css 124 B -36 B (-22%) 🎉
build/block-library/blocks/code/theme.css 124 B -36 B (-22%) 🎉
build/block-library/blocks/columns/editor-rtl.css 108 B -39 B (-27%) 🎉
build/block-library/blocks/columns/editor.css 108 B -39 B (-27%) 🎉
build/block-library/blocks/columns/style-rtl.css 406 B -36 B (-8%)
build/block-library/blocks/columns/style.css 406 B -36 B (-8%)
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B -38 B (-23%) 🎉
build/block-library/blocks/comment-author-avatar/editor.css 125 B -38 B (-23%) 🎉
build/block-library/blocks/comment-content/style-rtl.css 92 B -42 B (-31%) 🎉
build/block-library/blocks/comment-content/style.css 92 B -42 B (-31%) 🎉
build/block-library/blocks/comment-template/style-rtl.css 199 B -38 B (-16%) 👏
build/block-library/blocks/comment-template/style.css 198 B -38 B (-16%) 👏
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B -36 B (-23%) 🎉
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B -36 B (-23%) 🎉
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B -36 B (-14%) 👏
build/block-library/blocks/comments-pagination/editor.css 209 B -40 B (-16%) 👏
build/block-library/blocks/comments-pagination/style-rtl.css 235 B -37 B (-14%) 👏
build/block-library/blocks/comments-pagination/style.css 231 B -37 B (-14%) 👏
build/block-library/blocks/comments-title/editor-rtl.css 75 B -43 B (-36%) 🎉
build/block-library/blocks/comments-title/editor.css 75 B -43 B (-36%) 🎉
build/block-library/blocks/comments/editor-rtl.css 840 B -35 B (-4%)
build/block-library/blocks/comments/editor.css 839 B -35 B (-4%)
build/block-library/blocks/comments/style-rtl.css 637 B -35 B (-5%)
build/block-library/blocks/comments/style.css 636 B -35 B (-5%)
build/block-library/blocks/cover/editor-rtl.css 612 B -34 B (-5%)
build/block-library/blocks/cover/editor.css 613 B -34 B (-5%)
build/block-library/blocks/cover/style-rtl.css 1.57 kB -36 B (-2%)
build/block-library/blocks/cover/style.css 1.56 kB -36 B (-2%)
build/block-library/blocks/embed/editor-rtl.css 293 B -34 B (-10%) 👏
build/block-library/blocks/embed/editor.css 293 B -34 B (-10%) 👏
build/block-library/blocks/embed/style-rtl.css 410 B -36 B (-8%)
build/block-library/blocks/embed/style.css 410 B -36 B (-8%)
build/block-library/blocks/embed/theme-rtl.css 138 B -34 B (-20%) 🎉
build/block-library/blocks/embed/theme.css 138 B -34 B (-20%) 🎉
build/block-library/blocks/file/editor-rtl.css 300 B -35 B (-10%) 👏
build/block-library/blocks/file/editor.css 300 B -35 B (-10%) 👏
build/block-library/blocks/file/style-rtl.css 253 B -35 B (-12%) 👏
build/block-library/blocks/file/style.css 254 B -34 B (-12%) 👏
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB -30 B (-1%)
build/block-library/blocks/freeform/editor.css 2.44 kB -29 B (-1%)
build/block-library/blocks/gallery/editor-rtl.css 984 B -3 B (0%)
build/block-library/blocks/gallery/editor.css 988 B -5 B (-1%)
build/block-library/blocks/gallery/style-rtl.css 1.55 kB -34 B (-2%)
build/block-library/blocks/gallery/style.css 1.55 kB -33 B (-2%)
build/block-library/blocks/gallery/theme-rtl.css 122 B -35 B (-22%) 🎉
build/block-library/blocks/gallery/theme.css 122 B -35 B (-22%) 🎉
build/block-library/blocks/group/editor-rtl.css 654 B -33 B (-5%)
build/block-library/blocks/group/editor.css 654 B -33 B (-5%)
build/block-library/blocks/group/style-rtl.css 57 B -48 B (-46%) 🎉
build/block-library/blocks/group/style.css 57 B -48 B (-46%) 🎉
build/block-library/blocks/group/theme-rtl.css 78 B -47 B (-38%) 🎉
build/block-library/blocks/group/theme.css 78 B -47 B (-38%) 🎉
build/block-library/blocks/heading/style-rtl.css 76 B -52 B (-41%) 🎉
build/block-library/blocks/heading/style.css 76 B -52 B (-41%) 🎉
build/block-library/blocks/html/editor-rtl.css 332 B -33 B (-9%)
build/block-library/blocks/html/editor.css 333 B -33 B (-9%)
build/block-library/blocks/image/editor-rtl.css 829 B -83 B (-9%)
build/block-library/blocks/image/editor.css 828 B -84 B (-9%)
build/block-library/blocks/image/style-rtl.css 627 B -35 B (-5%)
build/block-library/blocks/image/style.css 630 B -36 B (-5%)
build/block-library/blocks/image/theme-rtl.css 137 B -35 B (-20%) 🎉
build/block-library/blocks/image/theme.css 137 B -35 B (-20%) 🎉
build/block-library/blocks/latest-comments/style-rtl.css 298 B -35 B (-11%) 👏
build/block-library/blocks/latest-comments/style.css 298 B -35 B (-11%) 👏
build/block-library/blocks/latest-posts/editor-rtl.css 213 B -37 B (-15%) 👏
build/block-library/blocks/latest-posts/editor.css 212 B -37 B (-15%) 👏
build/block-library/blocks/latest-posts/style-rtl.css 478 B -36 B (-7%)
build/block-library/blocks/latest-posts/style.css 478 B -36 B (-7%)
build/block-library/blocks/list/style-rtl.css 88 B -47 B (-35%) 🎉
build/block-library/blocks/list/style.css 88 B -47 B (-35%) 🎉
build/block-library/blocks/media-text/editor-rtl.css 266 B -34 B (-11%) 👏
build/block-library/blocks/media-text/editor.css 263 B -35 B (-12%) 👏
build/block-library/blocks/media-text/style-rtl.css 507 B -33 B (-6%)
build/block-library/blocks/media-text/style.css 505 B -34 B (-6%)
build/block-library/blocks/more/editor-rtl.css 431 B -34 B (-7%)
build/block-library/blocks/more/editor.css 431 B -34 B (-7%)
build/block-library/blocks/navigation-link/editor-rtl.css 716 B -30 B (-4%)
build/block-library/blocks/navigation-link/editor.css 715 B -29 B (-4%)
build/block-library/blocks/navigation-link/style-rtl.css 115 B -38 B (-25%) 🎉
build/block-library/blocks/navigation-link/style.css 115 B -38 B (-25%) 🎉
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B -34 B (-10%) 👏
build/block-library/blocks/navigation-submenu/editor.css 299 B -34 B (-10%) 👏
build/block-library/blocks/navigation/editor-rtl.css 2.15 kB -32 B (-1%)
build/block-library/blocks/navigation/editor.css 2.16 kB -33 B (-2%)
build/block-library/blocks/navigation/style-rtl.css 2.23 kB -36 B (-2%)
build/block-library/blocks/navigation/style.css 2.21 kB -36 B (-2%)
build/block-library/blocks/nextpage/editor-rtl.css 395 B -33 B (-8%)
build/block-library/blocks/nextpage/editor.css 395 B -33 B (-8%)
build/block-library/blocks/page-list/editor-rtl.css 363 B -34 B (-9%)
build/block-library/blocks/page-list/editor.css 363 B -35 B (-9%)
build/block-library/blocks/page-list/style-rtl.css 175 B -37 B (-17%) 👏
build/block-library/blocks/page-list/style.css 175 B -37 B (-17%) 👏
build/block-library/blocks/paragraph/editor-rtl.css 174 B -40 B (-19%) 👏
build/block-library/blocks/paragraph/editor.css 174 B -40 B (-19%) 👏
build/block-library/blocks/paragraph/style-rtl.css 279 B -42 B (-13%) 👏
build/block-library/blocks/paragraph/style.css 281 B -40 B (-12%) 👏
build/block-library/blocks/post-author/style-rtl.css 175 B -37 B (-17%) 👏
build/block-library/blocks/post-author/style.css 176 B -36 B (-17%) 👏
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B -41 B (-30%) 🎉
build/block-library/blocks/post-comments-form/editor.css 96 B -41 B (-30%) 🎉
build/block-library/blocks/post-comments-form/style-rtl.css 501 B -35 B (-7%)
build/block-library/blocks/post-comments-form/style.css 501 B -36 B (-7%)
build/block-library/blocks/post-date/style-rtl.css 61 B -46 B (-43%) 🎉
build/block-library/blocks/post-date/style.css 61 B -46 B (-43%) 🎉
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B -46 B (-39%) 🎉
build/block-library/blocks/post-excerpt/editor.css 73 B -46 B (-39%) 🎉
build/block-library/blocks/post-excerpt/style-rtl.css 69 B -47 B (-41%) 🎉
build/block-library/blocks/post-excerpt/style.css 69 B -47 B (-41%) 🎉
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B -34 B (-5%)
build/block-library/blocks/post-featured-image/editor.css 584 B -34 B (-6%)
build/block-library/blocks/post-featured-image/style-rtl.css 318 B -31 B (-9%)
build/block-library/blocks/post-featured-image/style.css 318 B -31 B (-9%)
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B -37 B (-19%) 👏
build/block-library/blocks/post-navigation-link/style.css 153 B -36 B (-19%) 👏
build/block-library/blocks/post-template/editor-rtl.css 99 B -41 B (-29%) 🎉
build/block-library/blocks/post-template/editor.css 98 B -41 B (-29%) 🎉
build/block-library/blocks/post-template/style-rtl.css 282 B -35 B (-11%) 👏
build/block-library/blocks/post-template/style.css 282 B -35 B (-11%) 👏
build/block-library/blocks/post-terms/style-rtl.css 96 B -40 B (-29%) 🎉
build/block-library/blocks/post-terms/style.css 96 B -40 B (-29%) 🎉
build/block-library/blocks/post-title/style-rtl.css 100 B -38 B (-28%) 🎉
build/block-library/blocks/post-title/style.css 100 B -38 B (-28%) 🎉
build/block-library/blocks/preformatted/style-rtl.css 103 B -36 B (-26%) 🎉
build/block-library/blocks/preformatted/style.css 103 B -36 B (-26%) 🎉
build/block-library/blocks/pullquote/editor-rtl.css 135 B -35 B (-21%) 🎉
build/block-library/blocks/pullquote/editor.css 135 B -35 B (-21%) 🎉
build/block-library/blocks/pullquote/style-rtl.css 326 B -31 B (-9%)
build/block-library/blocks/pullquote/style.css 325 B -32 B (-9%)
build/block-library/blocks/pullquote/theme-rtl.css 167 B -34 B (-17%) 👏
build/block-library/blocks/pullquote/theme.css 167 B -34 B (-17%) 👏
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B -36 B (-23%) 🎉
build/block-library/blocks/query-pagination-numbers/editor.css 121 B -35 B (-22%) 🎉
build/block-library/blocks/query-pagination/editor-rtl.css 221 B -37 B (-14%) 👏
build/block-library/blocks/query-pagination/editor.css 211 B -36 B (-15%) 👏
build/block-library/blocks/query-pagination/style-rtl.css 288 B -38 B (-12%) 👏
build/block-library/blocks/query-pagination/style.css 284 B -38 B (-12%) 👏
build/block-library/blocks/query-title/style-rtl.css 63 B -45 B (-42%) 🎉
build/block-library/blocks/query-title/style.css 63 B -45 B (-42%) 🎉
build/block-library/blocks/query/editor-rtl.css 440 B -35 B (-7%)
build/block-library/blocks/query/editor.css 440 B -37 B (-8%)
build/block-library/blocks/quote/style-rtl.css 213 B -40 B (-16%) 👏
build/block-library/blocks/quote/style.css 213 B -40 B (-16%) 👏
build/block-library/blocks/quote/theme-rtl.css 223 B -32 B (-13%) 👏
build/block-library/blocks/quote/theme.css 226 B -33 B (-13%) 👏
build/block-library/blocks/read-more/style-rtl.css 132 B -36 B (-21%) 🎉
build/block-library/blocks/read-more/style.css 132 B -36 B (-21%) 🎉
build/block-library/blocks/rss/editor-rtl.css 202 B -37 B (-15%) 👏
build/block-library/blocks/rss/editor.css 204 B -36 B (-15%) 👏
build/block-library/blocks/rss/style-rtl.css 289 B -34 B (-11%) 👏
build/block-library/blocks/rss/style.css 288 B -35 B (-11%) 👏
build/block-library/blocks/search/editor-rtl.css 165 B -40 B (-20%) 🎉
build/block-library/blocks/search/editor.css 165 B -40 B (-20%) 🎉
build/block-library/blocks/search/style-rtl.css 409 B -32 B (-7%)
build/block-library/blocks/search/style.css 406 B -33 B (-8%)
build/block-library/blocks/search/theme-rtl.css 114 B -35 B (-23%) 🎉
build/block-library/blocks/search/theme.css 114 B -35 B (-23%) 🎉
build/block-library/blocks/separator/editor-rtl.css 146 B -38 B (-21%) 🎉
build/block-library/blocks/separator/editor.css 146 B -38 B (-21%) 🎉
build/block-library/blocks/separator/style-rtl.css 234 B -35 B (-13%) 👏
build/block-library/blocks/separator/style.css 234 B -35 B (-13%) 👏
build/block-library/blocks/separator/theme-rtl.css 194 B -35 B (-15%) 👏
build/block-library/blocks/separator/theme.css 194 B -35 B (-15%) 👏
build/block-library/blocks/shortcode/editor-rtl.css 474 B -34 B (-7%)
build/block-library/blocks/shortcode/editor.css 474 B -34 B (-7%)
build/block-library/blocks/site-logo/editor-rtl.css 490 B -32 B (-6%)
build/block-library/blocks/site-logo/editor.css 490 B -32 B (-6%)
build/block-library/blocks/site-logo/style-rtl.css 203 B -35 B (-15%) 👏
build/block-library/blocks/site-logo/style.css 203 B -35 B (-15%) 👏
build/block-library/blocks/site-tagline/editor-rtl.css 86 B -43 B (-33%) 🎉
build/block-library/blocks/site-tagline/editor.css 86 B -43 B (-33%) 🎉
build/block-library/blocks/site-title/editor-rtl.css 116 B -39 B (-25%) 🎉
build/block-library/blocks/site-title/editor.css 116 B -39 B (-25%) 🎉
build/block-library/blocks/site-title/style-rtl.css 57 B -44 B (-44%) 🎉
build/block-library/blocks/site-title/style.css 57 B -44 B (-44%) 🎉
build/block-library/blocks/social-link/editor-rtl.css 184 B -35 B (-16%) 👏
build/block-library/blocks/social-link/editor.css 184 B -35 B (-16%) 👏
build/block-library/blocks/social-links/editor-rtl.css 674 B -35 B (-5%)
build/block-library/blocks/social-links/editor.css 673 B -35 B (-5%)
build/block-library/blocks/social-links/style-rtl.css 1.4 kB -36 B (-3%)
build/block-library/blocks/social-links/style.css 1.39 kB -36 B (-3%)
build/block-library/blocks/spacer/editor-rtl.css 332 B -40 B (-11%) 👏
build/block-library/blocks/spacer/editor.css 332 B -40 B (-11%) 👏
build/block-library/blocks/spacer/style-rtl.css 48 B -48 B (-50%) 🏆
build/block-library/blocks/spacer/style.css 48 B -48 B (-50%) 🏆
build/block-library/blocks/table/editor-rtl.css 457 B -90 B (-16%) 👏
build/block-library/blocks/table/editor.css 457 B -90 B (-16%) 👏
build/block-library/blocks/table/style-rtl.css 636 B -34 B (-5%)
build/block-library/blocks/table/style.css 635 B -34 B (-5%)
build/block-library/blocks/table/theme-rtl.css 184 B -36 B (-16%) 👏
build/block-library/blocks/table/theme.css 184 B -36 B (-16%) 👏
build/block-library/blocks/tag-cloud/style-rtl.css 251 B -36 B (-13%) 👏
build/block-library/blocks/tag-cloud/style.css 253 B -35 B (-12%) 👏
build/block-library/blocks/template-part/editor-rtl.css 404 B -32 B (-7%)
build/block-library/blocks/template-part/editor.css 404 B -32 B (-7%)
build/block-library/blocks/template-part/theme-rtl.css 101 B -38 B (-27%) 🎉
build/block-library/blocks/template-part/theme.css 101 B -38 B (-27%) 🎉
build/block-library/blocks/text-columns/editor-rtl.css 95 B -40 B (-30%) 🎉
build/block-library/blocks/text-columns/editor.css 95 B -40 B (-30%) 🎉
build/block-library/blocks/text-columns/style-rtl.css 166 B -32 B (-16%) 👏
build/block-library/blocks/text-columns/style.css 166 B -32 B (-16%) 👏
build/block-library/blocks/verse/style-rtl.css 87 B -43 B (-33%) 🎉
build/block-library/blocks/verse/style.css 87 B -43 B (-33%) 🎉
build/block-library/blocks/video/editor-rtl.css 691 B -29 B (-4%)
build/block-library/blocks/video/editor.css 694 B -29 B (-4%)
build/block-library/blocks/video/style-rtl.css 179 B -39 B (-18%) 👏
build/block-library/blocks/video/style.css 179 B -39 B (-18%) 👏
build/block-library/blocks/video/theme-rtl.css 139 B -32 B (-19%) 👏
build/block-library/blocks/video/theme.css 139 B -32 B (-19%) 👏
build/block-library/classic-rtl.css 162 B -31 B (-16%) 👏
build/block-library/classic.css 162 B -31 B (-16%) 👏
build/block-library/editor-elements-rtl.css 75 B -51 B (-40%) 🎉
build/block-library/editor-elements.css 75 B -51 B (-40%) 🎉
build/block-library/editor-rtl.css 11.7 kB -46 B (0%)
build/block-library/editor.css 11.7 kB -49 B (0%)
build/block-library/elements-rtl.css 54 B -51 B (-49%) 🎉
build/block-library/elements.css 54 B -51 B (-49%) 🎉
build/block-library/index.min.js 196 kB +229 B (0%)
build/block-library/reset-rtl.css 478 B -36 B (-7%)
build/block-library/reset.css 478 B -36 B (-7%)
build/block-library/style-rtl.css 12.4 kB -35 B (0%)
build/block-library/style.css 12.4 kB -36 B (0%)
build/block-library/theme-rtl.css 716 B -33 B (-4%)
build/block-library/theme.css 721 B -32 B (-4%)
build/blocks/index.min.js 50.4 kB +359 B (+1%)
build/components/index.min.js 204 kB +54 B (0%)
build/components/style-rtl.css 11.7 kB +122 B (+1%)
build/components/style.css 11.7 kB +122 B (+1%)
build/core-data/index.min.js 15.9 kB +296 B (+2%)
build/customize-widgets/index.min.js 11.6 kB +329 B (+3%)
build/customize-widgets/style-rtl.css 1.41 kB +1 B (0%)
build/data/index.min.js 8.14 kB +27 B (0%)
build/edit-navigation/index.min.js 16.2 kB -40 B (0%)
build/edit-navigation/style-rtl.css 4.14 kB +38 B (+1%)
build/edit-navigation/style.css 4.15 kB +44 B (+1%)
build/edit-post/classic-rtl.css 571 B +2 B (0%)
build/edit-post/classic.css 571 B +1 B (0%)
build/edit-post/index.min.js 34.5 kB -39 B (0%)
build/edit-post/style-rtl.css 7.49 kB +35 B (0%)
build/edit-post/style.css 7.48 kB +36 B (0%)
build/edit-site/index.min.js 63.3 kB +2.08 kB (+3%)
build/edit-site/style-rtl.css 9.02 kB +497 B (+6%) 🔍
build/edit-site/style.css 9.01 kB +509 B (+6%) 🔍
build/edit-widgets/index.min.js 16.7 kB -47 B (0%)
build/edit-widgets/style-rtl.css 4.48 kB +27 B (+1%)
build/edit-widgets/style.css 4.49 kB +29 B (+1%)
build/editor/index.min.js 44.1 kB +76 B (0%)
build/editor/style-rtl.css 3.69 kB +37 B (+1%)
build/editor/style.css 3.68 kB +36 B (+1%)
build/format-library/index.min.js 7.2 kB +232 B (+3%)
build/format-library/style-rtl.css 598 B +2 B (0%)
build/format-library/style.css 597 B +1 B (0%)
build/list-reusable-blocks/style-rtl.css 865 B +7 B (+1%)
build/list-reusable-blocks/style.css 865 B +8 B (+1%)
build/nux/style-rtl.css 775 B +3 B (0%)
build/nux/style.css 771 B +3 B (0%)
build/reusable-blocks/index.min.js 2.26 kB +33 B (+1%)
build/reusable-blocks/style-rtl.css 283 B +2 B (+1%)
build/reusable-blocks/style.css 283 B +2 B (+1%)
build/rich-text/index.min.js 10.7 kB +48 B (0%)
build/server-side-render/index.min.js 2.09 kB +313 B (+18%) ⚠️
build/vendors/react-dom.min.js 41.8 kB +3.26 kB (+8%) 🔍
build/vendors/react.min.js 4.02 kB -317 B (-7%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 7.16 kB
build/block-editor/content-rtl.css 2.71 kB
build/block-editor/content.css 2.71 kB
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
build/block-library/common-rtl.css 1.05 kB
build/block-library/common.css 1.05 kB
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/compose/index.min.js 12.3 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.74 kB
build/element/index.min.js 4.72 kB
build/escape-html/index.min.js 548 B
build/experiments/index.min.js 882 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.86 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 977 B
build/nux/index.min.js 2.07 kB
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.59 kB
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.51 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.7 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.23 kB
build/widgets/style-rtl.css 1.21 kB
build/widgets/style.css 1.21 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@kevin940726
Copy link
Member

Thanks for experimenting with it! I'd like to ping @tellthemachines as well as she has worked on similar things in Core.

The reason why it's failing on CI is likely because we're running the tests in Linux on CI. This is one of the most significant pain points of visual regression testing: fonts behave slightly differently on different OSes. This means that if we want to get a consistent result for snapshotting/screenshotting, we will need to run the tests in the same environment as on the CI.

Playwright has a built-in way to run the tests in the docker:

docker run --rm --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.28.0-focal /bin/bash
npm install
npx playwright test --update-snapshots

We can integrate that into a npm script and run it when updating snapshot, but that also normally means we'd need to have Docker as a hard requirement for e2e testing. This probably isn't that bad as we already require Docker in wp-env. I think the main issue would be that it'll be harder to debug in a Docker environment. I don't think we can run headed mode or the trace viewer in Docker, for instance.

Perhaps we could only switch to using docker when we pass the --update-snapshots option. This is still gonna be a bit confusing for normal developers though. Another option would be to split all the tests that include (and only include) visual testing to a different suite and run them with a different npm script. I'm open to ideas!


As per the main motivation of this PR: the focus style regression, I think we can first try other explicit assertions like toHaveCSS(). This obviously is testing the implementation details but with a trade-off of keeping the architecture simpler. WDYT?

@afercia
Copy link
Contributor Author

afercia commented Dec 2, 2022

@kevin940726 thanks for the insights! Interesting technical challenge.

As per the main motivation of this PR: the focus style regression, I think we can first try other explicit assertions like toHaveCSS().

Specifically to this test case, I'm not sure toHaveCSS() (which I'm actually using in this PR) would be enough. The focus style wasn't visible (or fully visible) because of conflicts with other CSS. That is: the CSS was applied so toHaveCSS() would assert true but the blue outline wasn't actually visible. See the screenshots on #45369

Regarding the general implementation, there's one more thing to consider. For example, this is one of the reference images used in this PR's. It is used to test the blue outline on the top toolbar:

Navigate-regions-should-navigate-the-editor-regions-and-show-the-outline-focus-style-1-chromium

Even if we manage to solve the font rendering issue, we would be exposed to failures for any change in the content of the top bar. I experimented the mask option but unfortunately it overlays also the outline we need to test.

I also noticed that expect(page).toHaveScreenshot() has also a clip option that may be handy, while expect(locator).toHaveScreenshot() doesn't have a clip option..

I wish there was a more flexible way to hide elements that we don't need to test for. Any thoughts?

For reference, the Playwright docs about Visual comparisons is available at https://playwright.dev/docs/test-snapshots

@afercia
Copy link
Contributor Author

afercia commented Dec 2, 2022

It would also be nice to be able to access the 'expected', 'received', and 'diff' images generated in case of failures at /home/runner/work/gutenberg/gutenberg/artifacts/test-results/.

Update: figured out how to download the test run artifacts.

@afercia
Copy link
Contributor Author

afercia commented Dec 2, 2022

In the last commit, I just want to see if the tests on Ubuntu pass by:

  • Hiding some elements we don't need to test for with the mask option.
  • Making all text transparent, to see if we can workaround the fonts rendering issue. Just a try to see if it passes, I'm not sure we should hide text.

Example of reference image with masked elements:

Navigate-regions-should-navigate-the-editor-regions-and-show-the-outline-focus-style-1-chromium

Example of reference image with all text made transparent:

Navigate-regions-should-navigate-the-editor-regions-and-show-the-outline-focus-style-3-chromium

@afercia
Copy link
Contributor Author

afercia commented Dec 2, 2022

Turns out the font difference between operating systems also affects some buttons size. Actually, Gutenberg and WP use 'system fonts' that is they use a font stack -apple-system, BlinkMacSystemFont,"Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell,"Helvetica Neue", sans-serif. So it's not just a font engine rendering issue. The actual type face in use is different across OSes.

Expected (reference screenshot taken on macOS ) vs. actual (screenshot taken on Ubuntu):

size

@kevin940726
Copy link
Member

I wish there was a more flexible way to hide elements that we don't need to test for. Any thoughts?

Well, we technically have full control over the page so we can always do things like page.evaluate() if necessary.

So it's not just a font engine rendering issue. The actual type face in use is different across OSes.

Yep, exactly. We use different system fonts in different OSes as an optimization to prevent font-swapping and unnecessary network requests. Fonts don't only affect text either, they often affect layout and can be really hard to tackle. I'm not sure if there's an easy way around that.

If we want to create a "stable" visual regression system then I guess the best solution for now is to enforce a consistent environment (Linux and Docker). Services like Percy and Chromatic move visual testing to the cloud so that they can always have a consistent testing environment. Perhaps we can try something similar? The nature of Open Source does make it more complicated though.

@afercia
Copy link
Contributor Author

afercia commented Dec 5, 2022

We use different system fonts in different OSes as an optimization to prevent font-swapping and unnecessary network requests.

Yep, I know. I was there when system fonts were introduced in core. I'm old :)
Visual comparison testing is totally new to me but I'm starting to have a better understanding of what the underlying issues are. I'd agree having a 'stable' environment is key to have reliable tests.

Inspired but this article.Updating the snapshots in CI with a pull-request comment I was thinking at a maybe not that orthodox idea:

  • Let contributors run visual comparison tests on their operating system so that they can run them in headed mode. Git-ignore any committed reference image.
  • Use a GitHub actions workflow (could be triggered by a comment or something else) to update the reference images snapshots on CI. Auto-commit the generated images to the PR's branch. Trigger a tests re-run. This way, the tests on CO would always run using reference images generated on the OS specified in the workflow, likely ubuntu-latest.

Any thoughts?
Of course, this would require some good knowledge with crafting GitHub actions workflows. Not sure I'm the best person for that.

@kevin940726
Copy link
Member

This is very interesting, although might also be very complicated, as you suggested 😅. I'm not concerned by the complexity of the GH Action, but mostly by the development flow for contributors.

  1. How do contributors run visual testing when they don't have any screenshots available at first? This doesn't sound very helpful to the contributors and might be kind of awkward and confusing to them.
  2. Who has permission to trigger the /update-screenshots comment? Only the members? Then it would still be confusing to the contributors if we don't state clearly that it's a member-only command. If it's something that can be triggered by anyone then we might have to worry about comment spam and potentially think of another way to trigger it.
  3. What should we do with manually added screenshots? Is it possible to enforce that a screenshot is only added by the CI?
  4. How do we encourage visual testing when the generated screenshots won't be committed? I guess this is the easiest one though.
  5. Is it possible to preview the screenshots generated by the CI to prevent unexpected results from being committed? A simple solution to this might be a separate /commit-screenshots command, but that is really noisy 😅 .

There are just some initial questions I have in mind. I expect there to be more. I think this is still worth pursuing though, just that it's not trivial and might take a while to mature. Hence why I didn't introduce visual testing when migrating to Playwright in the first place 🙈 .

@afercia
Copy link
Contributor Author

afercia commented Dec 6, 2022

Latest commit is a Proof Of Concept that adds a small utility. It's similar to the mask option of toHaveScreenshot() but ti also add the ability to set an offset for the mask. In this specific case, it allows the blue outline to be visible in the reference images and it also hides most of the regions content. Thinking this utility could be useful in other cases as well.

@afercia
Copy link
Contributor Author

afercia commented Dec 7, 2022

TIL: turns out one of the reasons why the test is currently failing is that openDocumentSettingsSidebar() uses locator.click() which in turn uses page.mouse:

  1. Use page.mouse to click in the center of the element, or the specified position.

That is: the mouse pointer stays on the Settings button. This sometimes makes the Settings button tooltip show even when focus is elsewhere, because the button is hovered. Depends also on timings. The tooltip may then be captured in the 'actual' screenshot. Reproduced locally, see screenshot:

Screenshot 2022-12-07 at 16 14 21

It's something important to keep into consideration when building visual comparison tests.

@afercia
Copy link
Contributor Author

afercia commented Dec 7, 2022

we might have to worry about comment spam and potentially think of another way to trigger it

I'd agree this seems to be a good first step 🎉 I'm not actually thinking the pull request comment would be a good trigger for the workflow.

@afercia
Copy link
Contributor Author

afercia commented Dec 9, 2022

The test now fails because of a difference of 2 pixels 😅

Error: Screenshot comparison failed:
2 pixels (ratio 0.01 of all image pixels) are different

Barely noticeable: it's the antialiasing on the small horizontal line of the Document Overview panel highlighted in the screenshot below (expected vs. actual vs. diff):

expected - actual - diff

I think it's safe to set a threshold for such small differences.

@afercia
Copy link
Contributor Author

afercia commented Dec 9, 2022

Note that maxDiffPixels and other options can also be set globally in PlaywrightTestConfig e.g.:

const config: PlaywrightTestConfig = {
  ...
  expect: {
    toHaveScreenshot: { maxDiffPixels: 100 },
  },
  ...
};

@afercia
Copy link
Contributor Author

afercia commented Dec 15, 2022

For reference, here's what has been done for visual regressions tests in WP Core (they only run locally):
https://core.trac.wordpress.org/ticket/49606
WordPress/wordpress-develop#209

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [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.

3 participants