After listening to .Net Rocks with Scott Millett this week I felt a renewed enthusiasm for trying out some BDD. I downloaded Specflow and got straight on with the screen cast they have on their website. The video acts as a good introduction into how to get up and running in Specflow. Interestingly it also gave me a better insight into how bowling works. I have never really thought about it. I normally just wang the balls down the lane until the game is over!
Specflow introduces the idea of writing the specification first. It uses a specific language called Gherkin which comes from Ruby land. You will need NUnit installed as well. An example of it is:
[edit: NUnit is what I have used up to now but Specflow is compatible with other testing frameworks aswell. See the comments section below.]
In order to have a strong password
As a new user or existing user changing my password
I need to check if my password is alphanumeric and is greater than 6 characters
Scenario: Password only comprises of characters
Given I have entered "nottinghamforest" as my new password
When I press save
Then the system should reject the password
And say "The password must be alphanumeric and greater than 6 characters"
It's a fairly straight forward language. Although I really want to use it for a new asp.net mvc project I have in mind and I am not quite sure how to write out features and scenarios for things like "The user clicks on the drivers link and can then view a list of current drivers on the system...". I am currently cruising the Google Group for Specflow though and have spotted a couple of examples that might help me. I have previously been doubtful of Specflow and this specification malarky before, favouring just writing unit tests in a certain way instead. For example WhenCreatingANewPassword.ThePasswordMustBeAlphaNumeric. However after messing about with this for 2 days I can really see where this might come in useful.
I had a go at my own clean version of BDD using Specflow by making a very simple password strenght checker project. The winning thing about it? I wrote the spec on my netbook in notepad++ last night whilst watching Terminator 2. No coding was done. I then brought it into work this morning, put the feature file in. Added the steps file (which was very short because I reused them with regex helpers) and then implemented what I needed to do. I could really see the benefit if you had a client that had a domain expert that was also a bit of a power user. They could easily get into the rythm of writing / amending features for your project.
I have uploaded it to GitHub (which is also a first for me!). So you can check it out there.