BDD Principles
Master the foundational principles and philosophy of Behavior-Driven Development.
What is BDD?
Behavior-Driven Development (BDD) is a collaborative software development approach that:
-
Bridges the gap between business and technical teams
-
Uses concrete examples to describe system behavior
-
Creates living documentation that serves as tests
-
Focuses on delivering business value
-
Promotes shared understanding through conversation
Core Philosophy
Discovery > Development > Delivery
Discovery: Collaborate to understand requirements
-
Hold Three Amigos sessions
-
Explore with examples
-
Challenge assumptions
-
Build shared understanding
Development: Implement guided by examples
-
Use examples as specifications
-
Automate examples as tests
-
Follow outside-in TDD
Delivery: Validate against real behavior
-
Executable specifications provide confidence
-
Living documentation stays current
-
Regressions are caught early
The Three Amigos
A practice where three perspectives collaborate to explore and define features:
- Business Perspective (Product Owner/BA)
-
What problem are we solving?
-
What value does it provide?
-
What are the business rules?
- Development Perspective (Developer)
-
How might we build this?
-
What are the technical constraints?
-
What are the edge cases?
- Testing Perspective (Tester/QA)
-
What could go wrong?
-
What are we missing?
-
How will we verify this works?
Example Three Amigos Session
Feature: Password Reset
Business: "Users who forget their password need a way to reset it via email."
Developer: "We'll need to generate secure tokens with expiration. How long should tokens be valid?"
Tester: "What happens if they request multiple reset emails? Can old tokens still be used?"
Business: "Tokens should be valid for 1 hour. Multiple requests should invalidate old tokens."
Developer: "Should we rate-limit reset requests to prevent abuse?"
Tester: "What if the email address doesn't exist in our system?"
Business: "For security, show the same success message whether or not the email exists."
Outcome: Concrete examples that become scenarios:
Scenario: Request password reset with valid email Given a user account exists for "user@example.com" When I request a password reset for "user@example.com" Then I should receive a reset email And the reset link should be valid for 1 hour
Scenario: Request password reset with non-existent email When I request a password reset for "nonexistent@example.com" Then I should see a success message But no email should be sent
Scenario: Multiple password reset requests Given I have requested a password reset When I request another password reset Then the previous reset link should be invalidated And I should receive a new reset email
Living Documentation
BDD scenarios serve as:
-
Executable Specifications: Automated tests that verify behavior
-
Documentation: Up-to-date description of how the system works
-
Common Language: Shared vocabulary between business and technical teams
-
Regression Suite: Safety net when making changes
Example: Living Documentation
Feature: Promotional Discount Application To attract customers and increase sales As a marketing manager I want to offer promotional discounts
Rule: Percentage discounts apply to order subtotal Example: 20% off for orders over $100 Given I have a $150 order When I apply a "20% off" promotion Then my discount should be $30 And my order total should be $120
Rule: Minimum purchase amount must be met Example: Promotion requires $50 minimum Given I have a $40 order When I try to apply a "$50 minimum" promotion Then the promotion should not apply And I should see "Minimum purchase not met"
Rule: Only one promotion per order Example: Cannot stack multiple promotions Given I have a $100 order And I have applied "10% off" When I try to apply "Free shipping" Then I should see "One promotion per order" And only "10% off" should be applied
Ubiquitous Language
Develop and use a shared vocabulary:
❌ Technical Jargon:
"When the user submits the form, we validate the input, hash the password with bcrypt, insert a record into the users table, and return a 201 response."
✅ Ubiquitous Language:
"When a customer registers, we verify their information, create their account, and send a welcome email."
Building Ubiquitous Language
Discover terms through conversation:
-
What do you call this?
-
What's the difference between X and Y?
-
When does this state change?
Document terms in scenarios:
Use "Member" not "User" (business term)
Given I am a Gold Member
Use "Place order" not "Submit order" (domain term)
When I place an order
Use "Pending" not "In progress" (system state)
Then the order should be Pending
Keep a glossary:
Member: A customer with a subscription Guest: A customer without a subscription Order: A collection of items ready for purchase Cart: A temporary collection of items being considered
Example Mapping
A workshop technique to explore features with examples:
The Four Colors
Yellow Cards: User Stories/Features Blue Cards: Rules (acceptance criteria) Green Cards: Examples (scenarios) Red Cards: Questions (uncertainties)
Example Mapping Session
Story: User registration
Rules (Blue):
-
Email must be unique
-
Password must be strong
-
Age must be 18+
Examples (Green):
-
Register with valid details → Success
-
Register with existing email → Error
-
Register with weak password → Error
-
Register under 18 → Error
Questions (Red):
-
Do we verify email addresses?
-
What defines a "strong" password?
-
Do we need parent consent for minors?
Specification by Example
Use concrete examples to drive development:
Vague Requirement
"Users should be able to search for products."
Specification by Example
Scenario: Search by product name Given products "Laptop", "Mouse", "Keyboard" exist When I search for "lap" Then I should see "Laptop" in results But I should not see "Mouse" or "Keyboard"
Scenario: Search with no results Given products "Laptop", "Mouse" exist When I search for "phone" Then I should see "No results found"
Scenario: Search is case-insensitive Given a product "Laptop" exists When I search for "LAPTOP" Then I should see "Laptop" in results
Outside-In Development
Start from the outside (user-facing behavior) and work inward:
-
Write a failing scenario (acceptance test)
-
Write a failing unit test (for the layer you're working on)
-
Write minimum code to make unit test pass
-
Refactor
-
Repeat until scenario passes
Scenario (Acceptance) ─┐ ├─> Controller Test ─┐ │ ├─> Service Test ─┐ │ │ ├─> Code │ │ │ │ ├─ Service │ │ │ │ ├─ Controller │ │ │ │ │ Scenario Passes ───────┴────────────────────┴─────────────────┘
BDD vs TDD
TDD (Test-Driven Development):
-
Developer-focused
-
Tests implementation
-
Red-Green-Refactor cycle
-
Unit tests guide design
BDD (Behavior-Driven Development):
-
Business-focused
-
Tests behavior
-
Conversation-Specification-Automation
-
Scenarios guide development
They complement each other:
-
BDD: What should we build? (outside-in)
-
TDD: How should we build it? (inside-out)
Key Principles
-
Collaboration is essential - BDD requires active participation from business, development, and testing
-
Examples clarify requirements - Concrete examples reveal ambiguities and edge cases
-
Automate what matters - Not everything needs to be automated, focus on high-value scenarios
-
Think behaviors, not tests - Describe what the system does, not how it's tested
-
Iterate and refine - Scenarios evolve as understanding deepens
-
Keep scenarios maintainable - Write clear, focused scenarios that are easy to update
Common Misconceptions
❌ "BDD is just testing with Cucumber" ✅ BDD is a collaborative practice; tools are just enablers
❌ "BDD means writing tests before code" ✅ BDD means discovering requirements through examples before implementation
❌ "BDD scenarios should test everything" ✅ BDD scenarios should document key behaviors; use unit tests for details
❌ "Only testers write scenarios" ✅ Business, developers, and testers collaborate on scenarios
❌ "BDD slows down development" ✅ BDD reduces rework by building the right thing the first time
Benefits of BDD
-
Reduced rework: Build the right thing from the start
-
Better collaboration: Shared understanding across roles
-
Living documentation: Always up-to-date specifications
-
Faster onboarding: New team members learn from scenarios
-
Regression safety: Automated scenarios catch breaking changes
-
Business confidence: Stakeholders see value being delivered
Remember: BDD is fundamentally about communication and collaboration. The goal is to build software that delivers real value by ensuring everyone has a shared understanding of what needs to be built.