For those that don't understand what BDD is and even those that do, I want to walk you through what I've learned over the last year. I want to give you an alternative narrative to the stuffy version on wikipedia and the dated top ranked Google results which offer breadcrumbs to understanding but didn't give me the clarity I was looking for.
Let's look at the two line summary Dan North gave last year,
BDD is a second-generation, outside-in, pull- based, multiple-stakeholder, multiple-scale, high-automation, agile methodology. It describes a cycle of interactions with well- defined outputs, resulting in the delivery of working, tested software that matters.Get it? Neither did I when I first read it. After doing a lot of research, investigation and experimentation I finally get it. Now that I do, that two line definition is an excellent summary. There's a lot of information packed into those sentences. We won't try to drill into all of that here. Let's start with the simple building blocks of the BDD process.
It starts with a story
BDD is firmly rooted in the agile universe. It relies on a lot of the mechanisms and practices you find in agile processes. The first and most important is the practice of capturing user requirements as stories. I'm not going to spend time in this post defining what a story is but let's just use an example we can refer to.
In order to build readership of the blogThis is the first step in BDD, the first tangible piece of the process. Your stakeholder(s) and your agile group develop stories.
As a blog reader
I want to leave comments
Create examples/scenarios
You have your story. Take that story and imagine (realistic) scenarios of it in practice. Who it is that generates the scenarios may be multiple people. Your scenarios are your acceptance criteria. They tell you when the story is done.
Here are some samples of scenarios based on the above story. (Remember, for this story, we're in the context of a reader of the blog and their desire to leave comments.) The scenarios are written using the Given-When-Then format for describing scenarios.
Given a blog entryYou can see how there would be numerous scenarios and contexts of users of your application. When generating your scenarios, you must take them all into account.
When I write a comment
And I submit the comment
Then I should see my comment under the blog post
Given a blog entry
And the blog entry is no longer accepting comments
When I view the blog entry
Then I should not be allowed to write a comment
You're just about to write code but...AUTOMATION!
Any good development environment should be as automated as (in)humanly as possible. With a few quick commands/scripts you should be able to build your app, build your DB (if you have one), execute tests, deploy the app, and run it. The more you have to do manually the harder this whole thing is.
Also, you should be able to run this in isolation on your workstation, if possible. If your app is sharing a DB with 5 other workstations in your department, chances are you're going to have collisions. You won't be able to make predictable tests and you'll be stepping on each others' toes.
When you write your code you want to be continuously running tests. This should be a push-button activity that does not derail you for several minutes. If it is then analyze what it is that you're doing and see if you can find ways to streamline it. Either through tooling or through eliminating deficiencies in your testing strategy.
Outside-in: It's time to TDD
In BDD, we do things outside-in. Meaning, you start at the level of the user's interaction with your application and then you build downwards. It's a huge shift for a lot of people. I haven't been doing it for very long but it's not a huge departure if you were already doing TDD. Most of my difficulty was just learning how to automate UI interactions.
Here is where the rubber (finally) meets the road. You have a story, you have some scenarios of your story that crystallize your acceptance criteria, and you have an automated development environment that allows you to build and test your app rapidly.
Using the story and scenarios from this blog post, we can write our first lines of code. But...I'm not going to do that here. I have a separate blog post (it certainly deserves its own) coming that will walk through the TDD process under the BDD umbrella. I'll update this post to refer to it once it's done.
In summary
- Write user stories
- Create scenarios based on the stories
- TDD those stories starting at the top level of your application (typically a UI) and keep developing downwards until it's functionally complete
The mystical cloak of BDD has now been removed!
DISCLAIMER: This was meant to be a high level, entry level explanation of BDD because I have rarely seen it simplified. Most information I've found online, the explanation seems to be a deep dive into how to write stories, stakeholder interaction, how DDD dictates the ubiquitous language, how it's the natural evolution of TDD (without ever showing you how!), and a variety of other entirely relevant information. The problem is that there's a lot of cognitive overload.
In other words, for BDD enthusiasts, or developers in general because we like to be intellectual, don't dog me out and poke holes in my examples. It's horribly contrived, I readily admit I am still learning these concepts and I don't believe anything I've written is incredibly misleading.