Tests E2E en Rust : Guide complet pour des projets réels

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi les tests E2E en Rust ne sont pas un luxe mais une nécessité

\n\n

Avez-vous déjà lancé une application Rust en production pour recevoir des plaintes d'utilisateurs une heure plus tard ? « Tout fonctionne parfaitement sur ma machine ! » — une phrase familière ? Le problème est que les tests unitaires ne vérifient que des morceaux de code isolés, et les tests d'intégration vérifient l'interaction des composants. Mais le vrai cauchemar commence lorsque tout le pipeline, de la requête HTTP à la base de données, échoue à cause d'une liaison non évidente.

\n\n

Les tests E2E d'applications Rust (End-to-End) sont le seul moyen de garantir que votre API, utilitaire CLI ou service web fonctionne comme un tout cohérent. Dans cet article, nous ne parlerons pas seulement de théorie, mais nous écrirons de vrais tests que vous pourrez immédiatement intégrer dans votre CI/CD. Pas de blabla — seulement du Rust et une approche prête pour la production.

\n\n

Qu'est-ce que le test E2E dans le contexte de Rust ?

\n\n

Contrairement aux tests unitaires (qui testent des fonctions) et aux tests d'intégration (qui testent des modules), les tests end-to-end Rust vérifient le cycle complet de l'application : de l'entrée à la sortie. Pour un service web, cela ressemble à ceci :

\n\n
    \n
  • Lancement d'un vrai serveur (ou de son image Docker).
  • \n
  • Envoi d'une requête HTTP via un client (par exemple, reqwest).
  • \n
  • Vérification de la réponse : statut, corps, en-têtes.
  • \n
  • Validation de l'état de la base de données (si applicable).
  • \n
\n\n

Pour les applications CLI — c'est lancer le binaire avec des arguments et vérifier stdout/stderr. Pour les applications de bureau — simuler des actions utilisateur via WebDriver (Selenium).

\n\n

Quand les tests E2E sont-ils obligatoires ?

\n
    \n
  • Vous développez une API publique.
  • \n
  • Vous avez une architecture de microservices.
  • \n
  • L'application interagit avec des services externes (bases de données, files d'attente, S3).
  • \n
  • Vous voulez éviter les régressions à chaque commit.
  • \n
\n\n

Outillage pour les tests E2E en Rust

\n\n

L'écosystème Rust est riche, mais pour les tests E2E, nous n'avons besoin que de quelques bibliothèques clés :

\n\n\n\n\n\n\n\n\n
BibliothèqueObjectif
reqwestClient HTTP pour envoyer des requêtes au serveur testé.
tokioRuntime asynchrone — base pour lancer les tests et le serveur.
wiremockServeur mock pour simuler des API externes.
assert_cmd + predicatesPour tester les applications CLI.
fantocciniClient WebDriver (si vous devez tester un navigateur).
\n\n

Nous utiliserons le framework de test Rust intégré (module test), mais nous ajouterons l'asynchronisme via tokio::test.

\n\n

Pratique : Écrire des tests E2E pour un service web avec Actix-Web

\n\n

Supposons que nous ayons une simple application web Rust avec Actix-Web et un endpoint /api/users qui renvoie une liste d'utilisateurs depuis PostgreSQL. Nous voulons nous assurer que tout fonctionne lors d'un lancement réel.

\n\n

Étape 1 : Préparation de l'environnement de test

\n\n

Créons un fichier séparé tests/e2e.rs (Rust considère automatiquement les fichiers dans le dossier tests/ comme des tests d'intégration).

\n\n
// tests/e2e.rs\nuse std::process::{Command, Stdio};\nuse std::time::Duration;\nuse tokio::time::sleep;\n\n// Fonction utilitaire : lancer le serveur en arrière-plan\nasync fn start_server() -> std::process::Child {\n    let child = Command::new("cargo")\n        .args(&["run", "--bin", "my_app"])\n        .stdout(Stdio::null())\n        .stderr(Stdio::null())\n        .spawn()\n        .expect("Échec du démarrage du serveur");\n\n    // Laisser le temps au serveur de démarrer\n    sleep(Duration::from_secs(5)).await;\n    child\n}
\n\n

Important : Dans un projet réel, utilisez Docker ou une configuration de base de données séparée pour les tests, afin de ne pas polluer la production.

\n\n

Étape 2 : Écrire des tests asynchrones

Blogs

Book Recommendations