Tests automatisés d’application web : guide pratique et retours d’expérience !

Avec la mise en place de la nouvelle version de YourTexGuru, nous avons considérablement renforcé nos tests automatisés de notre application web. Cette stratégie vise à garantir un haut niveau de qualité, de fiabilité, et une expérience utilisateur optimale, tout en soutenant le développement continu de nouvelles fonctionnalités.

Notre service repose sur une architecture intégrant beaucoup de composants et technologies différentes. Cette complexité rendait indispensable la mise en place d’une stratégie de tests rigoureuse pour garantir la robustesse de l’ensemble.

Pourquoi automatiser les tests d’application web ?

L’automatisation des tests d’application web permet à une équipe de développement de détecter rapidement les erreurs, d’assurer une meilleure couverture fonctionnelle et de réduire les régressions. Contrairement aux tests manuels, les scripts automatisés offrent une exécution rapide et répétable, tout en minimisant les efforts des testeurs. Cela est particulièrement critique pour les applications qui nécessitent une validation régulière des interfaces utilisateur et des interactions avec des données complexes.

Les différents niveaux de tests automatisés

Pour répondre aux besoins de validation et aux défis spécifiques de notre architecture, nous avons structuré les tests en trois niveaux.

1. Tests unitaires

Les tests unitaires constituent la base de toute stratégie de tests automatisés pour une application web. Ces tests sont utilisés pour valider le comportement de fonctions, classes ou méthodes isolées, sans dépendre de composants externes comme des bases de données, des APIs, ou des systèmes tiers. L’objectif principal est de s’assurer que chaque « brique » de l’application fonctionne correctement de manière autonome.

Les tests unitaires sont généralement rapides à exécuter et faciles à mettre en place, ce qui en fait un excellent point de départ pour automatiser les tests.

Pourquoi ces Tests sont Essentiels ?

  1. Détection rapide des bugs : Ces tests attrapent les erreurs directement dans la logique métier.
  2. Documentation vivante : Les tests unitaires servent aussi de référence pour comprendre le comportement attendu des fonctions ou des classes.
  3. Facilité d’évolution : Lors de modifications ou de refactorisation, ces tests garantissent que le comportement attendu reste intact.

2. Tests des contrôleurs HTTP

Les contrôleurs HTTP constituent le pont entre l’interface utilisateur et la logique métier. Tester ces éléments est crucial pour garantir la qualité des interactions avec l’application web. Ces tests simulent des requêtes HTTP et vérifient les réponses du service. Par exemple, nous avons automatisé les tests de l’ensemble des appels AJAX pour qu’ils fonctionnent correctement dans tous les cas.

Pour gérer les données nécessaires à ces tests, nous utilisons une base mémoire comme sqlite, qui simplifie la configuration et garantit une isolation efficace. Nous avons également recours à des bouchons (mocks) pour simuler les services externes et nous concentrer sur la logique interne. Enfin, l’utilisation de RefreshDatabase dans Laravel garantit que chaque script de test démarre avec une base propre.

3. Tests navigateur

Les tests navigateur jouent un rôle clé dans la validation des interfaces utilisateur et des fonctionnalités reposant sur le JavaScript ou les appels Ajax. Ces tests automatisés permettent de simuler des actions utilisateur réelles, telles que la navigation ou l’interaction avec des formulaires.

Pour ces scénarios, nous utilisons des outils dédiés comme Selenium ou Laravel Dusk. Ces outils permettent de tester des cas complexes, comme l’affichage dynamique des données ou le comportement d’une fonctionnalité en réponse à des scripts asynchrones.

Un exemple classique est un test automatisé de création de compte, qui valide l’ensemble du flux utilisateur, de la saisie des informations jusqu’à l’accès à l’interface principale.

Défis de l’automatisation des tests web

1. Gestion des services externes

Automatiser les tests impliquant des interactions avec des outils tiers ou des services externes peut être complexe. Pour garantir la fiabilité et la rapidité des scripts, nous avons utilisé des mocks pour simuler les réponses de ces services.

Il y a plusieurs façons de faire des mocks avec le framework Laravel. On peut simuler une réponse à un call HTTP :

HTML

Ca fonctionne si votre code utilise bien le client HTTP de Laravel.

Laravel propose une solution de mock des services :

HTML

Le choix de la méthode va se faire en fonction de ce qu’on veut tester. Si on souhaite tester le code du contrôleur, c’est logique de mocker le service qu’il utilise.

2. Configuration pour les tests navigateurs

Les tests navigateur nécessitent une base de données partagée entre le serveur et les processus de test. Si cette configuration semble simple en local, elle demande une attention particulière dans un environnement d’intégration continue, comme une CI GitLab.

Voici un exemple de configuration GitLab CI pour les tests automatisés d’une application web avec Laravel Dusk :

HTML

Avec cet exemple, gitlab va lancer une instance de mysql depuis une image docker à coté de nos tests. Nous allons ensuite installer une version de chrome et lancer une instance de chromedriver qui écoute sur un port. Ensuite nous lançons le service et enfin les tests Dusk.

Et ensuite un exemple de script Dusk pour tester un processus de login utilisateur dans une application web :

HTML

Ce type de script garantit que l’interface utilisateur fonctionne comme prévu.

Les bénéfices des tests automatisés

Mettre en place une stratégie de tests demande un investissement initial et sur la durée, mais les bénéfices sont clairs :

  • Amélioration de la qualité des fonctionnalités : les bugs sont identifiés rapidement, même dans des scénarios complexes.
  • Réduction des régressions : les nouvelles fonctionnalités n’impactent pas les parties existantes de l’application.
  • Gain de temps pour les équipes : les testeurs peuvent se concentrer sur des scénarios plus avancés, tandis que les scripts s’occupent des tests répétitifs.
  • Confiance accrue des utilisateurs : les tests garantissent que l’interface et les fonctionnalités répondent aux attentes des utilisateurs.

Les tests automatisés sont un pilier essentiel pour assurer la qualité et la fiabilité des applications web modernes. Grâce à des outils comme Selenium, Laravel Dusk, et des configurations adaptées, nous avons pu garantir une expérience utilisateur optimale tout en facilitant le développement et la maintenance de notre application.