有没有办法像Gherkin中的场景大纲一样创建smth,为多个值执行而不重新启动场景?

时间:2017-06-13 15:16:58

标签: c# unit-testing specflow gherkin

我是测试设计师,我正在创建.feature文件。 我们使用的是Visual Studio + Specflow,代码是用C#编写的。

我有以下测试用例:

Background:
   Given something
   And something
   And something

Scenario: Scenario name
   When I set the 'X' value' in the Y field
   Then The 'X' value is displayed in 'Somewhere'

我的问题是: 我需要检查20个值。 但是如果我将Scenario Outline与例子一起使用,那么它将从一开始就为每个' X'我使用的价值,每次都会执行所有Givens。

这将需要很长时间,测试非常简单,并且在运行背景后为每个值运行When + Then组合可能足以用于测试目的。

有没有办法在不使用场景大纲的情况下检查Gherkin中的多个值,是否可以多次运行When和Then组合来检查每个值?

感谢对此事的任何帮助

2 个答案:

答案 0 :(得分:0)

您可以使用数据表作为输入,并以解析数据表的方式实现您的步骤。然后,您可以对每个表元素执行断言。 SpecFlow DataTables Documentation

Given I test the following outcomes
| value | field  | display_location |
| X     |   Y1   | Somewhere        |
| y     |   Y2   | Somewhere Els    |

通过使用实例变量来保存测试值,您可以在数据集的其他步骤中执行操作和验证。

答案 1 :(得分:0)

您有两个步骤 - 一个用于为字段设置一些值,另一个用于检查某个字段是否已赋值:

[When(@"I set the '(.*)' value in the (.*) field")]
public void WhenISetTheValueInTheField(string value, string field)
{
   // ...
}

[Then(@"The '(.*)' value is displayed in (.*) field")]
public void ThenTheValueIsDisplayedInField(string value, string field)
{
    // ...
}

使用Specflow,您可以从Step Definitions调用步骤。所以基本上你需要一个高级步骤来解释你的高级意图 - 验证所有给定的输入值是否正确显示。要传递值和验证数据,您可以使用表格:

Then all input values are displayed correctly:
| InputValue | InputField | DisplayedValue | DisplayField  |
| X          | Y          | X              | Somewhere     |
| Z          | Y          | Z              | SomewhereElse |

在此步骤中,您可以为每组数据调用已有的步骤:

[Then(@"all input values are displayed correctly:")]
public void ThenAllInputValuesAreDisplayedCorrectly(Table table)
{
    foreach (var row in table.Rows)
    {
        var inputValue = row["InputValue"];
        var inputField = row["InputField"];
        When($"I set the '{inputValue}' value in the {inputField} field");

        var displayedValue = row["DisplayedValue"];
        var displayField = row["DisplayField"];
        Then($"The '{displayedValue}' value is displayed in {displayField} field");
    }
}

这里的好处是,除了高级步骤之外,您将在输出中看到每个步骤及其参数。