- NBehave
- NSpecify
- StoryQ
- NSpec
- Spec#
- MSpec
It's still early days, so I haven't decided on a library yet.
One possibility is the StoryQ story definition library. It isn't a runner, but uses your existing test runner as you define your specs within a test.
[Test]
public void ExecutorRunsTests()
{
var story = new Story("Running a test script");
story.AsA("tester")
.IWant("to run a test script")
.SoThat("I can verify the release meets the acceptance criteria")
.WithScenario("A passing test script")
.Given(() => ThereIsATestFileWithASinglePassingTest())
.When(() => TheTestIsRun())
.Then(() => TheTestPassShouldBeReported())
.And("report no failures or errors")
.WithScenario("A failing test script")
.Given(() => ThereIsATestFileWithASingleFailingTest())
.When(() => TheTestIsRun())
.Then(() => TheTestFailureShouldBeReported())
.And("report the failure")
.WithScenario("An erroring test script")
.Given(() => ThereIsATestFileWithASingleErroringTest())
.When(() => TheTestIsRun())
.Then(() => TheTestErrorShouldBeReported())
.And("report the error")
;
story.Assert();
}
The Statements can be written as
Given(() => ThereIsATestFileWithASingleErroringTest())
or .Given("There is a test file with a single erroring test")
This allows you to start by defining them as strings and later go back and introduce the code. This makes the development feel bite sized and focused.
To help with this I wrote a simple VBA Macro to convert from text to a lambda method. It also converts back, but it's not perfect as ToUpper is a lossy operation, but it's good enough.
You can grab the macros here.