Update: this blog is no longer active. For new posts and RSS subscriptions, please go to http://saintgimp.org.
One of the first sessions at the Alt.Net Seattle conference was one on Behavior-Driven Development, or BDD. Actually, we had three suggested sessions all related to BDD that we combined into one session, which was probably a bit of a mistake in hindsight because we had a couple different groups of people looking for different things (BDD at the unit test level vs. BDD at the acceptance test level), which caused a bit of controversy.
I think that at the unit test level, BDD really isn’t that different than normal TDD that we all know and love. All it really brings to the table is a strong emphasis on the arrange-act-assert structure and an even stronger emphasis on the behaviors you’re trying to build in your code rather than the mechanics of the code itself. In other words, BDD asks that you think in terms of what the user wants to do and how you’re going to enable them to do it. You give clear, explicit names to each scenario that you need to implement and you also give clear names to each expectation that you have for the scenario. The overall point is simply to write tests that people can actually read.
Anyway, Charlie Poole (one of the developers of NUnit) made a comment to the effect of, “Well, I’ve been doing that sort of thing in my unit tests for years already. Why do we even have to have a special name for this?” I also noticed a lot of other people asking things like, “Well, what about SOLID principles? Do they still apply? How about mocking frameworks or IoC containers? Can I still use those?”
This confusion is really unnecessary, and Charlie’s right: it’s unfortunate that we even have a name for it that makes it sound like it’s something different than TDD. At least at the unit test level, BDD is not a brand new way of writing tests. It’s just the same old red-green-refactor workflow that we’ve always used; just with a stronger emphasis on expressing customer-oriented intentions so that when other developers have to pick up your code and maintain it later, they’ll know why your tests exist, what user value they map to, and when they break, it’ll be obvious what needs to be fixed. You still use all the same state-based and interaction-based testing techniques in your tests and the same SOLID principles in your product code. Nothing changes.
Relax – it’s not that complicated.