6

所以我已经使用 specflow 一段时间了,有些事情一直困扰着我。

这是我们当前使用的场景示例:

Scenario: Select a region via selection button
    When I select "Scotland" from Available Regions
    And I click on the "Select One" button
    Then Available Regions does not contain "Scotland"
    And Selected Regions contains "Scotland"

是否有避免在几乎每条线路上都说“苏格兰”的方法?或者它是否使它更具可读性,我应该坚持下去?

4

4 回答 4

7

在我尝试回答您的问题之前,我建议您花点时间阅读一下 Dan North 的Who's domain is it Anyway

所以首先我想去掉那一行And I click on the "Select One" button,因为我认为这应该是隐含的一部分When I select "Scotland" from Available regions

现在你有

Scenario: Select a region 
    When I select "Scotland" from Available Regions
    Then Available Regions does not contain "Scotland"
    And Selected Regions contains "Scotland"

你可以把它写成

Scenario: Select a region 
    When I select "Scotland" from Available Regions
    Then Available Regions does not contain the last selected region
    And Selected Regions contains the last selected region

有很大的不同吗?好吧,可能不是。

随着我花更多时间在 cucumber 上,我发现它有助于重构场景,就像重构场景背后的代码一样。在 C#/SpecFlow 我们可以实现

    Then Available Regions does not contain "Scotland"

    [Then("Available Regions does not contain (.*)")]
    public void ThenAvailableRegionsDoesNotContain(string region)
    {
        AvailableRegions.Contains(region).ShouldBeFalse();
    }

    Then Available Regions does not contain the last selected region

    [Then("Available Regions does not contain the last selected region")]
    public void ThenAvailableRegionsDoesNotContainLastSelectedRegion()
    {
        ThenAvailableRegionsDoesNotContain(LastSelectedRegion);
    }

老实说,这取决于你。你喜欢哪种方言

于 2012-09-18T17:58:52.737 回答
2

有趣的例子!

正如其他人所说,通常建议在您的场景中避免实施细节 - 这就是步骤定义的用途。但是你已经知道了。

然后我要问的问题是:你要向谁证明这种行为?谁有兴趣断言您可以通过正式测试单击按钮或双击?如果您的答案不是“没人”,那么这可能适用:

“当这个场景被写出来时,你可以想象利益相关者可能不太在乎......一旦我们开始引入选项......细节......突然变得有趣......

在这一点上,我希望这个场景会增加一些更细粒度或更低级别的场景,每个场景都描述了我们支持的不同 [选项]。这些新方案将针对不同的利益相关者。"

来自 Dan North 的“这到底是谁的领域?”的评论。

也许您希望以两种形式编写场景:一个更高级别的只是演示用户可以为业务人员选择区域(如何不重要),另外两个用于显示不同选项的不同利益相关者。

所以,一旦你决定你所做的事情值得的,我可能会重复“苏格兰”(一个单一值的表在这里是多余的)。

稍微不同的是,我还建议:

Then Available Regions should not contain "Scotland"
And Selected Regions should contain "Scotland"
于 2012-09-27T09:25:47.163 回答
2

我建议修改这个场景的标题。“选择一个地区”并没有真正告诉你,从这个例子中可以期待什么。它可能是当您选择一个区域时触发的一些复杂行为,或者是一个微小的 UI 细节,例如所选区域从可用区域移动到所选区域列表。

如果我正确理解了您的示例,则为后者,因此我建议使用如下标题:

Scenario: Selected region should be moved from available to selected regions

拥有更具表现力的标题具有恕我直言的优势:

1) 当您正在寻找某个细节时,您可以更快地在活文档中导航并找到相关示例:阅读富有表现力的标题总是比阅读整个示例并逆向工程其意图更快。

2)对于更复杂的场景(这个例子似乎不是),一个表达场景意图的富有表现力的标题有助于读者更快地理解场景的细节。

为了使场景更有趣,我会将断言合并为一个步骤,因为您实际上想要断言所选项目已从可用列表移动到所选列表:

Scenario: Selected region should be moved from available to selected regions
  When I select "Scotland" from "Available Regions"
  Then "Scotland" should be moved from "Available Regions" to "Selected Regions"

我认为这非常接近我在对话中向某人解释这个细节的方式。我不介意在这里重复“苏格兰”,尽管有些人可能更喜欢用“所选地区”替换“苏格兰”,正如 AlSki 已经指出的那样。这是一个品味问题,我通常会尝试听在关于场景的对话中使用了哪些实际单词,这应该总是在写下来之前发生。

作为一个小提示,我想提一下,我的印象是这是一个涉及相当低级 UI 细节的场景。当我选择一个特定区域时(如果选择一个区域有任何特定的业务相关性),我会更感兴趣,它有什么更高层次的影响。如果你真的想在场景中描述和自动验证这样一个低级 UI 细节,我会考虑在我如何描述场景时展示这一点:

Scenario: Selected region should be moved from available to selected regions list
  When I select "Scotland" from the "Available Regions" list
  Then "Scotland" should be moved from the "Available Regions" to "Selected Regions" list

当然,我现在只是假设您正在描述场景中列表的详细 UI 行为,因为您没有在原始场景中编写列表。如果不是关于 UI,即您所描述的内容,则应该对场景进行不同的表述以更好地表达这一点。

于 2012-09-30T09:44:51.140 回答
1

虽然我同意@AlSki 的观点,一些重构是个好主意,但您可以使用Examples语法多次使用相同的值:

Scenario Outline: Select a region
  Given do this "<value>"
  And do that "<value>"
  When we perform "<value>"
  Then we get "<value>"
Examples:
  | value    |
  | Scotland |

您还可以将多个条目添加到表中,以每次使用不同的值多次运行相同的测试:

...
Examples:
  | value    |
  | Scotland |
  | England  |
  | Wales    |

这是一个具有多个值的示例,它允许您执行以下操作:

Scenario Outline: Select a region
  Given do this "<value>" with "<area>"
  And do that "<value>"
  When we perform "<value>"
  Then we get "<result>"
Examples:
  | value    | area   | result |
  | Scotland | North  | 40     |
  | Scotland | South  | 100    |
  | England  | West   | 200    |
  | England  | North  | 180    |
于 2012-09-19T14:21:37.183 回答