Pourquoi les tests unitaires ne suffisent pas, et quand les tests E2E sont nécessaires
\n\nImaginez : vous avez écrit un code C# parfait. Les tests unitaires sont verts, la couverture est à 95 %, la revue de code est passée. Vous déployez la version, et les utilisateurs écrivent : « Le bouton "Passer commande" ne fonctionne pas si le panier contient plus de 3 articles ». Ça vous dit quelque chose ?
\n\nLes tests unitaires vérifient les méthodes de manière isolée. Les tests d'intégration vérifient la liaison entre la base de données et l'API. Mais les tests E2E d'applications C# (End-to-End) sont le seul moyen de s'assurer que l'ensemble du système fonctionne comme un tout cohérent : navigateur, serveur, base de données, API externes. Les tests de bout en bout simulent les actions d'un utilisateur réel : clics, saisie de données, attente du chargement des pages.
\n\nDans cet article, nous ne nous contenterons pas de présenter la théorie. Nous montrerons comment écrire des tests E2E en C# avec Selenium et Playwright, comment organiser le code via le Page Object Model et comment intégrer les tests automatisés dans le CI/CD. C'est parti.
\n\nQu'est-ce que le test E2E C# en pratique
\n\nUn test E2E est un scénario qui parcourt l'intégralité du parcours utilisateur : de l'ouverture de la page jusqu'à la réalisation de l'action cible (achat, inscription, envoi de formulaire). Pour un développeur C#, cela signifie généralement :
\n\n- \n
- Lancer un navigateur (Chrome, Firefox, Edge) via WebDriver \n
- Rechercher des éléments sur la page (boutons, champs de saisie, liens) \n
- Effectuer des actions (clic, saisie de texte, sélection dans une liste) \n
- Vérifier le résultat attendu (un message apparaît, l'URL change, les données sont mises à jour) \n
- Fermer le navigateur et nettoyer les données de test \n
La principale différence avec les tests unitaires : les tests E2E fonctionnent avec l'interface utilisateur réelle. Ils sont lents, fragiles (dépendants des sélecteurs CSS), mais inestimables pour vérifier les scénarios métier critiques.
\n\nOutils pour les tests E2E C# : Selenium vs Playwright
\n\nLe choix de l'outil est la première question qui se pose à l'équipe. Examinons les deux options les plus populaires.
\n\nSelenium WebDriver
\nLe standard de l'industrie. Fonctionne via WebDriver — un processus séparé qui contrôle le navigateur. Prend en charge tous les navigateurs, une immense communauté, des milliers de solutions prêtes à l'emploi. Inconvénient : la configuration nécessite des pilotes (ChromeDriver, GeckoDriver), et les tests peuvent être lents en raison des attentes.
\n\nPlaywright pour .NET
\nUn outil plus récent, mais déjà très populaire, de Microsoft. Fonctionne directement via le protocole DevTools, sans couches superflues. Plus rapide, plus stable, attend automatiquement le chargement des éléments (pas de Thread.Sleep explicite). Prend en charge non seulement les navigateurs, mais aussi les émulateurs mobiles.
\n\nDans cet article, nous montrerons des exemples avec les deux frameworks afin que vous puissiez comparer.
\n\nÉcrire notre premier test E2E en C# : Selenium
\n\nCommençons par les classiques. Installons le package via NuGet :
\n\ndotnet add package Selenium.WebDriver\ndotnet add package Selenium.Support\ndotnet add package Selenium.WebDriver.ChromeDriver\n\nÉcrivons maintenant un test pour un site exemple (supposons qu'il s'agit d'une boutique en ligne). Nous voulons vérifier qu'après avoir ajouté un article au panier, l'icône du panier affiche le nombre d'articles.
\n\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Chrome;\nusing OpenQA.Selenium.Support.UI;\n\npublic class CartE2ETests\n{\n [Fact]\n public void AddItemToCart_ShouldUpdateCartBadge()\n {\n using var driver = new ChromeDriver();\n \n // Arrange\n driver.Navigate().GoToUrl("https://demo-store.com");\n driver.Manage().Window.Maximize();\n \n // Act\n var addToCartButton = driver.FindElement(By.CssSelector(".product-card .add-to-cart"));\n addToCartButton.Click();\n \n // Wait for badge to appear\n var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));\n var cartBadge = wait.Until(drv => \n drv.FindElement(By.CssSelector(".cart-badge")));\n \n // Assert\n Assert.Equal("1", cartBadge.Text);\n \n driver.Quit();\n }\n}\n\n
Blogs
Book Recommendations
Lire aussi
Opérateur ? en Rust : ce que c'est et pourquoi il est utile pour un débutant
Mise en cache en Java : Redis, Memcached et solutions intégrées de A à Z
Une journée dans la vie d'un développeur Rust : du café du matin au cargo du soir
Programmation asynchrone en PHP : guide complet
Tests en PHP : unit, integration, e2e de A à Z