Software development can be overwhelming. There are tons of languages, frameworks, and tools to know about. Plus, there are processes to follow. For a developer, it’s often not the work of writing out code that’s difficult. The difficulty comes in determining what code to write, how to handle different cases, and trying to predict what the user needs. We can fix this by writing tests upfront. Doing this gives the developer a set of verifiably correct criteria to meet. TDD (test-driven development), BDD (behaviour-driven development), and ATDD (acceptance-test-driven development) all share “driven development” as part of their acronym.
These frameworks drive development by making us prepare before development starts so that the development follows a predefined path. They share a focus 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 developers work through these requirements uninterrupted and know we’re done when all tests succeed.
When it comes to process options, everyone has a success story behind why you should use theirs. I believe you should explore the different processes and use what works best for you and your team. In that spirit, I’m going to look at TDD, BDD, and ATDD and explain why you should try them out.
What is Test-Driven Development (TDD)?
It is the methodology to develop the test case before developers start writing the code. As per the requirement of the software, these test cases are just a small unit.
Here the approach is to continually test the written code through a “red-green-refactor loop” and the test has been done until it is absolutely ready to become a part of the scheme.
TDD is best applied when you have a known set of inputs with expected outputs. Especially when the logic to achieve those outputs is complex, TDD helps you simplify the complexity. Developers are able to break down large problems into very small chunks and focus on one thing at a time.
TDD’s test-first approach also helps mitigate critical bottlenecks that obstruct the quality and delivery of software. Based on the constant feedback, bug fixes, and addition of new features, the system evolves to ensure that everything works as intended. TDD enhances collaboration between team members from both the development and QA teams as well as with the client. Additionally, as the tests are created beforehand, teams don’t need to spend time recreating extensive test scripts.
Benefits of Test-Driven Development (TDD)
- Fosters the creation of optimized code.
- Helps developers better analyze and understand client requirements and request clarity when they are not adequately defined.
- The addition and testing of new functionalities become much easier in the latter stages of development.
- Test coverage under TDD is much higher compared to the conventional development models. This is because the TDD focuses on creating tests for each functionality right from the beginning.
- Enhances the productivity of the developer and leads to the development of a codebase that is flexible and easy to maintain.
What is Behavior-Driven Development (BDD)?
BDD is also known as Behavioral Driven Development. BDD is a development technique that practices creating simple scenarios on how an application should behave from the end user’s perspective.
Rather than focusing on testing the implementation of code, Behavior-Driven Development (BDD) aims to validate scenarios and behaviours. However, you may find some similarities with TDD. For example, you also follow the six steps described above to ensure that quality code is created.
The main difference between the two methods is how test cases are written. In BDD, not only the developers have to think about what they want to test. Developers, testers, and the product manager (or another business expert) come together, review each user story, and think about how to ensure the criteria of each user story are met. The team then writes down these examples in a specific language, such as Gherkin, which is a domain-specific language, created explicitly for writing behaviour descriptions. This language follows a specific syntax, which uses the Given, When, Then keywords to describe what should happen when in the application. Since you use a natural language, such as English, anyone can read and understand these specifications. Then, you use automation tools like Cucumber that enables you to execute the created specifications for testing.
For developers, a key advantage of BDD is that they do not have to rewrite tests each time they rewrite their code. That’s because BDD is not focused on the code but on the behaviour of the app. Anyone involved in the process can understand and process the test cases because of the non-programmatic language. Individuals, such as business experts, can ensure that they communicate the key aspects of effective application behaviour. By discussing requirements, collaboration becomes more enjoyable, and everyone involved can work towards the common goal.
Benefits of Behavior-Driven Development Approach
- Strong collaboration. With BDD, all the involved parties have a strong understanding of the project and they can all have a role in communication and actually have constructive discussions. BDD increases and improves collaboration. It enables everyone involved in the project to easily engage with the product development cycle. And by using plain language, all are able to write behaviour scenarios.
- High visibility. By using a language understood by all, everyone gets strong visibility into the project’s progression.
- The software design follows business value. In fact, BDD puts great importance on the business value and needs. By setting priorities with the client, based on the value it provides, developers are able to provide a better result because they have a strong understanding of how the client thinks. By focusing on the value, no useless features are built.
- The ubiquitous language. As mentioned earlier, the ubiquitous language is understandable by all the members of the team, which reduces misconceptions and misunderstandings and makes it easier for new members to join the working process.
- Software development meets the user needs. By focusing on the business’s needs, you get satisfied users, and that implies a happy business, of course. With BDD, as its name says, you focus on the behaviour, which has a stronger impact than the implementation itself.
- More confidence from the developers’ side. Teams using BDD are in general much more confident that they won’t break the code and have better predictability when it comes to their work.
- Lower costs. By improving the quality of the code, you are basically reducing the costs of maintenance and minimizing the project’s risks.
How is BDD Different From TDD?
Many think that BDD and TDD are the same and many are confused about what is what. When we talk about TDD, we talk about a set process. You are basically using automated unit tests in order to give the developers a direction on how to design the software. BDD can be seen as a set of best practices for writing great tests.
I would say that the biggest difference is that in behaviour-driven development, you write test cases in a natural language that non-programmers are able to read. To express the purpose of a code, the developers combine their native language with the ubiquitous language of DDD (Domain Driven Design).
Instead of coding the functions, you tell the code exactly what you want it to do by using a style that is closer to our way of writing sentences. You get a clearer understanding of what the system should do from the perspective of the developer and the customer while TDD only gives the developer an understanding of what the system should do.
That means that BDD enables the developers and the customers to work together on the requirements analysis that is contained within the source code of the system. Therefore BDD becomes quite helpful when it comes to communicating with all the members of a cross-functional product team.
Instead of having tests that are only helpful for engineers, you have a test that helps all. It improves the collaboration between the parties and enables developers to get a clearer scope of the features that are required and the customer get a better idea of what will be delivered, with realistic estimates.
BDD directly influences the design of the software, while TDD focuses on testing. So we can say that TDD focuses on the implementation aspect of the system while BDD, as its name says it, focuses on the behavioural aspect of the system. The priority is not about how it will be implemented but more about what will the user be able to do and what he will be able to see.
So which is better? None. They should be used together!
How does BDD help in SDLC?
In order to explain the real purpose of this methodology, and how it came to be, we first must understand what it’s not. BDD was built as an alternative to the traditional waterfall method in order to better support agile development.
In the waterfall model, testing starts once the development work is completed. This structured and rigid approach doesn’t allow for alterations or changes until the testing phase has been finalized, which slows down the development process considerably.
When we look at the teams who are currently using BDD, most of them have gone through a similar process. Their organization decides that they need to go to market faster and, therefore, accelerate releases. After some consideration, they decide to go agile through the means of sprints, scrum, or the like.
Then, after some time, they realize that testing has become the bottleneck of their agile efforts as QA struggles to keep up with this accelerated pace. Therefore, they finally decide to seek continuous testing through test automation.
Even though this decision will most probably improve the current state of the project in some way or another, there are two key issues that will arise throughout this last agile implementation to the software development process:
- How aligned is development and QA at this development speed?
- How can they make sure that they are building what the customer wants?
The common denominator in the answers to these questions is collaboration, and BDD facilitates just that.
How to Implement BDD?
The key to BDD is to write executable acceptance tests that are adept at describing the application’s expected behaviour across a range of potential use-case scenarios. This methodology ensures that the developers not only write testable code, but also write code that adheres to the functional requirements of the application.
There are three stages of working with BDD:
- A business analyst, or other team members with specific business domain expertise, lists the expected behaviour in a feature file that they share with development teams.
- Developers then write code that implements those expected behaviours. They follow up with test code that they will use to verify that behaviour against the required business logic to ensure it meets business-side needs.
- Finally, testers review the application, verifying those tests against the expected behaviour documented in feature files and the BDD code created by the developers.
When gathering requirements in BDD, it’s important to follow the Given-When-Then formula. This formula breaks down behaviour into three steps:
- Given defines the preconditions for certain behaviour.
- When denotes when a specific application event may occur.
- Then deals with the outcome of the test when preconditions are matched against the event.
These steps are parsed and executed by the BDD framework, sometimes referred to as automated acceptance tests.
Popular BDD framework tooling
In microservices applications, business logic can span through several services. All these services get tested against business processes to verify the expected behavior. Microservices testing is a difficult task without the aid of BDD tools. Some top options include Cucumber, Gauge and JBehave.
Cucumber. Cucumber is an open-source testing BDD framework that enables developers to write specifications in Gherkin, which has an English-like syntax approach. The language allows anyone — from other developers to business analysts — to easily read and understand the information. Cucumber supports several programming languages, including Ruby, Java and .NET, as well as software platforms like Ruby on Rails, Selenium and Spring Framework.
Gauge. Gauge is a cross-browser, open-source test automation framework. When working with Gauge, developers are not restricted to a specific language or tool. Like Cucumber, it works with multiple programming languages, and there is no need to learn a new language to prepare your test automation platform. The gauge also integrates with several integrated development environments and continuous integration servers, including IntelliJ and Jenkins.
JBehave. JBehave is an open-source BDD framework designed for microservices testing and Java-based development. While JBehave is relatively restricted to Java implementations, it still offers a wide array of customization options for developers to configure their BDD tests. It also comes with notably thorough and easy-to-understand documentation.
What is Acceptance Test-Driven Development (ATDD)?
Acceptance Test-Driven Development, or ATDD, is a software development methodology, often associated with agile methodologies, that fosters collaboration between developers, testers and business stakeholders, and in which test automation plays a major role.
As its name suggests, ATDD is related to TDD, or Test-Driven Development. It also has similarities with approaches such as SBE (Specification by Example) and BDD (Behavior-driven development.) Throughout the article, you’ll understand the similarities and differences between these approaches.
Let’s start by telling you what ATDD is not. It’s not a testing technique, despite what its name might suggest. Instead, acceptance test-driven development is a programming technique. Similarly to its “cousin” TDD, ATDD puts test automation front and centre. When adopting it, teams will use automated test cases to drive the development of the production code.
- ATDD is extended on TDD (Test Driven Development) which gives emphasis on developers, testers, and business collaboration and it is a test-first approach. Also, ATDD is very much similar to the BDD (Behavior Driven Development) but there is a small difference between them i.e. BDD mainly focuses on the behaviour of the system while ATDD focuses on the actual requirements of the customer.
- Some tools which are used for ATDD are TestNG, Spectacular, FitNesse, EasyB, Concordian, Thucydides, etc.
Benefits of ATDD :
- Gives a better clarification on the requirements.
- Faster resolution of problems/issues.
- Improves collaboration between cross-team members.
- More focus on customer needs.
- Acts as a guideline for the entire development process.
- Easier to manage.
TDD vs BDD vs ATDD – What to Go For?
Now let’s talk about their relationship and relevance to agile teams. Depending on what you need, you may not have to stick to one method. Instead, you can use a combination of all three or only pick the best fitting parts of each. Most times, agile teams don’t apply methods by the book and tailor them to their needs. If possible, do what works best for you and your team, not what a specification dictates.
Let’s look at some ways you can integrate the methods into your agile team.
The Power of Combining TDD and ATDD
Of course, you could use either TDD or ATDD. However, the benefits of bringing them together are straightforward to comprehend. While TDD requires unit tests, ATDD uses acceptance tests. In other words, when you combine TDD and ATDD, you are creating low-level and high-level tests for your application. To develop and release robust, high-quality applications, you need tests at different levels. Use TDD to make sure your code is working, and to achieve 100% test coverage. ATDD helps you ensure the app’s behaviour is spot-on and leaves a good impression on your customers.
How Can You Use BDD and ATDD Together?
You’ve probably noticed that ATDD and BDD are super similar, and some industry experts even use the terms synonymously. However, the most crucial component of BDD isn’t the tools but the conversations you have around your app’s requirements! On the other hand, ATDD is more developer-oriented than BDD – just like TDD. To improve your application’s quality, you should bring together the three amigos: business, dev, test. Make sure they are all on the same page and know the requirements of the app. Again: Communication is vital for agile teams and BDD! If it makes sense for your workflow, make use of BDD’s Given-When-Then syntax to create test cases in your natural language. Create acceptance tests to make sure, the system performs as expected in certain situations.
It’s Not About TDD vs BDD vs ATDD – Think About How You Can Use Them Together to Your Advantage
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, have conversations, making sure everyone can contribute to the app’s quality by sharing their specific insights. As a result, your application fulfils 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.