Exercice 26 - Mise en place de tests d'acceptation
Table des matières
Exercice 26 - Tests d’acceptation avec Cypress
Mise en situation
Vous venez de terminer plusieurs fonctionnalités côté client dans Vue.js. Le code semble fonctionner à la main, mais une application professionnelle ne peut pas dépendre uniquement de tests manuels.
Votre mandat est de mettre en place une suite de tests d’acceptation automatisés avec Cypress pour valider les parcours principaux d’une mini-application d’inscription aux ateliers Web.
L’objectif n’est pas de tester les détails internes des composants Vue, mais de vérifier que l’application répond aux attentes d’une utilisatrice ou d’un utilisateur.
Modalités
- Exercice individuel
- Réalisé durant le cours
- Exercice formatif noté 1%
- Remise sur Léa dans Exercice 26
- Le gabarit de départ contient une application Vue fonctionnelle, mais aucun test Cypress complet
- Vous devez implémenter les tests Cypress au complet
Objectifs d’apprentissage
À la fin de l’exercice, vous devriez être capables de :
- Installer Cypress dans un projet Vue 3 + Vite + TypeScript
- Configurer Cypress pour des tests end-to-end
- Écrire des tests d’acceptation à partir de scénarios utilisateur
- Utiliser des sélecteurs stables avec
data-testid - Préparer l’état de test avant chaque scénario
- Exécuter les tests en mode interactif et en mode terminal
- Interpréter une erreur de test Cypress
- Corriger un test fragile
Application fournie
Le gabarit contient une mini-application nommée Inscription aux ateliers Web.
Fichiers à utiliser: exer26.zip
Fonctionnalités déjà présentes :
- Affichage d’un formulaire d’inscription
- Saisie d’un nom
- Saisie d’un courriel
- Sélection d’un atelier
- Case à cocher d’acceptation des règles
- Validation des champs obligatoires
- Ajout d’une inscription valide
- Message de confirmation
- Liste des inscriptions
- Suppression d’une inscription
- Suppression de toutes les inscriptions
- Persistance dans
localStorage
Démarrage du projet
npm install
npm run dev
L’application devrait être disponible localement sur le port Vite par défaut.
À faire (étapes)
Étape 0 - Explorer l’application
Avant d’écrire des tests :
- Lancez l’application.
- Essayez le formulaire manuellement.
- Identifiez les comportements attendus.
- Ouvrez le fichier
src/App.vue. - Repérez les attributs
data-testid.
Questions à vous poser :
- Qu’est-ce qu’une personne utilisatrice veut accomplir?
- Qu’est-ce qui doit absolument fonctionner?
- Quels éléments ne devraient pas être testés directement?
Étape 1 - Installer Cypress
Installez Cypress comme dépendance de développement.
npm install cypress --save-dev
Ouvrez ensuite Cypress une première fois.
npx cypress open
Choisissez :
- E2E Testing
- Le navigateur de votre choix
- La création des fichiers de configuration proposés par Cypress
Étape 2 - Configurer les scripts npm
Ajoutez les scripts suivants dans package.json.
{
"scripts": {
"cy:open": "cypress open",
"cy:run": "cypress run"
}
}
Conservez aussi les scripts déjà présents dans le projet.
Validation :
npm run cy:open
npm run cy:run
À ce stade, il est normal que cy:run échoue si aucun test utile n’a encore été écrit.
Étape 3 - Configurer cypress.config.ts
Votre configuration doit contenir un baseUrl pour éviter de répéter l’URL complète dans chaque test.
Exemple attendu :
import { defineConfig } from 'cypress'
export default defineConfig({
e2e: {
baseUrl: 'http://localhost:5173',
supportFile: 'cypress/support/e2e.ts',
},
})
Validation :
- Vous pouvez écrire
cy.visit('/')dans vos tests. - Vous ne devez pas écrire
cy.visit('http://localhost:5173')dans chaque test.
Étape 4 - Créer le fichier de tests
Créez le fichier suivant :
cypress/e2e/acceptation-inscription.cy.ts
Votre fichier doit contenir une suite principale :
describe('Inscription aux ateliers Web', () => {
beforeEach(() => {
cy.clearLocalStorage()
cy.visit('/')
})
// Vos tests ici
})
Étape 5 - Écrire les tests d’acceptation
- Implémentez les scénarios suivants.
- Faites au MINIMUM les 4 premiers scénarios.
Scénario 1 - Affichage initial
Étant donné une personne qui arrive sur la page d’inscription
Quand la page est chargée
Alors le formulaire est visible
Et le compteur d’inscriptions affiche 0
Et le message de liste vide est visible
À valider minimalement :
registration-formregistration-countempty-message
Scénario 2 - Validation du formulaire vide
Étant donné une personne qui n’a rien saisi
Quand elle clique sur le bouton d’inscription
Alors les erreurs de validation sont affichées
Et aucune inscription n’est ajoutée
À valider minimalement :
name-erroremail-errorworkshop-errorrules-errorregistration-count
Scénario 3 - Validation du courriel invalide
Étant donné une personne qui remplit le formulaire avec un courriel invalide
Quand elle soumet le formulaire
Alors un message d’erreur de courriel est affiché
Et aucune inscription n’est ajoutée
Exemple de courriel invalide :
marie.test
Scénario 4 - Inscription valide
Étant donné une personne qui remplit correctement le formulaire
Quand elle soumet le formulaire
Alors un message de succès est affiché
Et l’inscription apparaît dans la liste
Et le compteur d’inscriptions affiche 1
Données suggérées :
- Nom :
Marie Tremblay - Courriel :
marie.tremblay@example.com - Atelier :
Cypress - Tests d’acceptation
Scénario 5 - Refus d’un doublon
Étant donné une personne déjà inscrite à un atelier
Quand elle tente de s’inscrire une deuxième fois au même atelier avec le même courriel
Alors un message de doublon est affiché
Et le compteur d’inscriptions reste à 1
Attention : le test doit créer l’état initial à partir de l’interface, pas en modifiant directement le code Vue.
Scénario 6 - Suppression d’une inscription
Étant donné une inscription existante
Quand la personne clique sur le bouton de retrait
Alors l’inscription disparaît
Et le message de liste vide redevient visible
Et le compteur affiche 0
Scénario 7 - Persistance après rechargement
Étant donné une inscription existante
Quand la page est rechargée
Alors l’inscription est encore visible
Et le compteur affiche 1
Indice : utilisez cy.reload().
Scénario 8 - Suppression de toutes les inscriptions
Étant donné plusieurs inscriptions existantes
Quand la personne clique sur le bouton de suppression globale
Alors toutes les inscriptions disparaissent
Et le compteur affiche 0
Contraintes techniques
Vos tests doivent respecter les contraintes suivantes :
- Utiliser Cypress E2E
- Utiliser TypeScript
- Utiliser
cy.visit('/') - Utiliser les attributs
data-testidpour cibler les éléments - Ne pas cibler les classes Bootstrap
- Ne pas utiliser
cy.wait(1000)ou autre attente arbitraire - Nettoyer l’état entre les tests
- Garder les tests indépendants
- Nommer clairement les scénarios
- Tester le comportement utilisateur, pas l’implémentation interne de Vue
Conseils de structure
Vous pouvez créer des fonctions d’aide dans le fichier de test.
Exemple :
const inscrireParticipant = (
name: string,
email: string,
workshopLabel: string,
): void => {
cy.get('[data-testid="name-input"]').type(name)
cy.get('[data-testid="email-input"]').type(email)
cy.get('[data-testid="workshop-select"]').select(workshopLabel)
cy.get('[data-testid="rules-checkbox"]').check()
cy.get('[data-testid="submit-button"]').click()
}
Cette fonction est permise parce qu’elle reproduit les actions d’une personne utilisatrice.
Commandes utiles
Mode interactif :
npm run cy:open
Mode terminal :
npm run cy:run
Serveur de développement :
npm run dev
Compilation de production :
npm run build
Mode Expert
Défi 1 - Commande personnalisée
Déplacez l’action répétée d’inscription dans une commande Cypress personnalisée nommée :
cy.inscrireParticipant(...)
Vous devez aussi typer correctement la commande dans Cypress avec TypeScript.
Défi 2 - Données de test
Créez un fichier :
cypress/fixtures/participants.json
Utilisez ces données dans au moins deux tests.
Défi 3 - Test d’acceptation avec API simulée
Transformez la liste des ateliers pour qu’elle provienne d’un appel GET /api/workshops.
Dans Cypress, utilisez cy.intercept() pour simuler la réponse de l’API.
Validation :
- Le test ne dépend pas d’un vrai serveur externe.
- Le test vérifie que les ateliers simulés apparaissent dans le menu déroulant.
Défi 4 - Pipeline de vérification
Ajoutez un script qui permet de lancer la compilation et les tests Cypress en une seule commande.
Exemple :
{
"scripts": {
"verify": "npm run build && npm run cy:run"
}
}
Remise
Remettez sur Léa dans exercice 26:
- Le projet complet compressé
- Le dossier
cypress - Le fichier
cypress.config.ts - Le
package.jsonmis à jour
À ne pas remettre
- dossier node_modules ;)