自动生成Specflow Scenario Outline中的示例范围

时间:2017-08-22 08:49:50

标签: cucumber specflow

在Specflow中,虽然我知道Scenario Outline / Examples功能,但我想知道是否有更优雅的方法来生成测试用例中使用的范围和组合?

例如,在vanilla NUnit中,我可以使用GeocoderTestCaseSource构建一个生成器,我可以将大量测试用例输入到测试中。

private static readonly IEnumerable<int> Numbers = Enumerable.Range(1, 50);

[TestCaseSource(nameof(Numbers))]
public void TestFoo(int number)
{
    // Test goes here.
}

目前,在我的测试中,我需要手动创建Examples中的所有排列,这些排列很难阅读,并且可能容易出错。

Scenario Outline: Count things
    Given I'm playing a game of counting
    When I count to <number>
    Then the highest number I should have counted to should be <number>

    Examples:
        | number|
        | 1    | 
        | 2    | 
        | 3    | 
        ...
        | 50    | 

我真正希望能做的是

Examples:
    | number| : Range 1 to 20

更好的是,制作两套笛卡尔积,即:

Examples:
    | number1| : Range 1 to 20
    | number2| : Range 5 to 10

// i.e. 20 x 5 = 100 combinations of the tuple (number1, number2)

无论如何我在Specflow中更优雅地接近它?

2 个答案:

答案 0 :(得分:1)

您可以从两个输入中动态生成数字范围作为一个步骤。

例如:

Scenario Outline: Count things
    Given I'm playing a game of counting
    When I count from <First Number> to <Last Number>
    Then the highest number I should have counted to should be <Last Number>

    Examples:
        | Description        | First Number| Last Number |
        | Count from 1 to 20 | 1           | 20          |
        | Count from 5 to 10 | 5           | 10          |

然后When步骤可以定义为:

[When("I count from (\d+) to (\d+)")]
public void ICountFromFirstNumberToLastNumber(int firstNumber, int lastNumber)
{
    IEnumerable<int> numbers = Enumerable.Range(firstNumber, lastNumber);
    this.countResult = this.Count(numbers);
}

答案 1 :(得分:0)

Cucumber不是为进行此类测试而设计的。当你在讨论时,每个场景的运行时间要比编写好的单元测试慢一个或多个数量级。因此,生成大量场景会使您的测试套件无法使用。

Cucumber就是使用场景创建一些基本的交互来推动某些功能的开发。它不是一个测试工具!

要彻底测试功能的某些方面,请继续使用单元测试。