- 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:
- 1. Business Perspective (Product Owner/BA)
- What problem are we solving?
- What value does it provide?
- What are the business rules?
- 2. Development Perspective (Developer)
- How might we build this?
- What are the technical constraints?
- What are the edge cases?
- 3. 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.