Serengeti logo BLACK white bg w slogan

TDD vs. BDD vs. ATDD

Saša Ivičević, Senior Software Developer

Sometimes, software development can be overwhelming. There are lots of languages, frameworks, and tools to know about. Also, there are processes to follow. For a developer, in most cases, it’s not the work of writing out code that’s difficult. The complexity comes in determining what kind of code to write, how to handle different cases, and trying to predict what the user exactly needs. We can solve this by writing tests upfront. Doing this gives the developer a set of verifiably correct criteria to meet.

TDD (test-driven development), BDD (behavior-driven development), and ATDD (acceptance test-driven development) all share “driven development” as part of their acronym. Driven development helps us be prepared before development starts so that the development follows a predefined path. Driven development is focused on us spending time planning and writing tests before development. Having tests already in place provides clear expectations of what we need to create. And we, as developers, work through these requirements and know we’re done when all tests succeed.

What We Need to Know About TDD, BDD and ATDD

Test-driven development (TDD)

is a technique of using automated unit tests to drive the design of software and force decoupling of dependencies. The result of using this practice is a comprehensive suite of unit tests that can be run at any time to provide feedback that the software is still working.

The concept is to “get something working now and perfect it later.” After each test, refactoring is done and then the same or a similar test is performed again. The process is iterated as many times as necessary until each unit is functioning according to the desired specifications.

Benefits of Test-Driven Development:

  • Helps reduce the amount of time required for rework
  • Helps explore bugs or errors very quickly
  • Helps get faster feedback
  • Encourages the development of cleaner and better designs
  • Enhances the productivity of the programmer
  • Allows any team member to start working on the code in the absence of a specific team member. This encourages knowledge sharing and collaboration
  • Gives the programmer confidence to change the large architecture of an application easily
  • Results in the creation of extensive code that is flexible and easy to maintain

Behavior-Driven Development (BDD)

combines the general techniques and principles of TDD with ideas from domain-driven design. BDD is a design activity where you build pieces of functionality incrementally guided by the expected behavior. The focus of BDD is the language and interactions used in the process of software development. Behavior-driven developers use their native language in combination with the language of Domain-Driven Design to describe the purpose and benefit of their code.

A team using BDD should be able to provide a significant portion of “functional documentation” in the form of User Stories augmented with executable scenarios or examples. BDD is usually done in very English-like language helps the Domain experts to understand the implementation rather than exposing the code level tests. It’s usually defined in a GWT format: GIVEN WHEN & THEN.

Key benefits of Behavioral-Driven Development:

  • Helps reach a wider audience by using non-technical language
  • Focuses on how the system should behave from the customer’s and the developer’s perspective
  • A cost-effective technique
  • Reduces efforts needed to verify any post-deployment defects

ATDD stands for Acceptance Test-Driven Development

it is also less commonly designated as StoryTest Driven Development (STDD). It is a technique used to bring customers into the test design process before coding has begun. It is a collaborative practice where users, testers, and developers define automated acceptance criteria. ATDD helps to ensure that all project members understand precisely what needs to be done and implemented. Failing tests provide quick feedback that the requirements are not being met. The tests are specified in business domain terms. Each feature must deliver real and measurable business value: indeed, if your feature doesn’t trace back to at least one business goal, then you should be wondering why you are implementing it in the first place.

Benefits of ATDD

  • Requirements are very clearly analyzed without any ambiguity
  • Encourages collaboration among cross-team members
  • The acceptance test serves as a guide for the entire development process

Key Differences

Understanding how these methods work can help developers and other individuals involved in software development figure out which strategy works best to serve their purpose. Depending on the kind of project and the results it aims to achieve, the right method (or even a mix of methods) can be deployed to meet specific requirements in the most efficient ways.

TDD is a development technique that focuses on the implementation of a feature
BDD is a development technique that focuses on the system’s behaviourATDD is a technique similar to BDD, focusing more on capturing the requirements
ParticipantsDeveloperDevelopers, Customer, QAsDevelopers, Customers, QAs
Language usedWritten in a language similar to the one used for feature development (e g. Java, Python, etc.)Simple English, (Gherkin) Simple English, Gherkin 
Main FocusUnit Tests
Understanding Requirements
Writing Acceptance Tests
Tools usedJDave, Cucumber, JBehave, Spec Flow, BeanSpec, Gherkin Concordian, FitNesseGherkin, Dave, Cucumber, JBehave, Spec Flow, BeanSpec, ConcordianTestNG, FitNesse, EasyB, Spectacular, Concordian, Thucydides 


How do you decide which one to go with? You don’t need to choose just one. Depending on your situation and team, you can use positive aspects of each of them. You can also combine them. You might use ATDD to gain early collaboration while the developer follows TDD for their work. Use the givenwhen, and then format from BDD to define your acceptance criteria in ATDD without the translation to code. Find what works best for you and your team.

Finally, when you combine the three, you don’t only write tests from the code-focused view of a developer. You get more people on board, having conversations, making sure everyone can contribute to the app’s quality by sharing their specific insights. As a result, your application fulfills its requirements, and you make your product development cycle more efficient. Also, your app’s code contains fewer errors. This allows your QA team to focus on more challenging tasks or manual test cases. All in all, everyone in your organization can spend their time more efficiently by combining TDD, BDD, and ATDD.

Software development is not about following a rigid structure. It’s all about constant improvement and changing to find what works well. Feel free to reach us if you need some help

Let's do business

The project was co-financed by the European Union from the European Regional Development Fund. The content of the site is the sole responsibility of Serengeti ltd.