Je vous ai déjà parlé des tests unitaires sur un projet Angular. Aujourd’hui je vais vous présenter comment faire des tests d’intégration (end to end ou E2E). Le but des tests d’intégration est de s’assurer que tous les composants de votre application fonctionnent correctement ensemble. Pour cela, les tests seront joués dans un navigateur et des actions utilisateurs seront simulées.
Les tests d’intégration sont donc complémentaire des tests unitaires.
Angular a été pensé pour être testable et il y a donc un outil pour les tests E2E : Protractor, développé par la team Angular (Il est possible de l’utiliser pour tester des applications qui ne sont pas basé sur Angular).
Protractor utilise Selenium qui permet de contrôler un navigateur (aller à une page, cliquer sur un bouton, …)
Installation
Protractor est un module node et il faut donc avoir node installé sur son poste.
Je vous conseille de l’installer en global (Préfixer la commande par sudo si vous êtes sous Linux (Ubuntu pour moi).
npm install protractor -g
Il faut ensuite configurer selenium via la commande suivante
webdriver-manager update
Configuration
La configuration de Protractor se fait via un fichier .js.
Voici celui que j’utilise dans mon application de volley :
Ecriture des tests
Il faut ensuite écrire vos tests. Par défaut, protractor utilise Jasmine mais vous pouvez utiliser d’autres framework de test comme mocha par exemple.
Protractor met à votre disposition des variables globales vous permettant d’interagir avec le navigateur comme par exemple :
- browser: browser.get(‘url’) : permet d’ouvrir la page passé en paramètre
- element and by: element(by.model(‘yourName’)) : permet de récuperer un élement de la apge
- protractor: protractor.Key : permet la gestion des touches (ex : protractor.Key.ENTER)
Protractor étant à la base pensé pour angular, il fournit des sélecteurs lié à angular comme
- by.model(‘first’) : récupère l’input lié à la variable de scope first (ng-model= »first »)
- by.binding(‘myModel’) : récupere l’élement bindé sur myModel (
- by.repeater(‘user in users’).row(0).column(‘name’) : récupère le nom d’un 1er element de la liste users
Voici une exemple de test sur mon application de volley qui permet de vérifier qu’on ne peut pas lancer de partie si le nom d’une des équipes n’est pas renseignée :
Voici le lien vers la documentation officielle de l’api de protractor ainsi qu’une CheatSheet et un gist (en coffeescript).
Dans le cas ou vous faites un appel serveur, il faut utiliser la ligne suivante afin de ne pas poursuivre vos tests et notamment vos vérifications tant qu’angular n’a pas traité le retour
browser.waitForAngular();
Lancer les tests
Il faut d’abord lancer le server Selenium (webdriver) via la commande suivante :
webdriver-manager start
On peut alors lancer dans un autre terminal protractor :
protractor test/e2e/config.js // Chemin vers votre fichier de configuration
Une fenêtre de navigateur va alors se lancer et jouer les tests sous vos yeux. Magique !
Le résultat de vos tests sera affiché dans la console :
Comme vous pouvez le voir, il me reste encore du travail pour tout valider 😉 .
Attention, votre site doit être accessible. Dans mon cas, je le lance via la commande
grunt serve
NB : Il existe un plugin pour lancer protractor depuis grunt : grunt-protractor-runner. Je n’ai pas encore eu le temps de le tester …
Ressources
- Le tutorial officiel
- Une très bonne présentation de protractor
- Un Article sur ng-newsletter.com
- Quelques Vidéos :
- Vidéo de présentation de protactor sur egghead.io
- Une vidéo de présentation du mode interactif pour faciliter l’écriture de vos tests