Levels of application testing
The classic way to think about testing levels is the so-called V model. A test level is a cohesive cluster of tests that share a clearly designated responsibility within the overall system and application context.
Visual representation of the V model.
According to this model, at minimum four distinct test levels can be identified. So, where does Behavior-Driven Development actually belong?
Let's anchor ourselves again in the definition before we answer that.
BDD is a process—a disciplined approach—engineered to secure the high quality of a product by specifying precise test cases that detail the behaviors of real end users (or other actors) and the outcomes those behaviors produce.
This method can be distilled into three core stages:
-
- Discovery – Collecting business requirements for a feature, dissecting behaviors in detail during "3 amigos" meetings (see below),
- Formulation – Formalizing those requirements as specific scenarios which will eventually be automated,
- Automation – The actual implementation of test cases and their integration into an automated suite.
![Representation of the iterative BDD model [1]. Representation of the iterative BDD model [1].](https://wp.angular.love/wp-content/uploads/2026/03/artk1.png)
Essentially, BDD's roots run deep into Test-Driven Development and Domain-Driven Design. From TDD, it inherits the habit of writing tests prior to or concurrently with the feature development, which pushes the implementation toward satisfying all established business rules.
In practice, this means orchestrating "3 amigos" meetings—a collaboration between the product owner (business stand-in), a tester, and a developer. Together, they discuss each feature thoroughly from the lens of the person using it. When the topic gets particularly complex or ambiguous, bringing in a domain expert is a wise move.
BDD takes the idea of a ubiquitous language from DDD. That's a shared vocabulary used interchangeably by business people, testers, and developers. Crucially, this language acts as a bridge for communication that smooths out the collaboration process between these different parties.
The tool that puts this language into practice is Gherkin, which comes with its own set of keywords and syntax rules for scripting test scenarios.
Given all that, it's easy to see why popular opinion paints BDD as a golden methodology for every project. But let's put that assumption to the test by first taking a hard look at its limitations.
Problems with Behavior-Driven Development
Additional overhead
A well-crafted set of scenarios will cover every feature and behavior the app offers. However, getting there demands extra effort that sometimes isn't worth the payoff. For BDD to actually work, you also need to verify that every new feature confirms all its expected behaviors—every single time. And that requirement triggers extra meetings per feature.
Buzzword-Driven Architecture
The tech landscape is heavily swayed by trends and hype, and BDD isn't immune. As a result, it often gets dragged into contexts where it never belonged in the first place. This usually boils down to a fuzzy grasp of where and how it should genuinely be used.
Large-scale projects
On big projects, implementing every conceivable test case becomes a huge investment. Plus, mapping out complex application flows raises the difficulty bar, and running the full set of scenarios can eat up hours of precious time.
Gherkin
While Gherkin offers serious advantages, it imposes a rigid structure on scenarios, complete with overarching rules like the Single Responsibility Principle (SRP). That's generally a plus, but there are situations where adhering so strictly to those rules makes implementing a test scenario less than ideal (which we'll get to shortly).
So, as seen above, BDD isn't exactly a lightweight approach. Yet, the issues highlighted here mostly spring from a fundamental misunderstanding of what BDD is. So let's revisit our original definition.
What, then, is BDD, and how should this approach be applied in practice?
BDD is a collection of principles aimed at delivering a top-notch product by pinning down the software's expected behavior through a business lens. Those expected behaviors get encoded as test stories—scenarios that spell out what the product should do from the user's viewpoint.
Given this framing, BDD doesn't naturally fit the idea of system testing. System tests belong at the code level where you have fast, direct access to the application's current state and can execute quickly. Where BDD shines is in acceptance testing (User Acceptance Tests). That's where the actor, armed with deep domain knowledge, can run through complex stories—sometimes even manually.
As we've noted, those scenarios are scripted in a structured syntax, so let's spend a moment digging into that syntax to appreciate both its strengths and its constraints.
Gherkin
Test scenarios lean on a sequence of dedicated keywords that the Gherkin parser processes, then ties the story description back to the underlying code. That's how the language becomes a ubiquitous one—clear to business folks and tech folks alike.
Syntax
Three kinds of steps form a typical scenario:
- Context (preconditions) – setting the application to a defined starting point from which the scenario can execute,
- Events – the actual action taken by the user,
- Outcomes – verifying what happens or what result appears after that action.

That example scenario packs in several keywords that Cucumber interprets and maps to code implementations. Each keyword has a clear job:
- Feature – defines the area being tested, like expected behaviors for a login page, the homepage, or something narrower. Under the Feature line, there should be a brief user-focused description explaining what behavior is under test and what the general expected outcome is within that scope.
- Scenario / Scenario Outline – marks where a specific story starts, with a short description. The difference? Scenario defines a single story, whereas Scenario Outline is a parameterized template that runs against every set of data you feed it.
- Given – sets up an initial condition, moving the app into a state where the scenario can start.
- When – the user's action, the core of the story.
- Then – the verification step, checking behavior or results. For example, after clicking a button, it confirms that an expected element shows up on-screen.
- And – stands for the same kind of step as whichever keyword preceded it, so you don't have to write When or Then repeatedly, and the text flows more naturally in English.
For a deeper dive, the Cucumber documentation has you covered.
Problems with Gherkin
Gherkin gives you a rich, descriptive way to script tests by enforcing a syntax that non-technical stakeholders and developers can both parse. The benefits are clear enough, but there are still some edges to worry about.
Single responsibility principle
Writing a Scenario means respecting the sequence Given ➝ When ➝ Then. That sequence is the only one allowed, and you shouldn't juggle the steps. This is all in service of a syntax that Gherkin can make sense of, of course. Still, in the real world you'll run across scenarios where this constraint just means more overhead—especially when you factor in test time. In such cases, it's best to keep your scenarios limited to the ones that really matter to the business or the end user.
The Single Responsibility Principle goes further and dictates that each step should handle exactly one action. Your step definition shouldn't use 'and' inside it. Something like "Given I am logged in and I am on a Home page" is a violation of SRP—that should be broken out into two different steps.
Imperative vs. declarative style
Another frequent pitfall is defining the scenarios poorly. For a scenario to stay relevant and compatible with your application over time, its definition needs to be detached from how the app is built. That means taking a declarative approach. Rather than listing the mechanics of every user click and keystroke (imperative), focus on describing the expected behavior in a given situation—the 'what' not the 'how'.
Take the login flow as an example. You don't need to spell out each action the user takes. Just describe the expected end state. Here's a comparison.
Example of a poorly written scenario (imperative style):
- Given: I opened the login page
- When: I enter the username in the first text field
- And: I enter the password in the second text field
- And: I click the Login button
- Then: I see the personalized homepage
Example of a well-written scenario (declarative style):
- Given: I opened the login page
- When: I log in with credentials
- Then: I see the personalized homepage
Conclusions
When every facet of BDD is weighed together, the methodology proves its value primarily in the sphere of acceptance testing. Extending it to system testing, however, is counterproductive—the very perks that make it shine in one area transform into liabilities in the other, potentially undermining the entire effort.
Another compelling reason to confine BDD to acceptance tests lies in troubleshooting. Once a scenario does fail, tracing the underlying cause can become an unexpectedly deep rabbit hole, making the debugging process slower and more convoluted than with other approaches.

BDD remains an exceptional tool for capturing the business logic requirements of an application and for vetting the final product against those expectations. That said, its frequent misuse—applied where it was never meant to fit—often dulls its reputation and masks the real advantages it can deliver.
Borrowing from the age-old adage “it depends,” this methodology demands careful consideration before adoption. A deep dive into the product at hand, the stakeholder needs, and every nuance covered in this discussion is a prerequisite for a sound decision.
Recommended resources:
- Cucumber documentation, https://cucumber.io/docs/bdd/
- Gherkin syntax, https://cucumber.io/docs/gherkin/
- BDD guide, https://inviqa.com/blog/bdd-guide
- How to write good Gherkin, https://medium.com/@wladislavk/how-to-write-good-gherkin-514aea53948c
- BDD 4 rules writing good Gherkin, https://techbeacon.com/app-dev-testing/better-behavior-driven-development-4-rules-writing-good-gherkin
- Introducing BDD, http://dannorth.net/introducing-bdd/
- BDD 101, https://automationpanda.com/2017/01/30/bdd-101-writing-good-gherkin/
