Tests E2E C# : guide pour ceux qui en ont marre des bugs en production

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 unitaires ne suffisent pas, et quand les tests E2E sont nécessaires

\n\n

Imaginez : 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\n

Les 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\n

Dans 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\n

Qu'est-ce que le test E2E C# en pratique

\n\n

Un 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
\n\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\n

Outils pour les tests E2E C# : Selenium vs Playwright

\n\n

Le choix de l'outil est la première question qui se pose à l'équipe. Examinons les deux options les plus populaires.

\n\n

Selenium WebDriver

\n

Le 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\n

Playwright pour .NET

\n

Un 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\n

Dans 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\n

Commençons par les classiques. Installons le package via NuGet :

\n\n
dotnet 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\n
using 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