• 8 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 22/11/2023

Rédigez des cas de test fonctionnel

Graphique de bannière

Identifiez les sélecteurs

Lorsqu'on teste une interface utilisateur, il faut tout d'abord décider quels éléments on veut tester, et ensuite savoir les identifier.

On utilise donc des sélecteurs pour identifier sur une page web les éléments HTML avec lesquels on souhaite interagir, tels que les boutons, les champs de formulaire, les liens, les tableaux, etc.

Cypress propose plusieurs façons de sélectionner des éléments sur une page web :

Sélection par balise, classe ou ID

Vous pouvez sélectionner un élément en utilisant des sélecteurs CSS classiques tels que le nom de balise, la classe ou l’ID de l’élément.
Par exemple : 

  • Sélectionner un élément par balise :  cy.get(‘button’)

  • Sélectionner un élément par classe :  cy.get(‘.maClasse’)

  • Sélectionner un élément par ID :  cy.get(‘#monID’)

Sélection par attribut

Vous pouvez également sélectionner des éléments en fonction de leurs attributs. Par exemple, pour sélectionner un lien avec un attribut ‘href’ spécifique :  cy.get(‘a[href=”/page”]’)

Sélection par contenu textuel

Vous pouvez sélectionner un élément en fonction de son contenu textuel. Par exemple, pour sélectionner un bouton avec le texte "Valider" :  cy.contains(‘Valider’)

Sélection par relation parent-enfant

Vous pouvez sélectionner un élément en fonction de sa relation avec un élément parent. Par exemple, pour sélectionner un paragraphe à l’intérieur d’une div avec une classe spécifique :  cy.get(‘.maDiv’).find(‘p’)

Sélection par index

Vous pouvez sélectionner un élément en fonction de son index parmi un groupe d’éléments correspondant à un sélecteur donné. Par exemple, pour sélectionner le deuxième bouton sur la page :  cy.get(‘button’).eq(1)  . À noter que l’index commence à zéro. Pour avoir le premier élément, vous pouvez également utiliser first :  cy.get(‘button’).first()  .

Sélection par type d’élément et filtre

Cypress propose des méthodes de filtrage pour affiner davantage vos sélections. Par exemple, cy.get(‘input[type=”text”]’)  sélectionne tous les éléments <input> de type 'text' sur la page.

Il existe cependant une autre méthode, et c’est celle recommandée par Cypress, qui consiste à ajouter des attributs data-* à vos éléments.

Qu'est-ce que l'attribut data-* ?

L'attribut data-* permet de stocker des informations personnalisées sur un élément HTML. C'est un moyen d'ajouter vos propres attributs à un élément pour y sauvegarder des données spécifiques. La partie * de data-* peut être remplacée par n'importe quel nom que vous choisissez. Par exemple, data-id, data-user, data-product, etc. Pour ma part, j’utilise data-cy, pour data-cypress comme :  <div data-cy="john_doe">...</div>

Pourquoi utiliser l'attribut data-* avec Cypress ?

  • Sélecteur spécifique et non ambigu : Les attributs data-* sont spécifiques à votre application et ne risquent pas d'entrer en conflit avec d'autres classes ou d’autres ID CSS. Cela rend vos sélecteurs plus précis et moins susceptibles de changer lorsque vous modifiez la structure CSS ou HTML.

  • Sélecteur stable : Les attributs data-* sont généralement utilisés pour marquer des éléments importants dans votre application. Contrairement aux classes ou aux ID qui peuvent être ajoutés ou supprimés pour des raisons de style, les attributs data-* sont plus stables et sont moins susceptibles de changer fréquemment.

  • Lisibilité : Lorsque vous utilisez des sélecteurs basés sur data-*, cela rend votre code plus lisible et compréhensible, car vous pouvez nommer ces attributs d'une manière qui décrit leur fonction ou leur contenu. Cela facilite la collaboration avec d'autres développeurs et la maintenance à long terme de votre code.

Dans certains cas, il est possible que vous n’ayez pas la main sur le code et que vous ne puissiez donc pas ajouter d’attribut pour identifier de façon unique votre élément. Dans ce cas, vous pouvez utiliser d'autres sélecteurs, mais veillez à ne pas utiliser de sélecteurs instables susceptibles de changer, comme les attributs CSS (nom de classe, tag, etc.).

Si ce n’est pas déjà fait, ouvrez votre navigateur et allez sur http://localhost:8080/#/contact.

Puis, ouvrez la console en faisant Ctrl + Maj + J  ou clic droit, puis cliquez sur Inspecter. Cette page apparaît : 

Capture d'écran montrant dans la partie supérieure une page HTML et dans la partie inférieure le code de cette même page.
Inspection d'une page HTML

Dans la partie inférieure de l’écran, vous avez un outil très performant qui peut vous aider à déboguer. Il nous intéresse particulièrement car il va nous permettre d’examiner les éléments HTML. Toujours dans la partie inférieure de l'écran, cliquez sur la flèche en haut à gauche. En survolant les éléments de la page web dans la partie supérieure de votre écran, ceux-ci vont apparaître comme étant sélectionnés et vous allez voir le code HTML correspondant à l’élément en console :

Capture d'écran montrant dans la partie supérieure un champ sélectionné et dans la partie inférieure le code de ce champ.
Inspection du code par sélection d'éléments

Dans le projet Tech&Buy, on peut donc voir qu’il n’y a pas de data-cy mais des ID. Lors de la rédaction de votre premier test, vous allez voir comment ajouter des data-cy dans le code. Ça tombe bien, c’est la prochaine étape !

Faites un test d'entraînement

Voyons ensemble le processus de création pour votre test d'entraînement. Les premières étapes doivent vous rappeler ce que l’on a vu précédemment lors de l’exécution du test pour créer l’architecture de Cypress. 

1. Pour ouvrir l’outil graphique Cypress, exécutez  npx cypress open  dans VSCode. 

2. Cliquez sur le bouton E2E Testing. Comme vous pouvez le voir, il est à présent configuré. 

Capture d'écran montrant l'option E2E Testing dans Cypress
Option E2E Testing

3. Choisissez votre navigateur préféré : je vais prendre Chrome pour les exercices et les captures d’écran.

4. Cliquez sur Start E2E Testing in Chrome

5. Une nouvelle fenêtre s’ouvre. Vous retrouvez la page des spécifications :

Capture d'écran montrant la liste des spécifications de tests d'exemple.
Page des spécifications

6. Cliquez sur le bouton + New spec en haut à droite de l’écran.

7. Vous avez le choix entre Scaffold example specs, que vous avez vu lorsque vous avez effectué les tests d'exemple, et Create new spec. Choisissez cette option pour créer une nouvelle spec, et donc un nouveau test : 

8. Ensuite, vous devez entrer le chemin de votre spec. Nommez-la firstPassedTest.cy.js

Capture d'écran montrant comment indiquer le chemin d'une nouvelle spécification. En bas on voit aussi le bouton Create spec, à côté du bouton Back.
Création d'une nouvelle spécification

9. Cliquez sur Create spec

10. Un message vous dit que la spec a été créée :

Capture d'écran montrant le confirmation de création d'une nouvelle spécification. Il y a aussi deux boutons: Okay, run the spec, et Create another spec.
Confirmation de la création de la spécification

11. Cliquez sur Okay, run the spec

12. Le test se lance et vous devez avoir ce résultat :

Capture d'écran montrant que le test a bien été exécuté.
Exécution d'un test

Félicitations, le test a bien été exécuté !

Allez à présent dans VSCode et naviguez dans le dossier e2e. Vous y trouvez votre fichier firstPassedTest.cy.js : 

Capture d'écran montrant l'arborescence des fichiers du projet Tech&Buy dans VSCode. Le dossier e2e est ouvert et on y voit les fichiers de spécifications.
Liste de fichiers dans VSCode

Vous y retrouvez aussi le code que Cypress a généré :

describe('template spec', () => {
  it('passes', () => {
    cy.visit('https://example.cypress.io')
  })
})

Quelques explications sur ce code sont nécessaires !

  • La fonction describe est utilisée pour regrouper un ensemble de tests liés entre eux. On peut les appeler également des suites de tests

  • La fonction it est utilisée quant à elle pour écrire un test individuel et elle doit être à l’intérieur d’un bloc describe. Elle permet de spécifier un comportement ou une assertion à tester. On peut également appeler cela un cas de test.

Retrouvez le détail de la création de ce test en vidéo :

Exécutez le test d'entraînement en ligne de commande

Le test peut aussi être exécuté en ligne de commande : voyons comment !

Pour cela, la ligne de commande à exécuter est  npx cypress run  .

Vous devez obtenir un résultat qui ressemble à cela :

Capture d'écran montrant la liste des tests exécutés en ligne de commande.
Résultat de l'exécution des tests en ligne de commande

Mais pourquoi il y a tant de fichiers ?

Eh oui, ce résultat est surprenant ! Laissez-moi vous expliquer. Lorsqu’on utilise l’interface graphique de Cypress, un seul fichier de test (spec) est exécuté à la fois. Alors que lorsqu’on utilise la ligne de commande  npx cypress run  , on exécute tous les fichiers de test présents dans le répertoire de tests. En l'occurrence, ici, le test que vous avez ajouté, firstPassedTest.cy.js, et qui apparaît en premier dans la liste, mais aussi tous les tests d’exemple de Cypress. 

L’avantage d’utiliser la ligne de commande est que vous ne pouvez pas interférer dans l’interface graphique, et l’exécution est plus rapide. Utiliser la ligne de commande vous permet aussi de lancer une suite complète de tests en une seule commande. Cela est très pratique pour l’exécution automatisée, les intégrations avec des systèmes de CI/CD (Intégration continue/ Livraison continue) et la réalisation de tests de régression.

Et si on créait un premier test pour le site Tech&Buy ? Allons-y !

Créez votre premier test réel

On rentre maintenant dans le concret et vous allez enfin pouvoir mettre les mains dans le cambouis ! Pour votre premier test réel, vous allez tester la page Contact du site internet Tech&Buy :

Capture d'écran montrant la page du formulaire de contact du site Tech&Buy.
Formulaire de contact du site Tech&Buy

Vous pouvez créer un nouveau test avec l’interface graphique, en passant par le bouton New spec

Vous pouvez aussi créer un nouveau fichier contact.cy.js directement dans le dossier e2e dans VSCode. Cypress rechargera automatiquement l’interface graphique. 

1. Cliquez sur New File

Capture d'écran montrant la création d'un nouveau fichier de spécification dans VSCode.
Création d'une nouvelle spécification dans VSCode

2. Ajoutez le nom contact.cy.js, et voilà ! 

3. Recopiez ensuite le test de la section Faites un test d'entraînement dans le présent chapitre, et remplacez l’URL à l’intérieur par http://localhost:8080/#/contact

describe('contact page', () => {
  it('it navigate to the contact page', () => {
    cy.visit('http://localhost:8080/#/contact')
  })
})

Mais que testez-vous exactement ? Là, rien du tout, vous voyez bien que vous n’avez pas d’assertion, juste un visit(). Celui-ci vous permet de naviguer vers l’URL que vous avez donnée en paramètre. Il est temps de définir ce test ! 

Pour cela, dans un premier temps, nous pouvons ajouter la baseUrl de notre site au fichier de configuration Cypress. Vous vous souvenez où il se trouve ?

4. Dans le fichier cypress.config.js, ajoutez la baseUrl ainsi :

const { defineConfig } = require("cypress");

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // implement node event listeners here
    },
    baseUrl: "http://localhost:8080/"
  },
});

5. Si ce n’est pas déjà fait, ouvrez votre navigateur et allez sur la page du formulaire de contact : http://localhost:8080/#/contact. Nous avons vu au moment d'identifier les sélecteurs que le code de l’application n’en avait pas. 

6. Modifiez le code de votre test pour inclure un nom, une adresse e-mail et un message :

describe('contact page', () => {
  it('it navigate to the contact page', () => {
    cy.visit('http://localhost:8080/#/contact')
    cy.get('#name').type('name')
    cy.get('#email').type('test@test.fr')
    cy.get('#message').type('Bonjour, votre site est génial !')
    cy.contains('Envoyer').click()
    cy.get('.success').should('be.visible').should('contain', 'Message envoyé avec succès.')
  })
})

Le code vous est maintenant familier sauf la dernière ligne :  cy.get(‘.success’).should(‘be.visible’).should(‘contain’, ‘Message envoyé avec succès’)

Décryptons-la : vous récupérez d’abord votre élément grâce à  cy.get(‘.success’)  . Ensuite, vous testez que l’élément est bien visible  should('be.visible')  et qu’il contient le message spécifié  should('contain', 'Message envoyé avec succès.')  . C’est notre assertion.

Le résultat de notre test est donc :

Capture d'écran montrant le résultat du test Cypress effectué sur le formulaire de contact du site Tech&Buy.
Résultat du test du formulaire de contact

Retrouvez le détail de ce premier test réel en vidéo :

Le test utilise des classes, or vous m’aviez dit qu’il ne fallait pas utiliser les classes… 

C’est vrai, il ne faut pas utiliser de classes sauf si vous ne pouvez pas faire autrement. En l’occurrence, vous avez le code de Tech&Buy. Vous allez donc pouvoir le modifier afin d’ajouter les attributs data-cy nécessaires. C'est ce que nous allons faire dans le prochain chapitre.

En résumé

  • Les sélecteurs vous permettent de localiser les éléments de votre choix sur une page web pour interagir avec eux.

  • Il existe différentes méthodes de sélection d'éléments, y compris par balise, classe, ID, attribut, contenu textuel, relation parent-enfant, index, et type d'élément.

  • L'utilisation d'attributs data-* est recommandée par Cypress pour des sélecteurs spécifiques et stables.

  • L'attribut data-* permet de stocker des informations personnalisées sur les éléments HTML.

  • Pour créer un test avec Cypress, vous pouvez utiliser l'interface graphique ou la ligne de commande, en spécifiant des comportements et des assertions pour tester les éléments de la page.

            

Vous savez maintenant écrire des cas de test automatisés fonctionnels avec Cypress, mais vous aimeriez appliquer les bonnes pratiques de Cypress. Voyons comment dans le prochain chapitre !

Exemple de certificat de réussite
Exemple de certificat de réussite