Zeno pixel : détection de régressions visuelles

Zeno pixel est une application NodeJS qui permet d’améliorer le processus de mise en production régulière – continuous delivery – en automatisant la détection des régressions visuelles.
Pourquoi utiliser Zeno pixel ?
Lorsque nous développons de nouvelles fonctionnalités pour notre site web LesFurets.com, il arrive que des effets de bords viennent dégrader le rendu graphique du site. Ces régressions visuelles sont difficilement détectable par des tests, qu’ils soient unitaires ou d’intégrations.
Ces effets de bords peuvent être causés de différentes manières :
- modification d’une classe CSS utilisée sur plusieurs pages
- modification de la réponse d’un webservice
- modification d’un script JS
- n’importe quel développement en fait
Pour toutes ces raisons, il nous a paru nécessaire de concevoir Zeno pixel, un outil capable de détecter ces régressions. Son principe est simple, il se charge de prendre des captures d’écran de nos pages et de les comparer avec une version précédente ou une version d’un autre environnement. L’application tourne sur NodeJS et utilise PhantomJS ou SlimerJS, ce qui lui permet de simuler le comportement d’un navigateur web sur ordinateur, tablette ou smartphone.
La différence est affichée en pourcentage et mise en exergue par des pixels violet. Par défaut le client web Zeno pixel n’affiche que les pages en erreurs sans les miniatures des captures d’écran. Mais l’interface propose d’afficher aussi les pages sans différences ainsi que toutes les miniatures des pages.
Utilisation avec plusieurs environnements
L’utilisation faite par LesFurets.com consiste a définir dans Zeno pixel notre environnement de production et celui de pré-production et de les comparer deux à deux lors d’un déploiement. Ainsi nous vérifions qu’il n’y a pas de régressions visuelles sur l’environnement de pré-production avant de donner le feu vert à la mise en production.
Utilisation avec un seul environnement
Zeno pixel permet aussi de comparer un environnement avec sa version précédente (avec la variable de configuration offset
expliquée plus bas). Nous disposons ainsi d’un moyen de vérifier quand a été introduit un changement visuel pour des applications ne disposant que d’un seul environnement.
Prise en main
Zeno pixel est composé :
- d’un serveur écrit en JavaScript et servi par NodeJS pour :
- prendre des captures d’écran
- comparer les captures entre elles
- d’un client web écrit lui aussi en JavaScript/CoffeeScript avec le framework AngularJs pour :
- permettre de lancer la prise de capture d’écran sur un environnement ou sur une url donnée
- lancer une comparaison entre une URL et sa version précédente ou entre deux environnements
- configurer l’outil vérifier la liste des URLs
- filtrer les résultats
Installation
Installer NodeJS :
Linux : sudo apt-get install node
Mac Os X : brew install node
Toutes les dépendances se retrouvent dans le fichier package.json
, il suffit ainsi de les installer avec npm
:
npm install
Une fois l’installation réussie vous pouvez lancer le serveur avec la commande :
node zenoServer.js
Par défaut le serveur écoute sur le port 1337. Il vous suffit donc de lancer un navigateur web à l’adresse http://127.0.0.1:1337 pour afficher l’interface graphique.
Configuration
Fichier de configuration des URLs
Pour définir les pages que Zeno pixel doit capturer il vous suffit d’écrire un fichier JSON avec une structure particulière. Un fichier page_template.json
est fourni dans le projet comme exemple. Par défaut le fichier utilisé par Zeno pixel est pages.json
pour changer le nom de celui-ci il suffit de le préciser en ligne de commande avec le paramètre --file
. Il doit disposer d’une configuration avec les clés :
{
"host": "{$alias}example.com",
"envs": [{
"alias": "dev",
"server": "myserver1.",
"port": ":1234",
"alternative": ["myserver2-"]
}, {
"alias": "prod",
"server": ""
}, {
"alias": "previous prod",
"server": "",
"offset": -1
}],
"desktop": [{
"url": "$host",
"name": "homepage"
}, {
"url": "$host/auto",
"name": "auto"
}, {
"url": "$host/search",
"name": "search",
"alternative": 0
}],
"mobile": {},
"tablet": {}
}
host
: le domaine, pour utiliser une variable d’environnement utilisez{$alias}
envs
: une liste d’environnement, pour chacun il vous faut spécifier :alias
: le nom affiché pour chaque environnement (obligatoire)server
: sous-domaine suffixé d’un.
(obligatoire)port
: si le port est différent de 80 ou 443 préfixé de:
offset
: entier négatif correspondant à la- n-ieme
version de l’environnement, -1 pour l’avant dernière, -2 pour l’antépénultième etc.alternative
: contient les sous-domaines alternatifs
desktop
,tablet
,mobile
avec pour valeur une liste de pages. Pour chaquepage
, il vous faut spécifier :url
: URL de la page (utilisez la variable$host
)name
: nom du fichier sauvegardé sur le disquecookies
: liste des cookies à utiliser lors de la capture d’écran (cf ci-dessous)
Cookies
Il est possible de préciser à Zeno pixel quels cookies sont nécessaires à la capture d’écran de certaines pages. Pour préciser la valeur des cookies il vous suffit de créer le fichier JSON suivant :
{
"cookie1" : {
"name": "my_cookie",
"value": "my_value",
"domain": "www.lesfurets.com",
"path": "/"
},
"cookie2" : {...}
}
Raccourci clavier
- E : fait apparaitre ou disparaitre la miniature des captures d’écran dans l’écran de comparaison
- T : permet de revenir en haut de l’écran
Processus de mise en production
Dans le cadre de nos mises en production nous avons un Zeno pixel installé sur un serveur distant. Ainsi, à chaque déploiement, nous demandons à Zeno pixel de faire des captures d’écran d’un environnement en particulier et de le comparer avec un autre. Cela peut être fait avec le client dans l’interface utilisateur mais il est surtout possible de le déclencher à l’aide d’une URL. Ainsi dans notre processus de déploiement nous déclenchons à l’aide d’une commande :
curl -s http://zeno-url.com/update/${env}${/version}
La variable ${env}
correspond au nom de l’environnement. Il est possible aussi de passer en dernier paramètre d’URL la version ${/version}
pour la retrouver dans l’historique par la suite.
Historique des modifications
Il est aussi possible de retrouver un historique de toutes les captures d’écran des pages dans Zeno pixel. Il est ainsi possible d’avoir des captures d’écran de vos URL d’une version et de les télécharger au format PDF.
Bravo les furets, super outil.
Bravo Matthieu, super commentaire 😉
Merci à toi pour la génèse de l’outil, on prend toutes contributions sur l’article et l’outil.
Je vous remercie! C’est génial pour créer des web snapshots 🙂