IMDW320 - Tests et CI - 25/03/2024 - Tests end-to-end avec WebdriverIO

Introduction à WebdriverIO

Qu’est-ce que WebdriverIO ?

WebdriverIO est une bibliothèque de test open-source pour automatiser les tests fonctionnels des applications web. Elle simplifie le processus de création et d’exécution de tests end-to-end (e2e) en permettant aux développeurs de simuler les interactions utilisateur, telles que la navigation sur des pages et le remplissage de formulaires, dans différents navigateurs web.

Pourquoi utiliser WebdriverIO ?

  • Automatisation des tests : WebdriverIO permet d’automatiser les interactions utilisateur pour tester le bon fonctionnement d’une application web, ce qui réduit le temps nécessaire à la validation manuelle et améliore la qualité du logiciel.

  • Compatibilité multi-navigateurs : Il offre une prise en charge native de plusieurs navigateurs populaires, ce qui permet de tester l’application sur différentes plateformes et configurations.

  • Intégration avec les frameworks de test : WebdriverIO peut être facilement intégré à des frameworks de test tels que Mocha, Jasmine et Jest, facilitant ainsi l’organisation et l’exécution des tests.

En résumé, WebdriverIO est un outil puissant pour automatiser les tests fonctionnels des applications web, offrant aux développeurs un moyen efficace de garantir la fiabilité et la qualité de leurs logiciels.

Récupération et configuration du dépôt

Nous allons partir d’un dépôt existant : il s’agit d’une application d’e-commerce développée par mes soins, relativement fonctionnelle bien que simpliste.

  1. Forkez le dépôt suivant puis clonez votre fork : dépôt sur GitLab.
  2. Créez immédiatement une branche : git checkout -b tests-e2e, afin d’éviter de “push” directement sur main (pour faciliter d’éventuelles màj de cette branche depuis mon dépôt).
  3. Lisez le README.md à la racine du dépôt (ou plus simplement à l’URL précédente).

Installation de WebdriverIO

La page d’accueil du site officiel comporte un lien Get Started.

Sur cette page, scrollez sous la vidéo d’introduction. Dans la section “Initiate a WebdriverIO Setup”, vous trouvez des commandes pour initialiser WebDriverIO dans le dépôt.

❗️ Assurez-vous que vous êtes bien à la racine du dépôt fullstack-ecommerce ❗️

Prenez la commande pour npm : npm init wdio@latest .. Même si pnpm est proposé,

Cela lance un “assistant d’installation” en ligne de commande, qui va vous poser des questions (beaucoup !).

Réponses à l’“assistant d’installation”

Dans la plupart des cas, on garde simplement les choix par défaut.

Il est à noter que lorsqu’on est invité à choisir un framework de test, ni Jest (utilisé lors du cours sur les tests unitaire et intégration backend), ni Vitest (utilisé pour le cours sur les tests React) ne sont proposés.

On pourra sans problème se rabattre sur Mocha - qui a été en son temps le framework le plus populaire dans la communauté JS. Mocha est très proche de Jest et Vitest en termes de structuration et d’écriture des tests (describe, it).

  • A project named “fullstack-ecommerce” was detected at “/Users/johndoe/Projets/fullstack-ecommerce”, correct?Yes
  • What type of testing would you like to do? (Use arrow keys)E2E Testing - of Web or Mobile Applications
  • Where is your automation backend located? (Use arrow keys)On my local machine
  • _ Which environment you would like to automate?_ → Web - web applications in the browser
  • With which browser should we start?Chrome
  • Which framework do you want to use?Mocha
  • Do you want to use a compiler? → choisir TypeScript (de préférence)
  • Do you want WebdriverIO to autogenerate some test files?Y
  • What should be the location of your spec files? /Users/johndoe/Projets/fullstack-ecommerce/test/specs/*/.ts
  • Do you want to use page objects (https://martinfowler.com/bliki/PageObject.html)?N
  • Which reporter do you want to use?spec
  • Do you want to add a plugin to your test setup?Ne rien choisir et valider
  • Would you like to include Visual Testing to your setup?N
  • Do you want to add a service to your test setup?Ne rien choisir et valider
  • Do you want me to run npm installY

❗️ Faites un git add . puis git commit -m"Setup tests with wdio wizard" ❗️

Vous pouvez vérifier que les tests d’exemple générés automatiquement fonctionnent : npm run wdio.

Exemple de test end-to-end

L’assistant de configuration a normalement généré un test : test/specs/test.e2e.ts, dont voici le contenu :

import { expect, browser, $ } from "@wdio/globals";

describe("My Login application", () => {
  it("should login with valid credentials", async () => {
    await browser.url(`https://the-internet.herokuapp.com/login`);

    await $("#username").setValue("tomsmith");
    await $("#password").setValue("SuperSecretPassword!");
    await $('button[type="submit"]').click();

    await expect($("#flash")).toBeExisting();
    await expect($("#flash")).toHaveTextContaining(
      "You logged into a secure area!"
    );
  });
});

Ce test :

  1. se rend sur une application hébergée sur Heroku - plus précisément son formulaire de login,
  2. remplit automatiquement les champs,
  3. clique sur le bouton de soumission du formulaire,
  4. vérifie qu’un message de succès a bien été affiché

Je vous invite à examiner ce fichier, et à :

  • vous rendre manuellement sur l’URL visitée par ce test,
  • ouvrir votre inspecteur pour regarder les champs de saisie et le bouton, et comprendre comment ils ont été “récupérés” depuis le test.
  • éventuellement remplir vous-même les champs, valider, et inspecter le message affiché.

Écriture de tests end-to-end pour l’app e-commerce

Adapter le test pour créer un compte sur l’application

Les deux apps (front et back) doivent être lancées au préalable.

Il va vous falloir :

  1. Copier le test test/specs/test.e2e.ts en test/specs/signup.e2e.ts (on garde l’original pour l’instant)
  2. Dans l’original test/specs/test.e2e.ts, désactivez le test en ajoutant un x devant describexdescribe
  3. Modifier le test pour :
  • Visiter directement l’URL d’inscription : http://localhost:5173/compte/inscription

  • Remplir les 3 champs nom, e-mail et mot de passe, mais attention :

    • Pour l’instant, nous n’avons pas prévu de mécanisme pour réinitialiser la BDD après chaque test (il faudra y remédier).
    • De ce fait, on risque d’inscrire plusieurs fois un utilisateur avec le même email.
    • Je vous conseille de créer une variable email : const email = 'prenom.nom' + Date.now();
    • Puis de passer cette valeur à setValue pour le champ e-mail.
  • Soumettre le formulaire

  • Changer les “assertions”

    • Contrairement au test d’exemple, ici, lorsque l’inscription a réussi, on n’a plus de “bannière” en haut de l’écran nous indiquant que tout s’est bien déroulé.
    • Il faut donc trouver un autre moyen de vérifier qu’on a bien été inscrit.
    • Ici, on est directement connecté·e à l’app après une inscription réussie : et on le voit avec un petit “dropdown” montrant notre nom et avatar.
    • On peut donc chercher à cibler ce dropdown. Indice : connecté à l’app dans votre navigateur, inspectez le dropdown et cherchez l’élément qui englobe le “nom”.
    • Pour information, on peut récupérer un élément par sa classe avec wdio : const element = await $('.my-class');
    • Ensuite on peut récupérer son texte : const elementText = await element.getText();
    • Et on peut vérifier que le texte contient une certaine valeur : expect(elementText).toContain("Valeur attendue");
  • Se déconnecter après

Adapter le test pour se connecter sur l’application

Créer un nouveau test test/specs/signin.e2e.ts.

C’est la même chose, mais cette fois pour le formulaire de connexion.

Ajouter des produits au panier

Créer un nouveau test test/specs/cart.e2e.ts.

En l’état actuel, un bug de l’app empêche d’ajouter des items au panier sans être connecté.

Pour y remédier, temporairement, copiez-collez le code de création d’un compte du test signup.e2e.ts (sans les insertions).

L’idée est de :

  1. Ajouter deux ou trois produits au panier,
  2. Aller sur la page “Panier”,
  3. Vérifier que les produits y sont présents.
  4. Puis supprimer les produits du panier.
  5. Puis vérifier qu’il n’y a plus de produits.

Passer une commande

Créer un nouveau test test/specs/order.e2e.ts.

L’idée est de :

  1. Ajouter deux produits au panier.
  2. Aller sur la page “Panier”.
  3. Cliquer sur “Commander”.
  4. Remplir les informations (adresse, paiement)
  5. Cliquer sur le bouton “Finaliser la Commande”
  6. Vérifier qu’on a un “bandeau” de succès avec le message “Votre commande a été passée avec succès”.

Changer l’ordre de tri des produits

Créer un nouveau test test/specs/products-sort-order.e2e.ts.

  1. Aller sur la home page
  2. Récupérer le premier produit de la liste, récupérer son titre (stocker dans une variable)
  3. Cliquer sur le dropdown “Trier par”
  4. Cliquer sur “Prix décroissant”
  5. À nouveau récupérer le prenuer produit (qui ne doit plus être le même), et son titre
  6. Assertion : vérifier que le titre du premier produit après changement d’ordre de tri est différent de celui avant