Behavior-Driven Development (BDD) | Enjyn Gruppe
Hallo Welt
Hallo Welt
Original Lingva Deutsch
Übersetzung wird vorbereitet...
Dieser Vorgang kann bis zu 60 Sekunden dauern.
Diese Seite wird erstmalig übersetzt und dann für alle Besucher gespeichert.
0%
DE Zurück zu Deutsch
Übersetzung durch Lingva Translate

235 Dokumentationen verfügbar

Wissensdatenbank

Behavior Driven Development BDD

Zuletzt aktualisiert: 20.01.2026 um 11:24 Uhr

Behavior-Driven Development (BDD)

BDD beschreibt Software-Verhalten in natürlicher Sprache. Lernen Sie Gherkin, Cucumber und wie BDD die Zusammenarbeit zwischen Entwicklern und Business verbessert.

BDD vs TDD

┌─────────────────────────────────────────────────────────────┐
│                      TDD vs BDD                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   TDD (Test-Driven Development)                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • Fokus auf TECHNISCHE Implementation               │  │
│   │ • Unit Tests in Code                                │  │
│   │ • Von Entwicklern geschrieben                       │  │
│   │ • expect(calculator.add(2, 3)).toBe(5)             │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   BDD (Behavior-Driven Development)                         │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • Fokus auf GESCHÄFTSVERHALTEN                      │  │
│   │ • Szenarien in natürlicher Sprache                  │  │
│   │ • Von allen Stakeholdern verstehbar                 │  │
│   │ • Given I have 2 items, When I add 3, Then I have 5│  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   BDD baut auf TDD auf, nicht ersetzt es!                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Gherkin Syntax

# login.feature

Feature: User Login
  As a registered user
  I want to log into my account
  So that I can access my personal dashboard

  Background:
    Given a user exists with email "john@example.com" and password "secure123"

  Scenario: Successful login with valid credentials
    Given I am on the login page
    When I enter "john@example.com" as email
    And I enter "secure123" as password
    And I click the login button
    Then I should be redirected to the dashboard
    And I should see "Welcome, John"

  Scenario: Failed login with wrong password
    Given I am on the login page
    When I enter "john@example.com" as email
    And I enter "wrongpassword" as password
    And I click the login button
    Then I should see an error message "Invalid credentials"
    And I should remain on the login page

  Scenario: Account lockout after multiple failed attempts
    Given I am on the login page
    When I enter "john@example.com" as email
    And I fail to login 3 times
    Then my account should be locked
    And I should see "Account locked. Please contact support."

Gherkin Keywords

Keyword Beschreibung Beispiel
Feature Beschreibt das Feature Feature: Shopping Cart
Scenario Ein konkreter Testfall Scenario: Add item to cart
Given Vorbedingung (Arrange) Given I have an empty cart
When Aktion (Act) When I add a product
Then Erwartetes Ergebnis (Assert) Then cart should have 1 item
And/But Zusätzliche Schritte And total should be $10
Background Gemeinsame Vorbedingungen Background: Given I am logged in

Scenario Outline (Parametrisiert)

# discount.feature

Feature: Discount Calculation

  Scenario Outline: Apply discount based on order amount
    Given I have items worth <amount> in my cart
    When I proceed to checkout
    Then I should receive a <discount>% discount
    And my total should be <total>

    Examples:
      | amount | discount | total  |
      | 50     | 0        | 50.00  |
      | 100    | 5        | 95.00  |
      | 200    | 10       | 180.00 |
      | 500    | 15       | 425.00 |

Cucumber.js Implementation

// features/step_definitions/login.steps.js

const { Given, When, Then, Before } = require('@cucumber/cucumber');
const { expect } = require('chai');

let app, currentPage, user;

Before(function () {
    app = new TestApp();
    currentPage = null;
});

// Background Step
Given('a user exists with email {string} and password {string}', async function (email, password) {
    user = await app.createUser({ email, password });
});

// Given Steps
Given('I am on the login page', async function () {
    currentPage = await app.navigateTo('/login');
});

// When Steps
When('I enter {string} as email', async function (email) {
    await currentPage.fill('#email', email);
});

When('I enter {string} as password', async function (password) {
    await currentPage.fill('#password', password);
});

When('I click the login button', async function () {
    await currentPage.click('#login-button');
});

When('I fail to login {int} times', async function (times) {
    for (let i = 0; i < times; i++) {
        await currentPage.fill('#email', user.email);
        await currentPage.fill('#password', 'wrong');
        await currentPage.click('#login-button');
    }
});

// Then Steps
Then('I should be redirected to the dashboard', async function () {
    expect(currentPage.url()).to.include('/dashboard');
});

Then('I should see {string}', async function (text) {
    const content = await currentPage.textContent('body');
    expect(content).to.include(text);
});

Then('I should see an error message {string}', async function (message) {
    const error = await currentPage.textContent('.error-message');
    expect(error).to.equal(message);
});

Then('I should remain on the login page', async function () {
    expect(currentPage.url()).to.include('/login');
});

Then('my account should be locked', async function () {
    const updatedUser = await app.getUser(user.id);
    expect(updatedUser.isLocked).to.be.true;
});

Behat (PHP)

// features/bootstrap/FeatureContext.php

use Behat\Behat\Context\Context;
use PHPUnit\Framework\Assert;

class FeatureContext implements Context
{
    private App $app;
    private ?User $user = null;
    private ?Page $currentPage = null;

    public function __construct()
    {
        $this->app = new TestApp();
    }

    /**
     * @Given a user exists with email :email and password :password
     */
    public function aUserExistsWithEmailAndPassword(string $email, string $password): void
    {
        $this->user = $this->app->createUser($email, $password);
    }

    /**
     * @Given I am on the login page
     */
    public function iAmOnTheLoginPage(): void
    {
        $this->currentPage = $this->app->navigateTo('/login');
    }

    /**
     * @When I enter :value as email
     */
    public function iEnterAsEmail(string $value): void
    {
        $this->currentPage->fill('#email', $value);
    }

    /**
     * @When I enter :value as password
     */
    public function iEnterAsPassword(string $value): void
    {
        $this->currentPage->fill('#password', $value);
    }

    /**
     * @When I click the login button
     */
    public function iClickTheLoginButton(): void
    {
        $this->currentPage->click('#login-button');
    }

    /**
     * @Then I should be redirected to the dashboard
     */
    public function iShouldBeRedirectedToTheDashboard(): void
    {
        Assert::assertStringContainsString('/dashboard', $this->currentPage->getUrl());
    }

    /**
     * @Then I should see :text
     */
    public function iShouldSee(string $text): void
    {
        Assert::assertStringContainsString($text, $this->currentPage->getContent());
    }

    /**
     * @Then I should see an error message :message
     */
    public function iShouldSeeAnErrorMessage(string $message): void
    {
        $error = $this->currentPage->find('.error-message')->getText();
        Assert::assertEquals($message, $error);
    }
}

E-Commerce Feature Beispiel

# features/shopping_cart.feature

Feature: Shopping Cart
  As a customer
  I want to manage items in my shopping cart
  So that I can purchase products I want

  Background:
    Given the following products exist:
      | name        | price  | stock |
      | Laptop      | 999.00 | 10    |
      | Mouse       | 29.99  | 50    |
      | Keyboard    | 79.99  | 25    |

  Scenario: Add product to empty cart
    Given I have an empty cart
    When I add "Laptop" to my cart
    Then my cart should contain 1 item
    And my cart total should be $999.00

  Scenario: Add multiple quantities of same product
    Given I have an empty cart
    When I add 2 "Mouse" to my cart
    Then my cart should contain 2 items
    And my cart total should be $59.98

  Scenario: Cannot add more than available stock
    Given I have an empty cart
    When I try to add 15 "Laptop" to my cart
    Then I should see an error "Only 10 items available"
    And my cart should be empty

  Scenario: Apply coupon code
    Given I have the following items in my cart:
      | product  | quantity |
      | Laptop   | 1        |
      | Mouse    | 2        |
    When I apply coupon code "SAVE10"
    Then I should receive a 10% discount
    And my cart total should be $953.08

  Scenario: Remove item from cart
    Given I have the following items in my cart:
      | product  | quantity |
      | Laptop   | 1        |
      | Mouse    | 1        |
    When I remove "Mouse" from my cart
    Then my cart should contain 1 item
    And my cart should not contain "Mouse"

BDD Workflow

┌─────────────────────────────────────────────────────────────┐
│                    BDD WORKFLOW                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   1. DISCOVERY (Three Amigos Meeting)                       │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  👔 Business  +  👨‍💻 Developer  +  🧪 QA            │  │
│   │                                                      │  │
│   │  • Was soll das Feature tun?                        │  │
│   │  • Welche Szenarien gibt es?                        │  │
│   │  • Was sind die Akzeptanzkriterien?                 │  │
│   └─────────────────────────────────────────────────────┘  │
│                         │                                   │
│                         ▼                                   │
│   2. FORMULATION (Gherkin schreiben)                       │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  Feature Files in natürlicher Sprache               │  │
│   │  Von allen verstanden und reviewt                   │  │
│   └─────────────────────────────────────────────────────┘  │
│                         │                                   │
│                         ▼                                   │
│   3. AUTOMATION (Step Definitions)                         │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  Developer implementiert Steps                       │  │
│   │  Tests sind ausführbar                              │  │
│   └─────────────────────────────────────────────────────┘  │
│                         │                                   │
│                         ▼                                   │
│   4. IMPLEMENTATION                                         │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  Feature entwickeln bis alle Szenarien grün         │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Gute Gherkin-Szenarien schreiben

// ❌ SCHLECHT: Zu technisch, zu detailliert

Scenario: Login
  Given I open browser
  And I navigate to "http://localhost:3000/login"
  And I wait for page to load
  When I find element with id "email"
  And I type "john@example.com"
  And I find element with id "password"
  And I type "secret123"
  And I find element with id "submit"
  And I click it
  Then I should see element with class "dashboard"

// ✅ GUT: Business-Sprache, lesbar

Scenario: Successful login
  Given I am a registered user
  When I log in with valid credentials
  Then I should see my dashboard
// ❌ SCHLECHT: Zu viele Details in einem Szenario

Scenario: Complete order
  Given I am logged in
  And I have product A in cart
  And I have product B in cart
  And I have applied coupon "SAVE10"
  And I have entered shipping address
  And I have selected express shipping
  And I have entered credit card details
  When I click place order
  Then order should be created
  And payment should be processed
  And confirmation email should be sent
  And inventory should be updated

// ✅ GUT: Fokussiert auf ein Verhalten

Scenario: Place order with valid payment
  Given I have items in my cart
  And I have entered valid shipping and payment details
  When I place my order
  Then I should receive an order confirmation

// Separate Szenarien für andere Aspekte:
Scenario: Inventory is updated after order
Scenario: Confirmation email is sent after order

Tools

CUCUMBER IMPLEMENTIERUNGEN

┌──────────────┬────────────────────────┬─────────────────────┐
│ Sprache      │ Tool                   │ Installation        │
├──────────────┼────────────────────────┼─────────────────────┤
│ JavaScript   │ Cucumber.js            │ npm i @cucumber/    │
│              │                        │ cucumber            │
├──────────────┼────────────────────────┼─────────────────────┤
│ PHP          │ Behat                  │ composer require    │
│              │                        │ behat/behat         │
├──────────────┼────────────────────────┼─────────────────────┤
│ Java         │ Cucumber-JVM           │ Maven/Gradle        │
├──────────────┼────────────────────────┼─────────────────────┤
│ Python       │ Behave                 │ pip install behave  │
├──────────────┼────────────────────────┼─────────────────────┤
│ Ruby         │ Cucumber               │ gem install cucumber│
└──────────────┴────────────────────────┴─────────────────────┘

UI TESTING INTEGRATION
• Playwright + Cucumber
• Cypress + cucumber-preprocessor
• Selenium + Cucumber
💡 Best Practices: 1. Business-Sprache verwenden, nicht technische Details
2. Ein Szenario = ein Verhalten
3. Three Amigos: Business, Dev, QA gemeinsam
4. Feature Files sind lebende Dokumentation
5. Steps wiederverwendbar gestalten

Weitere Informationen

Enjix Beta

Enjyn AI Agent

Hallo 👋 Ich bin Enjix — wie kann ich dir helfen?
120