argus eyes

48
argus eyes Bran van der Meer, 18-08-2015

Upload: bran-van-der-meer

Post on 13-Apr-2017

486 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Argus Eyes

argus eyesBran van der Meer, 18-08-2015

Page 2: Argus Eyes

Agenda

1. Regression2. Tooling3. Argus Eyes

Page 3: Argus Eyes

Regression

1

Page 4: Argus Eyes

re·gres·sionnoun; /rɪˈɡrɛʃ(ə)n/1 a situation in which things get worse rather than better2 a return to a former state

Page 5: Argus Eyes

Regression testing

Regression testing is a type of software testing that seeks to uncover new software bugs, or regressions, in existing functional areas of a system after changessuch as enhancements, patches or configuration changes, have been made to them.

Page 6: Argus Eyes

Visual Regression

• We’re not functionally testing the application• We’re only testing the implemented design• CSS is “global”, and thus risky• Automation because continuous bug delivery• Automation because humans are not robots

Page 7: Argus Eyes

Spot the differences

Page 8: Argus Eyes

Humans fail at tiny details

Page 9: Argus Eyes

Why in the front-end?

• Fail fast• We know what is visually right and wrong• We need to fix the visual bugs anyway

Page 10: Argus Eyes

Tooling

2

Page 11: Argus Eyes

Most tools

• Need a config (json/yaml/dsl)• Capture baseline• Compare current state with baseline

Page 12: Argus Eyes

Requirement: Fail fast

• Early dropout, unit-test style• CLI reports• Possibly pre-commit or pre-push

Page 13: Argus Eyes

Requirement: Component-based

• Page-based gives too many false positives• No duplicate selectors in config

Page 14: Argus Eyes

Requirement: Gitflow

Page 15: Argus Eyes

Requirement: Gitflow

Page 16: Argus Eyes

Requirement: Async loading

• When has the page finished loading?• Fixed timeout?• Event fired?• Attribute available?• Custom conditions?• Require.js& Conditioner.js

Page 17: Argus Eyes

Requirement: Flexible

• Generate the config (or partially)• Set baseline (or multiple)• Compare (any two sets of screenshots)

Page 18: Argus Eyes

Existing tools

• PhantomCSS• BackstopJS• Succss• Wraith• Galen• Applitools

Page 19: Argus Eyes

Existing tools → Meh

• PhantomCSS → Buggy• BackstopJS → No Gitflow support• Succss → Immature• Wraith → Ruby• Galen → Too complex• Applitools → Not open source

Page 20: Argus Eyes

“It can’t be that difficult, right?”— Famous last words.

Page 21: Argus Eyes

Argus Eyes

3

Page 22: Argus Eyes

http://github.com/arguseyes/argus-eyesFuture: http://arguseyes.io/

Page 23: Argus Eyes
Page 24: Argus Eyes

Flexible

• Simple CLI tool, Unix philosophy• Distilled down to just two actions:

• Capture a new set, save as any name• Compare any two sets

Page 25: Argus Eyes

Walkthrough

1. Create a config file2. Set a baseline for comparison3. Add commits4. Add the current state for comparison5. Test for visual differences between the two sets

Page 26: Argus Eyes

Create a config file

• Tell argus eyes what screen sizes, pages and components you have

• Filename: argus-eyes.json• Pages have a name and url• Pages have components• Components have a name and css selector

Page 27: Argus Eyes

Example config file{

"sizes": ["320x480", "768x1024"],"pages": [ {

"name": "homepage","url": "http://localhost:3000/","components": ["header", "footer"]

} ],"components": [ {

"name": "header","selector": ".header"

}, {"name": "footer","selector": ".footer"

} ]}

Page 28: Argus Eyes

Set baseline for comparison

argus-eyes add baseline

Page 29: Argus Eyes

1 Set of screenshots in cache.argus-eyes/

baseline/

320x240/

homepage/

header.png

footer.png

768x1024/

homepage/

header.png

footer.png

Page 30: Argus Eyes

Add current state for comparison

argus-eyes add current

Page 31: Argus Eyes

2 Sets of screenshots in cache.argus-eyes/ .argus-eyes/

baseline/ current/

320x240/ 320x240/

homepage/ homepage/

header.png header.png

footer.png footer.png

768x1024/ 768x1024/

homepage/ homepage/

header.png header.png

footer.png footer.png

Page 32: Argus Eyes

Test for visual differences

argus-eyes compare baseline current

Page 33: Argus Eyes

Succeeded compare

Failed compare

Page 34: Argus Eyes

Found a difference

Page 35: Argus Eyes

Comparison results also in cache.argus-eyes/ .argus-eyes/ .argus-eyes/

baseline/ current/ diff_baseline_current/

320x240/ 320x240/

homepage/ homepage/

header.png header.png

footer.png footer.png

768x1024/ 768x1024/ 768x1024/

homepage/ homepage/ homepage/

header.png header.png

footer.png footer.png footer.png

Page 36: Argus Eyes

Gitflow examplegit checkout masterargus-eyes add master

git checkout developargus-eyes add developargus-eyes compare master develop

git checkout feature/developargus-eyes add feature/developargus-eyes compare master feature/developargus-eyes compare develop feature/develop

Page 37: Argus Eyes

Feature: ignore elements

Page 38: Argus Eyes

Feature: ignore elements

Hide a child element of a component (display:none):

{

"components": [

{

"name": "happy-hour",

"selector": ".happy-hour",

"ignore": ".counter"

}

]

}

Page 39: Argus Eyes

Feature: finished-when

We’re not visually finished when the DOMContentLoadedand window.onload events are fired!

Page 40: Argus Eyes

Feature: finished-when

Provide a function to specify when it’s finished loading:

{

"finished-when":

"return document.body.hasAttribute('data-conditioner-initialized');"

}

{

"finished-when":

"setTimeout(function() {

var timeout = true;

}, 2500);

return timeout;"

}

Page 41: Argus Eyes

Feature: threshold

Set the threshold percentage for comparison:

argus-eyes compare develop current--threshold=5

Try to solve every false positive with ignore first!

Page 42: Argus Eyes

Feature: configtest

Run a config file syntaxtest:

argus-eyes configtest

Page 43: Argus Eyes

$ npm i argus-eyes -g

Page 44: Argus Eyes
Page 45: Argus Eyes

$ argus-eyes --versionv0.4.0

Page 46: Argus Eyes
Page 47: Argus Eyes

Pull Request incoming

• Generate & update config file:gulp visual-regression-update-config

• Add baseline:gulp visual-regression-add

• Compare current with baseline:gulp visual-regression-test

• Add set with any name:gulp visual-regression-add --name=develop

• Compare any two sets:gulp visual-regression-test

--left=master --right=develop

Page 48: Argus Eyes

Thoughts?