ð bdd-principles
Core BDD concepts, philosophy, and the Three Amigos practice
Overview
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.