BDD en C++ : développement piloté par le comportement pour les développeurs audacieux

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

Qu'est-ce que le BDD et pourquoi ce n'est pas juste un effet de mode ?

\n\n

Avez-vous déjà écrit du code qui fonctionne parfaitement du point de vue du compilateur, mais qui ne fait absolument pas ce que le métier attend ? Vous connaissez cette situation où le chef de projet regarde la fonctionnalité terminée et dit : « Ah, je pensais que ce serait différent ». Si oui, bienvenue dans le monde du BDD (Behaviour-Driven Development) — le développement piloté par le comportement. Ce n'est pas simplement une méthodologie, c'est un pont entre « je veux que le bouton soit vert » et « voici un test qui échoue si le bouton n'est pas vert ».

\n\n

Contrairement au TDD (Test-Driven Development) classique, où l'on pense aux tests comme à une vérification de fonctions, le BDD se concentre sur le comportement du système du point de vue de l'utilisateur. Dans le contexte du C++, c'est particulièrement précieux : le langage est complexe, les projets sont énormes, et réécrire la logique après une incompréhension avec le client coûte cher. Le BDD en C++ permet de faire d'une pierre deux coups : obtenir une documentation que même un chef de projet peut comprendre, et un ensemble de tests automatisés qui empêchent de casser la logique métier.

\n\n

Dans cet article, nous allons voir comment intégrer le behaviour-driven development dans un vrai projet C++. Sans blabla, avec du code et des techniques concrètes.

\n\n

Les bases du BDD : le langage Gherkin et son rôle en C++

\n\n

Le cœur du BDD, ce sont les scénarios écrits en langage Gherkin. Ils ressemblent à ceci :

\n\n
Feature: Transfert d'argent entre comptes\n  Scenario: Transfert réussi avec un solde suffisant\n    Given l'utilisateur a un compte A avec un solde de 1000 euros\n    And l'utilisateur a un compte B avec un solde de 0 euro\n    When l'utilisateur transfère 500 euros du compte A vers le compte B\n    Then le solde du compte A devient 500 euros\n    And le solde du compte B devient 500 euros
\n\n

Oui, ce n'est pas du C++. Mais c'est là toute la magie : le scénario est écrit en langage humain, puis « lié » au vrai code C++ via des étapes (steps). Chaque ligne Given, When, Then se transforme en une fonction qui appelle vos classes et vérifie les résultats.

\n\n

Pour le C++, il existe plusieurs frameworks capables de travailler avec Gherkin. Les plus populaires sont :

\n\n
    \n
  • Catch2 avec le style BDD — léger, intégré à Catch2, ne nécessite pas de parseur externe.
  • \n
  • Cucumber-CPP — une implémentation complète de Cucumber pour C++, qui parse directement les fichiers .feature.
  • \n
  • Boost.Test — propose aussi une syntaxe de type BDD, mais moins flexible.
  • \n
\n\n

Personnellement, je recommande de commencer avec Catch2 : il est déjà présent dans 90% des projets C++, et pour le BDD, vous n'avez besoin d'installer rien de plus. Si le projet est volumineux et nécessite une intégration avec des analystes métier, optez pour Cucumber-CPP.

\n\n

BDD avec Catch2 : écrire des scénarios directement dans le code

\n\n

Catch2 fournit les macros SCENARIO, GIVEN, WHEN, THEN et AND_WHEN/AND_THEN. Ce n'est pas du Gherkin pur, mais le style est très proche. Écrivons un test pour un simple compte bancaire.

\n\n

D'abord, la classe du compte :

\n\n
// account.h\n#pragma once\n#include <string>\n#include <stdexcept>\n\nclass Account {\npublic:\n    explicit Account(std::string owner, double initial_balance = 0.0)\n        : owner_(std::move(owner)), balance_(initial_balance) {}\n\n    void deposit(double amount) {\n        if (amount <= 0) throw std::invalid_argument("Amount must be positive");\n        balance_ += amount;\n    }\n\n    void withdraw(double amount) {\n        if (amount > balance_) throw std::runtime_error("Insufficient funds");\n        if (amount <= 0) throw std::invalid_argument("Amount must be positive");\n        balance_ -= amount;\n    }\n\n    double balance() const { return balance_; }\n    const std::string& owner() const { return owner_; }\n\nprivate:\n    std::string owner_;\n    double balance_ = 0.0;\n};
\n\n

Et maintenant, le test BDD avec Catch2 :

\n\n
// tes                

Blogs

Book Recommendations