cypress

Il se distingue des solutions traditionnelles comme Selenium par son architecture unique et son approche orientée développeurs. Contrairement aux outils basés sur WebDriver, Cypress fonctionne directement dans le navigateur et interagit avec l’application comme le ferait un utilisateur réel.

Pourquoi utiliser Cypress ?

Cypress est particulièrement apprécié pour :

  • Sa simplicité d’installation et de configuration : Une seule commande npm install cypress suffit pour démarrer.
  • Sa rapidité d’exécution : Grâce à son exécution directe dans le navigateur, les tests sont plus rapides que ceux basés sur WebDriver.
  • Son interactivité : L’interface graphique permet de voir en temps réel l’exécution des tests, avec une capture des erreurs et un débogage simplifié.
  • Son écosystème intégré : Cypress fournit un tableau de bord interactif, des fonctionnalités de mocking (interception des requêtes réseau), et un enregistrement vidéo des tests.
  • Cypress gère les attentes implicites et n’a pas besoin de wait ou sleep explicites pour attendre un élément, évitant ainsi des tests fragiles.

Quand utiliser Cypress ?

  • Tests End-to-End (E2E) : Vérifier le fonctionnement global d’une application.
  • Tests d’intégration : Valider le comportement d’un composant isolé avec ses dépendances.
  • Tests d’interface utilisateur : Vérifier que les interactions avec l’UI fonctionnent correctement.

Limites de Cypress

  • Ne supporte pas le multi-onglet et les tests natifs mobiles.
  • Cypress fonctionne avec une politique de même origine (same-origin policy), ce qui complique les tests impliquant plusieurs domaines.
  • Pour des suites de tests très lourdes, Cypress peut être plus lent que Selenium, surtout lorsqu’il s’agit de tests sur des applications complexes.
  • Bien que Cypress soit puissant, il est limité à l’écosystème JavaScript. Ceux qui utilisent d’autres langages comme Java ou Python pourraient préférer Selenium.

Fonctionnalités principales de Cypress

  • Exécution dans le navigateur : Contrairement à Selenium, Cypress n’utilise pas WebDriver mais exécute les tests directement dans le navigateur, ce qui réduit la latence et les problèmes liés à la synchronisation.
  • Attente automatique : Cypress détecte automatiquement la fin des requêtes réseau et attend que les éléments soient disponibles avant d’interagir avec eux.
  • Débogage simplifié : Grâce à son interface, il est possible de voir l’état du DOM et de rejouer des étapes de test.
  • Mocking et Stubbing des requêtes HTTP : Cypress permet de simuler des réponses d’API pour tester des scénarios spécifiques sans dépendre du backend.
  • Prise en charge des tests end-to-end, d’intégration et d’UI : Cypress est principalement utilisé pour les tests E2E, mais il permet aussi d’écrire des tests d’intégration et d’interface utilisateur.

Installation de Cypress

L’installation de Cypress est rapide, il suffit de taper :

npm install cypress –save-dev

  • Deux fichiers sont apparus : package.json et package-lock.json et le dossier node_modules

 

Configuration

Lors de la première exécution de Cypress, il faut le configurer. Pour cela, il suffit d’exécuter une commande : 

npx cypress open

Vous pouvez configurer E2E testing ou Component Testing. On parle de E2E testing pour les tests de bout en bout alors que Component Testing sont pour tester individuellement les tests comme un bouton. 

Cliquez sur E2E Testing et suivez les étapes. L’architecture est créée : 

Ensuite, vous pourrez créer vos tests et les exécuter. Cliquer sur “Create new spec” :

Vous pouvez le nommer par exemple : cypress\e2e\saucedemo.cy.js. Puis cliquez sur “create another spec”

Reprenons les étapes que nous avions vu dans la partie Sauce Demo.

Connexion à l’application avec un utilisateur valide

Vous pouvez ajouter ce test dans le fichier qui a été créé dans votre repository. Vous pouvez trouver ci-contre la nouvelle architecture du projet et le code ci-dessous :

it(‘Se connecter et ajouter un produit au panier’, () => {

// Aller sur la page

cy.visit(‘https://www.saucedemo.com/’);

// Connexion avec un utilisateur valide

cy.get(‘[data-test= »username »]’).type(‘standard_user’);

cy.get(‘[data-test= »password »]’).type(‘secret_sauce’);

cy.get(‘[data-test= »login-button »]’).click();

// Vérifier que la connexion est réussie

cy.url().should(‘include’, ‘/inventory.html’);

cy.contains(‘Products’).should(‘be.visible’);

// Ajouter le premier produit au panier

cy.get(‘.inventory_item’).first().within(() => {

cy.get(‘.btn_inventory’).click();

});

// Vérifier que l’icône du panier indique 1 produit

cy.get(‘.shopping_cart_badge’).should(‘contain’, ‘1’);

});

Vous pouvez exécuter le test avec l’interface graphique comme ci-dessous avec la commande npx cypress open ou en ligne de commande headless (sans ouverture de navigateur) avec la ligne de commande npx run cypress. Cette dernière est très pratique pour l’exécution dans une CI.

Ajouter un produit au panier et valider l’affichage des éléments.

Vous pouvez ajouter ce test dans le fichier votre fichier. 

it(‘Vérifier le panier et finaliser la commande’, () => {

// Connexion

cy.get(‘[data-test= »username »]’).type(‘standard_user’);

cy.get(‘[data-test= »password »]’).type(‘secret_sauce’);

cy.get(‘[data-test= »login-button »]’).click();

// Ajouter un produit

cy.get(‘.inventory_item’).first().within(() => {

cy.get(‘.btn_inventory’).click();

});

// Aller au panier

cy.get(‘.shopping_cart_link’).click();

cy.url().should(‘include’, ‘/cart.html’);

// Vérifier la présence du produit dans le panier

cy.get(‘.cart_item’).should(‘have.length’, 1);

// Procéder au checkout

cy.get(‘[data-test= »checkout »]’).click();

cy.url().should(‘include’, ‘/checkout-step-one.html’);

// Remplir les informations du client

cy.get(‘[data-test= »firstName »]’).type(‘John’);

cy.get(‘[data-test= »lastName »]’).type(‘Doe’);

cy.get(‘[data-test= »postalCode »]’).type(‘75001’);

cy.get(‘[data-test= »continue »]’).click();

// Vérifier l’étape finale et terminer l’achat

cy.get(‘[data-test= »finish »]’).click();

cy.contains(‘Thank you for your order!’).should(‘be.visible’);

});

Tester la déconnexion et vérifier la persistance des sessions

Vous pouvez ajouter ce test dans le fichier qui a été créé dans votre repository. Vous pouvez trouver ci-contre la nouvelle architecture du projet et le code ci-dessous : 

it(‘Se déconnecter de l application’, () => {

// Connexion

cy.get(‘[data-test= »username »]’).type(‘standard_user’);

cy.get(‘[data-test= »password »]’).type(‘secret_sauce’);

cy.get(‘[data-test= »login-button »]’).click();

// Ouvrir le menu et cliquer sur Logout

cy.get(‘#react-burger-menu-btn’).click();

cy.get(‘#logout_sidebar_link’).click();

// Vérifier que l’on est bien déconnecté

cy.url().should(‘include’, ‘/’);

cy.get(‘[data-test= »login-button »]’).should(‘be.visible’);

});

Utiliser un compte « buggué » (problem_user) pour voir comment les erreurs sont gérées

it(‘Se connecter avec problem_user et vérifier les bugs potentiels’, () => {

// Connexion

cy.get(‘[data-test= »username »]’).type(‘problem_user’);

cy.get(‘[data-test= »password »]’).type(‘secret_sauce’);

cy.get(‘[data-test= »login-button »]’).click();

// Vérifier la connexion réussie en contrôlant l’URL

cy.url().should(‘include’, ‘/inventory.html’);

// Vérifier si les images des produits sont bien affichées

cy.get(‘.inventory_item_img’).each(($img) => {

cy.wrap($img).should(‘be.visible’);

});

// Vérifier que les boutons d’ajout au panier sont bien cliquables

cy.get(‘.btn_inventory’).each(($btn) => {

cy.wrap($btn).should(‘be.visible’).and(‘be.enabled’);

});

// Vérifier la cohérence des produits affichés

cy.get(‘.inventory_item’).should(‘have.length’, 6);

// Ajouter un produit au panier

cy.get(‘.inventory_item’).first().find(‘.btn_inventory’).click();

// Vérifier que l’icône du panier est mise à jour

cy.get(‘.shopping_cart_badge’).should(‘be.visible’).and(‘contain’, ‘1’);

// Aller sur la page du panier

cy.get(‘.shopping_cart_link’).click();

cy.url().should(‘include’, ‘/cart.html’);

// Vérifier que le produit ajouté est bien dans le panier

cy.get(‘.cart_item’).should(‘have.length’, 1);

// Tenter de passer la commande

cy.get(‘[data-test= »checkout »]’).click();

cy.url().should(‘include’, ‘/checkout-step-one.html’);

// Remplir les informations de commande

cy.get(‘[data-test= »firstName »]’).type(‘Test’);

cy.get(‘[data-test= »lastName »]’).type(‘User’);

cy.get(‘[data-test= »postalCode »]’).type(‘75000’);

cy.get(‘[data-test= »continue »]’).click();

// Vérifier la présence des éléments de la commande

cy.url().should(‘include’, ‘/checkout-step-two.html’);

cy.get(‘.cart_item’).should(‘have.length’, 1);

});

N’utilisez pas Cypress si :

  • Vous devez tester une application nécessitant plusieurs onglets.
  • Vous devez tester du mobile.
  • Vous devez exécuter des tests sur différents domaines (cross-origin).
  • Vous avez une équipe qui n’est pas JS-oriented.

Testez votre application web avec Cypress -

À lire :

En octobre 2023, j’ai publié le livre « Automatisez vos tests avec Cypress » Fanny VELSIN aux Éditions ENI.

Cet ouvrage, accessible aussi bien aux débutants qu’aux profils plus expérimentés, a pour objectif d’accompagner les lecteurs dans la découverte et la mise en œuvre de Cypress.

À travers des explications que j’espère claires, des cas pratiques et de nombreux exemples de scripts, il vous guide pas à pas dans vos projets de tests automatisés.

Le livre est disponible en version imprimée et numérique sur le site des Éditions ENI, ainsi que chez des libraires en ligne comme la FNAC.

voir aussi : l’article sur Sauce Labs

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *