I wrote a lot about NaturalSpec in my last articles. This time I will show how we can use parameterized scenarios.
1. Using predefined scenarios
By writing predefined parameterized scenarios we can easily create a scenario suite with lots of different test cases:
// predefined scenario let factorialScenario x result = Given x |> When calculating factorial |> It should equal result [<Scenario>] let When_calculation_factorial_of_1() = factorialScenario 1 1 |> Verify [<Scenario>] let When_calculation_factorial_of_10() = factorialScenario 10 3628800 |> Verify
If we run these scenarios with NUnit we will get the following output:
Scenario: When calculation factorial of 1
– Given 1
– When calculating factorial
=> It should equal 1
==> OK
==> Time: 0.0093s
Scenario: When calculation factorial of 10
– Given 10
– When calculating factorial
=> It should equal 3628800
==> OK
==> Time: 0.0018s
2. Using the ScenarioTemplate attribute
The second and shorter option is to use the ScenarioTemplate attribute, which is inherited from NUnit’s new TestCase attribute:
// with ScenarioTemplate Attribute [<ScenarioTemplate(1, 1)>] [<ScenarioTemplate(2, 2)>] [<ScenarioTemplate(5, 120)>] [<ScenarioTemplate(10, 3628800)>] let When_calculating_fac_(x,result) = Given x |> When calculating factorial |> It should equal result |> Verify
This code will create 4 different scenarios, which NUnit will display and report separately:
3. Using ScenarioSource
The third option is to use the ScenarioSource attribute. Here we define a function which generates TestData:
/// with a scenario source let MyTestCases = TestWith 12 3 4 |> And 12 4 3 |> And 12 6 2 |> And 1200 40 30 |> And 0 0 0 |> ShouldFailWith (typeof<System.DivideByZeroException>)
And then we have to tell NaturalSpec which TestData a scenario should use:
[<Scenario>] [<ScenarioSource "MyTestCases">] let When_dividing a b result = Given a |> When dividing_by b |> It should equal result |> Verify
Summary
Sometime it makes sense to test a scenario with a bunch of different parameters. We can use the ScenarioTemplate attribute to easily parameterize our scenarios. If we want more flexibility we can use predefined scenarios with custom parameters or the ScenarioSource attribute.
Tags: F#, NaturalSpec, nunit, ScenarioTemplate, TDD