Automating your QA with Visual Regression Testing
Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
First, We Need To �Get Things Set Up
LoopConf 3.0 • Slides: goo.gl/YB3v43
Make Sure NodeJS Is Up To Date
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Copy The Example Repository Template
https://github.com/ataylorme/visual-regression-testing-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Clon Your Copy Of The Example Repository
git clone https://github.com/ataylorme/visual-regression-testing-workshop.git
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Download Dependencies
npm ci
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Don't Skip Ahead
LoopConf 3.0 • Slides: goo.gl/YB3v43
Let's Dive In
LoopConf 3.0 • Slides: goo.gl/YB3v43
Hi, I’m Andrew
Developer Programs Engineer at Pantheon.
ataylorme on GitHub and Twitter.
Some things I enjoy away from the computer are
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Maintainer of Websites
LoopConf 3.0 • Slides: goo.gl/YB3v43
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Did You Notice �What Changed?
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Anyone Else Do This?
@ataylorme • Slides: goo.gl/oXqt1a
Repeat
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Make The Robots �Do The Work
LoopConf 3.0 • Slides: goo.gl/YB3v43
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Visual Regression: The New Pixel Perfect
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
LoopConf 3.0 • Slides: goo.gl/YB3v43
LoopConf 3.0 • Slides: goo.gl/YB3v43
LoopConf 3.0 • Slides: goo.gl/YB3v43
LoopConf 3.0 • Slides: goo.gl/YB3v43
LoopConf 3.0 • Slides: goo.gl/YB3v43
LoopConf 3.0 • Slides: goo.gl/YB3v43
LoopConf 3.0 • Slides: goo.gl/YB3v43
LoopConf 3.0 • Slides: goo.gl/YB3v43
Visual Regression Benefits
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Visual Regression Limits
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
BackstopJS
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
We Can Have Robot Vision
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Coding: A Node App�For Visual QA
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Copy The Example Repository Template
https://github.com/ataylorme/visual-regression-testing-workshop
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Clone Your Copy Of The Example Repository
git clone https://github.com/ataylorme/visual-regression-testing-workshop.git
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Download Dependencies
npm ci
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Run Visual Regression Tests
npm run start
And select Return to Pantheon Test
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Wait For BackstopJS To Run
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
View The Resulting Report
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Update The Site List
Edit inc/sitesToTest.js
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Run Visual Regression Tests Again
npm run start
Select your site from the list
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Adjust The BackstopJS Config
Edit inc/backstopConfig.js
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Run Visual Regression Tests Again
npm run start
Select your site from the list
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
LoopConf 3.0 • Slides: goo.gl/YB3v43
Advanced: BackstopJS Custom Scripts
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Example: Remove Element From Page
Change #wp-gdpr-cookie-notice to a CSS selector of something on your site
module.exports = async (page, scenario, vp) => {
// Remove an element from the page
await page.$eval('#wp-gdpr-cookie-notice', e => e.parentNode.removeChild(e));
}
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Example: Expand Mobile Menu
module.exports = async (page, scenario, vp) => {
// If on mobile and the homepage, expand the menu
if ('phone' === vp.name && 'Homepage' === scenario.label) {
const menuToggleButtonSelector = 'button.menu-toggle';
try {
await page.waitForSelector(menuToggleButtonSelector, {timeout: 250,visible: true});
await page.click(menuToggleButtonSelector);
} catch (error) {
console.log("Could not find the menu toggle button.");
}
}
}
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Example: Wait For All Network Requests
function waitForNetworkIdle(page, timeout, maxInflightRequests = 0) {
page.on('request', onRequestStarted);
page.on('requestfinished', onRequestFinished);
page.on('requestfailed', onRequestFinished);
let inflight = 0;
let fulfill;
let promise = new Promise(x => fulfill = x);
let timeoutId = setTimeout(onTimeoutDone, timeout);
return promise;
function onTimeoutDone() {
page.removeListener('request', onRequestStarted);
page.removeListener('requestfinished', onRequestFinished);
page.removeListener('requestfailed', onRequestFinished);
fulfill();
}
function onRequestStarted() {
++inflight;
if (inflight > maxInflightRequests)
clearTimeout(timeoutId);
}
function onRequestFinished() {
if (inflight === 0)
return;
--inflight;
if (inflight === maxInflightRequests)
timeoutId = setTimeout(onTimeoutDone, timeout);
}
}
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Usage: Handling Lazy-Loaded Assets
module.exports = async (page, scenario, vp) => {
// Scroll to the bottom of the page
await page.evaluate(() => {
window.scrollBy(0, window.innerHeight);
});
// Wait for all network activity to stop
await waitForNetworkIdle(page, 500, 0);
}
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Benefits of Adopting Automation
LoopConf 3.0 • Slides: goo.gl/YB3v43
Reduced Overhead
@ataylorme • Slides: goo.gl/oXqt1a
Consistency
@ataylorme • Slides: goo.gl/oXqt1a
Risk Mitigation
@ataylorme • Slides: goo.gl/oXqt1a
Confidence
@ataylorme • Slides: goo.gl/oXqt1a
Automation is �a State of Mind
LoopConf 3.0 • Slides: goo.gl/YB3v43
Visual Regression Automatically on PRs
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Reports Saved In The Cloud
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Adding More Tests
Visual Regression Testing
Unit Tests
Integration Tests
Browser Tests
Performance Tests
Load�Tests
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Example: Audit With Lighthouse
Lighthouse is a tool developed by Google to audit sites on performance, accessibility, best practices and more.
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Lighthouse Use Case
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Automation is a Journey
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Resources
@ataylorme • Slides: goo.gl/oXqt1a
Learning About Visual Regression
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
NodeJS App Repository
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Reference Project: GitHub + CircleCI Workflow
@ataylorme • Slides: bit.ly/ataylorme-visual-regression-workshop
Questions?�Slides: bit.ly/ataylorme-visual-regression-workshop�@ataylorme
@ataylorme • Slides: goo.gl/oXqt1a