Tests E2E d'applications Kotlin : du zéro à la 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 E2E sont votre meilleur ami (et comment vous lier d'amitié avec eux en Kotlin)

\n\n

Imaginez : vous avez écrit un super service en Kotlin, tout compile, les tests unitaires sont verts, la revue de code est passée. Vous déployez en production, et... les utilisateurs se plaignent que le bouton « Acheter » ne fonctionne pas, alors que les tests unitaires le vérifiaient. Ça vous dit quelque chose ? Bienvenue dans le monde où les tests E2E d'applications Kotlin ne sont pas un luxe, mais une nécessité.

\n\n

Le test de bout en bout (end-to-end) consiste à vérifier l'ensemble du parcours utilisateur : du clic sur un bouton à l'écriture dans la base de données et inversement. Dans cet article, nous ne nous contenterons pas de parler de théorie. Nous écrirons de vrais tests pour une application Kotlin, analyserons les outils et montrerons comment ne pas perdre la tête lors de la configuration de l'infrastructure. Attachez vos ceintures, il y aura du code et du café.

\n\n

Qu'est-ce que le test E2E et en quoi diffère-t-il des autres types de tests

\n\n

Mettons les choses au clair tout de suite. Le test E2E (ou de bout en bout) vérifie l'ensemble du système tel que l'utilisateur le voit. Contrairement :

\n\n
    \n
  • Tests unitaires — vérifient une méthode/classe de manière isolée.
  • \n
  • Tests d'intégration — vérifient l'interaction de deux ou trois composants (par exemple, contrôleur + service).
  • \n
  • Tests UI — souvent confondus avec les tests E2E, mais un test UI peut ne pas vérifier le backend, seulement le rendu de l'interface.
  • \n
\n\n

Les tests E2E d'applications Kotlin couvrent le cycle complet : interface utilisateur (si présente), API, logique métier, base de données, services externes. Tout doit fonctionner ensemble comme une horloge.

\n\n

Outils pour les tests E2E en Kotlin

\n\n

Le choix de l'outil dépend de ce que vous testez : une application Android, un service web avec Ktor ou une application de bureau. Voici le top pour un développeur Kotlin :

\n\n
    \n
  • Selenide + Kotlin — pour les interfaces web. Une surcouche de Selenium, mais avec une syntaxe concise, idéale pour Kotlin.
  • \n
  • Ktor Client + TestContainers — pour le backend. Vous montez l'infrastructure de test (BD, cache) dans Docker et lancez des requêtes HTTP.
  • \n
  • Espresso + Compose Test — pour Android. Des outils natifs fournis avec le SDK Android.
  • \n
  • Cucumber + Kotlin — si vous avez besoin de scénarios BDD dans un langage compréhensible pour le client.
  • \n
\n\n

Nous nous concentrerons sur les deux premiers scénarios, car ils sont les plus polyvalents.

\n\n

Écrire un test E2E pour une application web en Kotlin (Selenide)

\n\n

Supposons que nous ayons une simple boutique en ligne avec Spring Boot + Kotlin. Nous devons vérifier le scénario : l'utilisateur accède au site, ajoute un produit au panier et passe commande.

\n\n

D'abord, ajoutons les dépendances dans build.gradle.kts :

\n\n
dependencies {\n    testImplementation("com.codeborne:selenide:6.19.1")\n    testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")\n    testImplementation("io.github.bonigarcia:webdrivermanager:5.6.2")\n}
\n\n

Maintenant, écrivons le test lui-même. Remarquez : nous utilisons des fonctions d'extension Kotlin pour rendre le code lisible :

\n\n
import com.codeborne.selenide.Condition.visible\nimport com.codeborne.selenide.Selenide.`$`\nimport com.codeborne.selenide.Selenide.open\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass ShopE2ETest {\n\n    @BeforeEach\n    fun setUp() {\n        // Ouvrir le navigateur avant chaque test\n        open("https://test-shop.example.com")\n    }\n\n    @Test\n    fun `user can add product to cart and checkout`() {\n        // Étape 1 : Trouver le produit et l'ajouter au panier\n        `$`("[data-testid='product-1']").shouldBe(visible).click()\n        `$`("[data-testid='add-to-cart']").click()\n\n        // Étape 2 : Vérifier que le panier n'est pas vide\n        `$`("[data-testid='cart-badge']").shouldHave(text("1"))\n\n        // Étape 3 : Aller à la caisse\n        `$`("[data-testid='checkout-btn']").click()\n\n        // Étape 4 : Remplir le formulaire\n        `$`("[                

Blogs

Book Recommendations