BDD auf C++: verhaltensorientierte Entwicklung für mutige Programmierer

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was ist BDD und warum ist es nicht nur ein weiterer modischer Trend?

\n\n

Haben Sie jemals Code geschrieben, der aus Sicht des Compilers einwandfrei funktioniert, aber absolut nicht das tut, was das Geschäft benötigt? Kennen Sie das, wenn der Manager auf die fertige Funktion schaut und sagt: „Nun, ich dachte, es würde anders sein.“ Wenn ja – willkommen in der Welt des BDD (Behaviour-Driven Development) – der verhaltensorientierten Entwicklung. Es ist nicht nur eine Methodik, sondern eine Brücke zwischen „Ich möchte, dass der Knopf grün ist“ und „Hier ist ein Test, der fehlschlägt, wenn der Knopf nicht grün ist“.

\n\n

Im Gegensatz zum klassischen TDD (Test-Driven Development), bei dem wir Tests als Überprüfung von Funktionen betrachten, konzentriert sich BDD auf das Verhalten des Systems aus Benutzersicht. Im Kontext von C++ ist dies besonders wertvoll: Die Sprache ist komplex, die Projekte sind riesig, und das Umschreiben von Logik nach Missverständnissen mit dem Kunden ist ein teures Vergnügen. BDD auf C++ hilft, zwei Fliegen mit einer Klappe zu schlagen: Dokumentation zu erhalten, die sogar ein Projektmanager versteht, und eine Reihe automatisierter Tests, die verhindern, dass die Geschäftslogik beschädigt wird.

\n\n

In diesem Artikel werden wir untersuchen, wie man verhaltensorientierte Entwicklung in ein reales C++-Projekt integriert. Ohne überflüssige Füllwörter, mit Code und konkreten Techniken.

\n\n

Grundlagen von BDD: Die Sprache Gherkin und ihre Rolle in C++

\n\n

Das Herz von BDD sind Szenarien in der Sprache Gherkin. Sie sehen ungefähr so aus:

\n\n
Funktion: Geldtransfer zwischen Konten\n  Szenario: Erfolgreicher Transfer bei ausreichendem Guthaben\n    Gegeben sei, dass der Benutzer ein Konto A mit einem Guthaben von 1000 Rubel hat\n    Und der Benutzer ein Konto B mit einem Guthaben von 0 Rubel hat\n    Wenn der Benutzer 500 Rubel von Konto A auf Konto B überweist\n    Dann beträgt das Guthaben von Konto A 500 Rubel\n    Und das Guthaben von Konto B beträgt 500 Rubel
\n\n

Ja, das ist kein C++. Aber darin liegt die Magie: Das Szenario wird in menschlicher Sprache geschrieben und dann über Schritte (Steps) an den eigentlichen C++-Code „gebunden“. Jede Zeile Gegeben sei, Wenn, Dann wird zu einer Funktion, die Ihre Klassen aufruft und die Ergebnisse überprüft.

\n\n

Für C++ gibt es mehrere Frameworks, die mit Gherkin arbeiten können. Die beliebtesten sind:

\n\n
    \n
  • Catch2 mit BDD-Stil – leichtgewichtig, in Catch2 integriert, benötigt keine externen Parser.
  • \n
  • Cucumber-CPP – eine vollständige Implementierung von Cucumber für C++, parst .feature-Dateien direkt.
  • \n
  • Boost.Test – kann ebenfalls eine BDD-ähnliche Syntax, ist aber weniger flexibel.
  • \n
\n\n

Ich persönlich empfehle, mit Catch2 zu beginnen: Es ist bereits in 90% der C++-Projekte vorhanden, und für BDD muss nichts zusätzlich installiert werden. Wenn das Projekt groß ist und eine Integration mit Business-Analysten erforderlich ist, nehmen Sie Cucumber-CPP.

\n\n

BDD mit Catch2: Szenarien direkt im Code schreiben

\n\n

Catch2 bietet die Makros SCENARIO, GIVEN, WHEN, THEN und AND_WHEN/AND_THEN. Dies ist kein reines Gherkin, aber der Stil ist maximal angenähert. Lassen Sie uns einen Test für ein einfaches Bankkonto schreiben.

\n\n

Zuerst die Kontoklasse:

\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

Und nun der BDD-Test mit Catch2:

\n\n
// tes                

Blogs

Buchempfehlungen