Tests de bout en bout : quand ils aident et quand ils ralentissent

Vous avez des tests unitaires qui vérifient chaque fonction. Des tests d'intégration qui valident les requêtes en base de données. Des tests de contrat qui garantissent vos accords API. Le pipeline est vert. Tout semble parfait.

Puis vous déployez, et un utilisateur signale qu'il peut se connecter, rechercher un produit, l'ajouter au panier, mais le bouton de paiement ne fait rien. Pas d'erreur. Pas de plantage. Juste du silence.

Chaque composant fonctionnait isolément. Ensemble, ils ont échoué.

C'est le fossé que les tests de bout en bout sont censés combler. Mais le combler a un coût qui peut ruiner la vitesse de votre pipeline et le moral de l'équipe si vous n'y faites pas attention.

Ce que font réellement les tests de bout en bout

Un test de bout en bout exécute l'intégralité de votre système comme le ferait un véritable utilisateur. L'application démarre. La base de données contient des données réelles. Les API externes sont appelées réellement. Un navigateur ou un client mobile effectue des interactions concrètes.

Pensez à un flux d'achat complet : connexion, recherche de produits, ajout au panier, saisie des informations de paiement, confirmation de commande, affichage du reçu. Rien n'est simulé. Rien n'est remplacé par un double de test. Chaque élément du système participe.

La confiance apportée par des tests de bout en bout réussis est réelle. Si vos flux critiques passent, vous pouvez raisonnablement être sûr que les utilisateurs ne se heurteront pas à un mur sur les fonctionnalités principales. Mais cette confiance a un prix.

Le vrai coût des tests de bout en bout

Un seul test de bout en bout peut prendre plusieurs minutes. Multipliez cela par des dizaines de scénarios, et vous obtenez des heures de temps de pipeline. Et encore, quand tout va bien.

Les tests de bout en bout échouent pour des raisons qui n'ont rien à voir avec votre code. Un délai d'attente parce que l'environnement de test est lent. Des données de test incohérentes laissées par une exécution précédente. Le pool de connexions à la base de données épuisé par des tests parallèles. L'API externe qui limite le taux de vos requêtes de test.

Quand les tests échouent de manière aléatoire, les équipes cessent de faire confiance au pipeline. Les développeurs commencent à cliquer sur "relancer" sans enquêter. La suite de tests devient du bruit au lieu d'un signal.

C'est pourquoi vous ne pouvez pas appliquer les tests de bout en bout à tout. Vous devez être chirurgical sur ce que vous testez et comment vous exécutez ces tests.

Quand les tests de bout en bout sont réellement nécessaires

Les tests de bout en bout sont nécessaires lorsqu'un scénario ne peut être vérifié par aucun autre type de test. Cela concerne généralement les flux qui traversent plusieurs composants dans un seul parcours utilisateur.

Un flux de paiement est l'exemple classique. Les tests unitaires peuvent vérifier la logique de calcul du prix. Les tests d'intégration peuvent vérifier que la commande est bien enregistrée en base de données. Les tests de contrat peuvent confirmer le format de la requête vers la passerelle de paiement. Mais aucun de ces tests ne peut prouver qu'un véritable utilisateur peut effectuer un achat du début à la fin. Seul un test de bout en bout peut le faire.

Un autre critère est le risque. Si une fonctionnalité qui casse cause des dégâts importants, elle mérite un test de bout en bout. La connexion est un bon candidat car si elle casse, personne ne peut utiliser l'application. Le paiement en est un autre car il affecte directement le chiffre d'affaires.

En revanche, une page de profil utilisateur qui change rarement, ou une fonctionnalité d'administration utilisée par trois personnes en interne, peut probablement être couverte par des tests d'intégration. Le risque est faible, et le coût d'un test de bout en bout n'est pas justifié.

Comment exécuter des tests de bout en bout sans ralentir tout le monde

Une fois que vous avez identifié les scénarios qui nécessitent vraiment une couverture de bout en bout, le défi suivant est de les exécuter dans votre pipeline sans faire attendre les développeurs indéfiniment.

Limitez-vous aux parcours utilisateur critiques. Identifiez les flux les plus importants que votre application doit supporter pour que les utilisateurs en tirent de la valeur. Pour un site e-commerce, cela pourrait être la recherche, le détail produit, l'ajout au panier, le paiement et le checkout. Pour une application de messagerie, cela pourrait être la connexion, l'envoi de message, la réception de message et la déconnexion. Tout le reste est testé avec des méthodes plus rapides et moins coûteuses.

Exécutez les tests en parallèle. Si vous avez dix tests qui prennent chacun trois minutes, les exécuter les uns après les autres ajoute trente minutes à votre pipeline. Les exécuter en parallèle peut réduire cela à trois minutes, à condition d'avoir suffisamment d'infrastructure pour supporter des environnements concurrents. C'est un investissement qui en vaut la peine.

Séparez les tests de bout en bout dans leur propre étape de pipeline. Ne les mélangez pas avec les tests unitaires ou les tests d'intégration. Laissez les tests rapides s'exécuter en premier et donner un retour rapide aux développeurs. Exécutez les tests de bout en bout lents uniquement après que tout le reste a réussi. Ainsi, un développeur sait en quelques minutes si un test unitaire échoue, sans attendre la suite de tests de bout en bout.

Exécutez un sous-ensemble à chaque commit, la suite complète périodiquement. Vous n'avez pas besoin d'exécuter tous les tests de bout en bout à chaque modification de code. Exécutez les plus critiques à chaque commit. Exécutez la suite complète chaque nuit ou avant une mise en production. Cela équilibre vitesse et couverture.

Voici un exemple de configuration de pipeline YAML qui exécute les tests de bout en bout uniquement selon un planning nocturne ou lors d'un déclenchement manuel, ce qui maintient la rapidité du pipeline principal de commit :

# azure-pipelines-e2e.yml
# Pipeline séparé pour les tests de bout en bout

trigger: none  # Ne pas exécuter à chaque commit

schedules:
- cron: '0 2 * * *'  # Exécution nocturne à 2h du matin
  displayName: Tests de bout en bout nocturnes
  branches:
    include:
    - main

resources:
  pipelines:
  - pipeline: mainBuild
    source: main-ci
    trigger:
      branches:
        include:
        - main

jobs:
- job: e2e_tests
  displayName: 'Exécuter les tests de bout en bout'
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: |
      echo "Démarrage de la suite de tests de bout en bout..."
      npm run test:e2e
    displayName: 'Exécuter les tests E2E'

Rendez les tests résilients face à l'instabilité de l'environnement. Utilisez des tentatives pour les échecs causés par des délais d'attente. Réinitialisez les données de test à un état connu avant chaque test. Si un test échoue fréquemment pour des raisons techniques, corrigez le test ou l'environnement. Ne laissez pas des tests instables éroder la confiance dans votre pipeline.

Liste de contrôle pratique

Avant d'ajouter un nouveau test de bout en bout, posez-vous ces questions :

  • Ce scénario peut-il être vérifié par un type de test plus rapide ?
  • Si ce flux casse, combien d'utilisateurs sont affectés et à quel point ?
  • S'agit-il d'un parcours utilisateur critique ou d'un flux optionnel ?
  • Pouvons-nous exécuter ce test en parallèle avec d'autres ?
  • Le test est-il résilient aux problèmes d'environnement ?

Si la réponse à la première question est oui, n'écrivez pas le test de bout en bout. Si le risque est faible, ne l'écrivez pas. Si ce n'est pas un parcours critique, ne l'écrivez pas.

L'essentiel à retenir

Les tests de bout en bout vous offrent la plus grande confiance que votre système fonctionne dans son ensemble. Mais cette confiance coûte cher en temps, en infrastructure et en maintenance. Utilisez-les uniquement pour les flux qui comptent le plus. Exécutez-les intelligemment pour qu'ils ne deviennent pas le goulot d'étranglement qui fait redouter le pipeline à votre équipe.

Quelques tests de bout en bout bien choisis qui s'exécutent de manière fiable valent plus qu'une centaine de tests instables auxquels personne ne fait confiance.