BDD en Go : Comment écrire des tests que le métier comprend

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

Quand le code devient une histoire

\n

Imaginez : vous écrivez du code en Go, vous lancez les tests — une barre verte. Mais votre manager regarde votre t.Errorf et ne comprend pas ce qui s'est cassé. Le métier dit : « Faites en sorte que l'utilisateur puisse s'inscrire », et le développeur traduit cela en « POST /api/v1/user avec validation de l'email ». Le fossé entre le langage technique et le langage humain est le principal casse-tête de nombreux projets.

\n

La solution existe — le BDD (Behaviour-Driven Development) en Go. Ce ne sont pas simplement des tests. C'est un pont entre le code et la logique métier. Dans cet article, nous allons voir comment écrire des tests BDD en Go, en utilisant des exemples concrets, et pourquoi votre chef de produit vous en sera reconnaissant.

\n\n

Qu'est-ce que le BDD et pourquoi Go ?

\n

Behaviour-Driven Development (développement piloté par le comportement) est une évolution du TDD. Si le TDD se concentre sur le « comment » (comment implémenter une fonction), le BDD répond au « quoi » (ce que le système doit faire du point de vue de l'utilisateur).

\n

Go est idéal pour le BDD grâce à sa simplicité, son package intégré testing et ses frameworks puissants comme Ginkgo et Godog. La communauté Go utilise activement le BDD pour les microservices, les API et même les utilitaires en ligne de commande.

\n\n

Principes clés du BDD en Go

\n
    \n
  • Langage ubiquitaire (Ubiquitous Language) — les scénarios sont écrits dans un langage compréhensible par le métier, en anglais ou en français.
  • \n
  • Given-When-Then — la structure de tout scénario : prérequis → action → résultat attendu.
  • \n
  • Automatisation — les scénarios sont transformés en tests exécutables en Go.
  • \n
\n\n

Outils pour le BDD en Go

\n

Le choix du framework dépend de la manière dont vous souhaitez décrire les scénarios. Voici deux approches principales :

\n\n

1. Ginkgo + Gomega (pour les développeurs Go)

\n

Ginkgo est un framework BDD qui s'écrit en Go pur. Les scénarios ressemblent à du code Go avec des descriptions lisibles. Gomega est une bibliothèque de matchers pour les assertions.

\n

Avantages : contrôle total du code, excellente intégration avec les outils Go, prise en charge des tests asynchrones.

\n\n

2. Godog (Cucumber pour Go)

\n

Godog est une implémentation de Cucumber en Go. Vous écrivez les scénarios en Gherkin (fichiers Feature en langage naturel), puis vous implémentez les étapes en Go.

\n

Avantages : les scénarios sont lisibles même par les non-programmeurs, il est facile de modifier la logique sans toucher au code.

\n\n

Pratique : écrivons un test BDD en Go avec Ginkgo

\n

Créons un service simple — un panier d'achat pour une boutique en ligne. Écrivons un test BDD qui vérifie l'ajout d'un article.

\n\n

Étape 1 : Installation de Ginkgo

\n
go get github.com/onsi/ginkgo/v2\ngo get github.com/onsi/gomega
\n\n

Étape 2 : Initialisation du package de test

\n
cd mycart\nginkgo bootstrap
\n

Un fichier mycart_suite_test.go est créé.

\n\n

Étape 3 : Écrire le scénario

\n

Créons un fichier cart_test.go :

\n
package mycart_test\n\nimport (\n    . "github.com/onsi/ginkgo/v2"\n    . "github.com/onsi/gomega"\n    "mycart"\n)\n\nvar _ = Describe("Panier", func() {\n    var cart *mycart.Cart\n\n    BeforeEach(func() {\n        cart = mycart.NewCart()\n    })\n\n    Describe("Ajout d'un article", func() {\n        Context("avec un ID et un prix corrects", func() {\n            It("doit augmenter le nombre d'articles de 1", func() {\n                cart.AddItem("sku-123", 100.0)\n                Expect(cart.TotalItems()).To(Equal(1))\n            })\n\n            It("doit calculer correctement le montant total", func() {\n                cart.AddItem("sku-123", 100.0)\n                cart.AddItem("sku-456", 250.0)\n                Expect(cart.TotalPrice()).To(BeNumerically("~", 350.0, 0.01))\n            })\n        })\n\n        Context("avec un article déjà présent", func() {\n            It("doit augmenter la quantité, sans ajouter un nouvel article", func() {\n                cart.                

Blogs

Book Recommendations