I was introduced to SpecFlow a year or so ago by a friend of mine during a presentation at Agile Yorkshire. He described it as a tool for BDD and I was immediately struck by the revolutionary concept of human readable tests. It’s taken me a little time, some projects and many follow up questions but I feel I’m really beginning to grasp the power of this easy to use tool.
So what is it? SpecFlow is a framework which translates text into a series of steps which are compiled as a test.
This makes more sense with an example. Let’s say I’m the developing the software for a cash machine.
Given I have £150 in the bank When I withdraw £100 Then I should have £50 remaining in my account
SpecFlow will then generate three steps for you to implement.
[Binding] public class Bindings { [Given(@"I have £(.*) in the bank")] public void GivenIHaveInTheBank(int p0) { ScenarioContext.Current.Pending(); } [When(@"I withdraw £(.*)")] public void WhenIWithdraw(int p0) { ScenarioContext.Current.Pending(); } [Then(@"I should have £(.*) remaining in my account")] public void ThenIShouldHaveRemainingInMyAccount(int p0) { ScenarioContext.Current.Pending(); } }
I’ve filled these in quickly to give you an idea of how the process is intended to work.
[Binding] public class Bindings { private readonly CashMachine _cashMachine; public Bindings(CashMachine cashMachine) { _cashMachine = cashMachine; } [Given(@"I have £(.*) in the bank")] public void GivenIHaveInTheBank(decimal initialBalance) { _cashMachine.Balance = initialBalance; } [When(@"I withdraw £(.*)")] public void WhenIWithdraw(decimal withdrawlAmount) { _cashMachine.Withdraw(withdrawlAmount); } [Then(@"I should have £(.*) remaining in my account")] public void ThenIShouldHaveRemainingInMyAccount(decimal expectedRemainingBalance) { Assert.AreEqual(expectedRemainingBalance, _cashMachine.Balance); } }
Behind the scenes SpecFlow has built a test using your test framework of choice (MSTest, NUnit, XUnit or a variety of others). These tests can be run within Visual Studio as any other unit test. Here’s my scenario running in Resharper:
I think most people would be impressed by this. SpecFlow has converted human readable text and enabled us to write a simple unit test for it. We can easily add a second to make sure that our new state of the art cash machine can also dispense pennies.
Given I have £100.86 in the bank When I withdraw £1.99 Then I should have £98.87 remaining in my account
We can add additional complexity such as overdrafts
Given I have £100 in the bank And I have an overdraft of £50 When I withdraw £125 Then I should have £-25 remaining in my account
Or functionality to check that I cannot go overdrawn
Given I have £100 in the bank And I have an overdraft of £0 When I withdraw £125 Then I should be prevented from withdrawing money And I should have £100 remaining in my account
I’m sure you can see the value of having simple, understandable definitions of what a particular area of code should do instead of the complicated, developer-only Unit Tests which litter many of today’s solutions. If you wish these executable tests can form the basis of your specs, documentation and even training. Your Product Owner can get involved and validate the tests are correct, if they’re particularly tech-savvy they may even write a few themselves!
What I particularly love about SpecFlow however is the way it empowers today’s QAs. From the moment the first bindings have been created your QA team can be let loose to create new tests, verify edge cases and prove alternate scenarios until they are happy that the feature works as designed. Tests can now be created alongside the features being developed, Acceptance Tests can be created directly from the specification which the QA team can use to validate each feature and scenario as it is being developed. These same tests then form the basis of your regression suite for years to come.
Should any of these tests fail the QA team can provide the developer with not only the human readable replication steps but with with an executable test which can be debugged on the dev’s own PC.
I find this very exciting, we’ve started using SpecFlow for a number of projects and I have every intention of using it for more. If you’re interested in finding out more visit the SpecFlow website or read their Quick Start Guide.
Great to hear that you are enjoying working with SpecFlow.
You wrote:
I’m sure you can see the value of having simple, understandable definitions […] instead of the complicated, developer-only Unit Tests. […] These executable tests can form the basis of your specs, documentation and even training. Your Product Owner can get involved and validate the tests are correct, if they’re particularly tech-savvy they may even write a few themselves!
This makes me wonder if you’ve also taken a look at SpecLog (which is not open source btw). SpecLog is a visual project management tool that help bring techies and non-techies together. You can map out requirements visually, which provides a great basis for discussing requirements in the early stages of a project. You can add acceptance criteria to these requirements, and link the associated Gherkin files in your source repo. SpecLog is also able to access executions statistics from a SpecFlow server and display this information in your requirements. So you get the benefits of BDD as well as a repository that can be used to document your system – you can export your requirements and acceptance criteria to HTML, Word etc.
You can find out more on the website here: http://www.speclog.net/
I hope you don’t take this is pure marketing spam, I genuinely enjoyed reading through some of your articles, and thought that you might find SpecLog interesting.
LikeLike