Speclr Logo

Wednesday, April 1, 2026

BDD is a thinking tool. The tests are optional.

Jonas
Beginner8 min read

The reason BDD fails in most teams isn't that it's too complex. It's that the people introducing it start with Cucumber.

They set up the framework. They install the plugins. They explain Given/When/Then. They schedule Three Amigos sessions. They block a sprint for the rollout. Three weeks later, the team has written four scenarios and decided this is too much process.

I know because I'm the person who introduced it that way. Twice.

The second time, a senior developer on the team said: "This is overhead with extra steps." I had no good answer. I believed in BDD. But I had built the ceremony before I understood what BDD actually was. And when you can't defend the ceremony on its own terms, you lose the room fast.

What you think BDD requires

The standard BDD pitch comes with a list of pre-conditions:

  • A behavior-driven test framework (Cucumber, Behave, SpecFlow, or similar)
  • Gherkin files living in a `features/` directory, checked into version control
  • Three Amigos sessions — developer, tester, product owner — before every story
  • A QA culture, or at least one person on the team who actually cares about testing
  • Buy-in from the whole team, ideally from management as well

That's a significant organizational ask for something described as a development methodology.

None of those things are BDD. They're scaffolding that grew up around BDD because teams found it useful. The methodology itself is one sentence: write the scenario before you write the code.

That's it. Everything else is optional.

Three keywords and a text file

Gherkin - the language BDD scenarios are written in - has three keywords that matter:

Given [some starting context]
When [an action happens]
Then [something is expected to be true]

That's the grammar. You don't need a framework to use it. You don't need a test runner. You don't need shared infrastructure. You need a file, a keyboard, and a feature to think through.

Here's what a login flow looks like:

Scenario: User logs in with valid credentials
Given the user is on the login page
When they enter a valid email and password and click Submit
Then they are redirected to the dashboard
And they see their name in the top navigation

Scenario: User enters an incorrect password
Given the user is on the login page
When they enter a valid email and an incorrect password
Then they see an error message under the password field
And they remain on the login page
And the password field is cleared

No framework. No step definitions. No CI integration. Two scenarios in a plain text file.

The ticket for this feature probably said "User can log in." The scenarios say what log in actually means. They are not the same artifact.


The ceremony accumulated around BDD because it's useful at scale - not because it's required. Most teams adopt the left column and never get to the benefit.

What Dan North actually wanted

Before Dan North published "Introducing BDD" in 2006, the same practice was called Test-Driven Development. The problem was the word "test." Developers heard it and immediately started asking the wrong questions: who owns the tests, where do they live, what framework are we using. The upfront thinking got buried under infrastructure decisions.

So North renamed it. Behavior, not test. The Given-When-Then notation he and his colleagues developed at ThoughtWorks was a way to describe examples of behavior that anyone on the team could read. Not test scripts. Examples.

A few years later, Gojko Adzic renamed the whole thing again: Specification by Example. Better name, honestly. You write a concrete example, and that example is the specification. No test implied. No framework required. Just a description of what this thing should do, written before anyone starts building it.

That's the version that stuck with me once I understood it. Specification by Example. You're not writing tests. You're writing examples. The Given-When-Then format is just a grammar for getting them onto paper in a way everyone can read.
If BDD ever felt like a testing practice to you - that's the confusion North spent years trying to undo. The tooling grew up around the idea and pulled everyone back toward "test" anyway.

What the scenario forces you to think about

You're about to write a scenario. You start typing.

Scenario: User logs in with valid credentials
Given the user is on the login page
When they enter...

Now you have to finish the sentence. What exactly do they enter? Email only? Email and password in separate fields? What triggers submission - a button click, pressing Enter, either? What counts as a valid email here - format validation only, or does the account need to exist first?

These feel like small questions. They are not. Every open question in a scenario is a decision that was going to be made during development - by the developer, alone, at some point in the afternoon, without input from anyone. That decision might be fine. Or it might be the thing the PO sees in the sprint review and says "wait, that's not what I meant."

Writing the scenario before you write the code doesn't eliminate those decisions. It moves them from the implementation phase - where fixing them means reopening a PR and negotiating scope - to the planning phase, where fixing them is an argument that takes ten minutes and costs nothing.

That's what BDD is. The tests are a side effect of writing things down.
The act of writing the scenario is the point. The questions you had to answer to complete it - the ones that forced you to actually think through the edge cases - those are the deliverable. Not the file. The thinking.

How I run this now

After the second failed rollout, I stopped introducing BDD as a process. I started using it as a thinking tool — privately, before I touch the IDE.

Before I pick up a story, I open a plain text file. I write the scenarios. Usually two or three: happy path, the main error case, and one edge case that I know will come up. I don't commit the file to a shared repository. I don't wire it to a test framework. I don't present it in a meeting.

I just write it.

The output is pretty predictable. Questions I don't have answers to - "what happens if the user's session expired mid-flow?" - become a comment on the ticket before I write any code. Edge cases I didn't know existed - "what if they already have an account but signed up via OAuth?" - become additional scenarios or a note that says out of scope for now. Either way, useful. The scope of "done" gets concrete enough that I can recognize it when I get there.

Some of these scenarios eventually become automated tests. Most don't — the team doesn't have the testing infrastructure, or the scenario is too UI-dependent, or we never got to it. That's fine. The value was in the writing, not in the running.
If you want to get the rest of the team involved, share the file. Run a fifteen-minute review: "Here's what I think this feature does. What am I missing?" That's a Three Amigos session without the ceremony. You don't need a scheduled ritual for a Slack message with a file attachment.

Start with one story

If you dropped BDD because the setup felt like overhead, try this: pick one story from your next sprint. Before you write any code, write the scenarios in a plain `.feature` file. Don't wire it to anything. Don't explain it to anyone. Just write it, and notice what happens.

The questions that come up are the ones that were going to derail your sprint anyway. The only difference is when you run into them. At scenario-writing time, they cost a few minutes of thinking. At implementation time, they cost a back-and-forth with the PO. At review time, they cost a rejected PR. At production time, they cost a hotfix.

BDD as a full methodology - Three Amigos, Cucumber, step definitions, shared feature directories - is a real system with real value. I'm not trying to convince you it's unnecessary at scale. But it has a learning curve, a setup cost, and it requires the whole team to change how they work. That's a legitimate ask.

A BDD purist would say what I'm describing isn't really BDD at all - that without the collaboration loop, you're just writing structured comments. They might be right. Call it Specification by Example if you want. Call it writing things down before coding them. The name doesn't change what happens when you do it: you find the problems before they find you in a sprint review.

BDD as a thinking habit costs fifteen minutes and a text file.

Start there. The ceremony can come later. Or you'll find it doesn't need to.

Tags

bddgherkindeveloper-processspecification-by-examplerequirements