Visual regression testing concept in Cypress - Build an Automation Script
import { addMatchImageSnapshotCommand } from 'cypress-image-snapshot/command'; addMatchImageSnapshotCommand(); describe('Visual Regression Test for Homepage', () => { beforeEach(() => { cy.visit('https://example.com'); }); it('should match the homepage visual snapshot', () => { cy.document().toMatchImageSnapshot({ failureThreshold: 0.01, // 1% threshold for minor acceptable differences failureThresholdType: 'percent' }); }); });
This test uses the cypress-image-snapshot plugin to perform visual regression testing.
First, we import and add the snapshot command to Cypress.
In the test, we visit the homepage URL before each test to ensure a fresh state.
The toMatchImageSnapshot command takes a screenshot of the current page and compares it to a baseline image stored in the snapshots folder.
The failureThreshold is set to 1% to allow minor differences like anti-aliasing or rendering variations.
If the images differ more than the threshold, the test fails, indicating a visual regression.
Now add data-driven visual regression tests for three different pages: homepage, about page, and contact page.
Practice
Solution
Step 1: Understand visual regression testing goal
Visual regression testing compares screenshots to detect visual changes.Step 2: Identify the main purpose in Cypress context
Cypress uses visual regression to ensure UI looks the same after code changes.Final Answer:
To check if the webpage appearance changes unexpectedly after updates -> Option DQuick Check:
Visual regression = check appearance changes [OK]
- Confusing visual regression with performance testing
- Thinking it tests backend logic
- Assuming it checks link functionality
Solution
Step 1: Identify commands related to visual regression
cy.matchImageSnapshot() is designed to compare screenshots for visual testing.Step 2: Differentiate from other Cypress commands
cy.visit() loads pages, cy.get() selects elements, cy.click() simulates clicks.Final Answer:
cy.matchImageSnapshot() -> Option CQuick Check:
Snapshot command = cy.matchImageSnapshot() [OK]
- Choosing cy.visit() which loads pages
- Confusing cy.get() with snapshot command
- Selecting cy.click() which triggers clicks
cy.visit('https://example.com')
cy.matchImageSnapshot('homepage')Solution
Step 1: Understand snapshot comparison behavior
cy.matchImageSnapshot compares current screenshot to saved snapshot and fails if different.Step 2: Apply this to changed page appearance
If the page looks different, the test detects difference and fails.Final Answer:
The test fails because the new screenshot differs from the saved snapshot -> Option AQuick Check:
Visual difference causes test failure [OK]
- Thinking test always passes regardless of changes
- Assuming test reloads page automatically
- Believing snapshot comparison is skipped
cy.matchImageSnapshot('homepage')
cy.visit('https://example.com')Solution
Step 1: Check command order for visual testing
Page must be loaded with cy.visit() before taking a snapshot.Step 2: Verify argument and command validity
cy.matchImageSnapshot() accepts a string name; cy.visit() is valid; cy.get() not required here.Final Answer:
cy.visit() should be called before cy.matchImageSnapshot() -> Option AQuick Check:
Visit page first, then snapshot [OK]
- Calling snapshot before loading page
- Thinking cy.matchImageSnapshot() disallows string names
- Assuming cy.visit() is invalid
- Believing cy.get() is mandatory before snapshot
Solution
Step 1: Understand problem with dynamic content
Dynamic text changes cause snapshot differences and false failures.Step 2: Choose best practice to handle dynamic parts
Masking or hiding dynamic areas before snapshot avoids false positives.Step 3: Evaluate other options
Custom names create many snapshots; removing cy.visit() breaks test; averaging snapshots is invalid.Final Answer:
Ignore the dynamic area by masking or hiding it before snapshot -> Option BQuick Check:
Mask dynamic content to stabilize snapshots [OK]
- Saving separate snapshots for each user causes clutter
- Skipping page load breaks test
- Trying to average snapshots is not supported
Ready to prove it?
Pass the test and this pattern moves unknown
