The Test Anything Protocol (TAP) is a text-based protocol for test results:
ok 1 - Input file opened
not ok 2 - First line of the input valid
ok 3 - Read the rest of the file
not ok 4 - Summarized correctly # TODO Not written yet
Over the last week or so I’ve created a TAP runner F# script for NUnit test methods. It supports the majority of NUnit’s attributes including ExpectedException, TimeOut and test generation with TestCase, TestCaseSource, Values, etc., .
The runner can be used in a console app to produce TAP output to the console or directly in F# interactive for running tests embedded in a script.
Tests can be organized in classes:
type TAPExample () =
[<Test>] member __.``input file opened`` () = Assert.Pass()
[<Test>] member __.``First line of the input valid`` () = Assert.Fail()
[<Test>] member __.``Read the rest of the file`` () = Assert.Pass()
[<Test>] member __.``Summarized correctly`` () = Assert.Fail()
or in modules:
let [<Test>] ``input file opened`` () = Assert.Pass()
let [<Test>] ``First line of the input valid`` () = Assert.Fail()
let [<Test>] ``Read the rest of the file`` () = Assert.Pass()
let [<Test>] ``Summarized correctly`` () = Assert.Fail()
type Marker = interface end
Note: the marker interface is used to reflect the module’s type.
In the console test cases are marked in red or green:
If you create an F# Tutorial project you get both, an F# script file that runs as a console application allowing you to set breakpoints in your script with the Visual Studio debugger.
When I’m prototyping a new feature I typically use the F# interactive environment for quick feedback and to do exploratory testing. The TAP runner lets you create and run NUnit formatted tests directly in the script file before later promoting to a full fat project for use in a continuous build environment.
Interested in learning more about F# scripting, pop along to the Phil Nash’s talk at the F#unctional Londoners tonight.