TickSpec is a lightweight Behaviour Driven Development (BDD) framework on CodePlex:
- “Tick” because it supports F# ``Tick`` methods (*) (as well as C# annotated methods)
- “Spec” because it parses plain text Specifications
- “Lightweight” as it is currently implemented in a single F# file with <200 LOC
- “BDD” as you can describe the software’s behaviour using a subset of the Gherkin language
- “Framework” as it is simply a library
- “CodePlex” so that it can be used by the community
(*) ``F# methods`` delimited with double backtick characters
Why BDD?
BDD, originally named by Dan North, is an Agile technique that can help deliver real customer value for LOB applications.
Lest we forget, the Agile Manifesto recommends valuing:
Customer collaboration over contract negotiation
By defining executable scenarios with natural language, BDD encourages collaboration between Developers, QA and Business Participants. This differs from TDD, where unit tests are limited to being readable only by developers. More info:
Agile software development also favours:
Working software over comprehensive documentation
By focusing on writing executable scenarios in a natural language, BDD helps build good enough living documentation.
Why F#?
For the framework, F# features such as pattern matching, particularly active patterns, combined with regular expression support make writing a text parser and state machine pretty easy.
Consumers of the framework use step definitions as methods that are mapped to lines in the specification text file. In C# typically methods are annotated with attributes describing a regular expression to match the line, with the method name repeating the annotation. By escaping methods in F# with double ticks, spaces and regular expression characters can be used directly, avoiding the duplication.
In his F# Fundamentals article for MSDN Magazine, Luke Hoban claims:
F# is in many ways a higher-level language than C#
it means F# developers can often solve problems and think about their programs at a higher level, closer to the domain of the problem at hand.
A higher level language may be more appropriate for writing acceptance tests. Ben Hall writes in his article Automate Acceptance Tests with IronRuby again for MSDN magazine:
I think you can justify the context switching (between IronRuby and C#) in order to take advantage of the readability and the more natural way of writing the verifications and scenarios
In the end, integrating acceptance testing into the development process can be a hugely positive step for a development organization.
I would assert that F# is similar to IronRuby in its expressiveness, but has an advantage in being a first class language within Visual Studio 2010. I would recommend looking at acceptance tests in F# as a way to introduce the language inside an organization. See Zach Bray’s talk on Automating Acceptance Testing with F# at Skills Matter to learn more.
Gherkin feature example
Feature: Refunded or replaced items should be returned to stock
Scenario 1: Refunded items should be returned to stock
Given a customer buys a black jumper
And I have 3 black jumpers left in stock
When he returns the jumper for a refund
Then I should have 4 black jumpers in stock
F# Step Definitions
let [<Given>] ``a customer buys a black jumper`` () = ()
let [<Given>] ``I have (.*) black jumpers left in stock`` (n:int) =
stockItem <- { stockItem with Count = n }
let [<When>] ``he returns the jumper for a refund`` () =
stockItem <- { stockItem with Count = stockItem.Count + 1 }
let [<Then>] ``I should have (.*) black jumpers in stock`` (n:int) =
let passed = (stockItem.Count = n)
Debug.Assert(passed)
Why TickSpec?
Right now TickSpec is intended as a lightweight framework to get you started with BDD using F#. It is standards based, supporting a subset of the Gherkin language, so should be easy to change to another Gherkin based framework like Cucumber, SpecFlow or StorEvil.
Finally
The Agile Manifesto values:
Individuals and interactions over processes and tools
A BDD framework helps automate the execution of scenarios. But don’t forget, the real value in BDD comes from greater customer collaboration.