使用SpecFlow进行功能范围的步骤定义?

时间:2010-05-31 12:50:02

标签: specflow

我正在使用SpecFlow进行一些BDD风格的测试。我的一些功能是UI测试,所以他们使用WatiN。有些不是UI测试,所以他们没有。

目前,我有一个StepDefinitions.cs个文件,涵盖了我的所有功能。我有一个BeforeScenario步骤来初始化WatiN。这意味着我的所有测试都会启动Internet Explorer,无论他们是否需要它。

SpecFlow中是否有任何方法可以将特定的特征文件与特定的步骤定义集相关联?或者我是从错误的角度接近这个?

6 个答案:

答案 0 :(得分:29)

如果您使用标签,则可以使用简单的解决方案。

首先标记您的要素文件,以指示特定要素需要WatiN:

Feature: Save Proportion Of Sample Pool Required
  As an <User> 
  I want to <Configure size of the Sample required> 
  so that <I can advise the deployment team of resourcing requirments>.

  @WatiN
  Scenario: Save valid sample size mid range
  Given the user enters 10 as sample size
  When the user selects save
  Then the value is stored

然后使用指示标记的属性装饰BeforeScenario绑定:

[BeforeScenario("WatiN")]
public void BeforeScenario()
{
  ...
}

这个BeforeScenario方法只会针对使用WatiN的功能进行调用。

答案 1 :(得分:15)

目前(在SpecFlow 1.3中)步骤定义是全局的,不能限定为特定功能。

这在设计上与Cucumber具有相同的行为。

我在黄瓜组问了同样的问题:

http://groups.google.com/group/cukes/browse_thread/thread/20cd7e1db0a4bdaf/fd668f7346984df9#fd668f7346984df9

基线是,所有要素文件定义的语言也应该是全局的(整个应用程序的一个全局行为)。因此,应避免对特征进行范围定义。就个人而言,我还不完全相信这一点......

但是,仅针对需要UI集成的场景启动WatiN的问题可以通过两种不同的方式解决:

答案 2 :(得分:8)

检查一下(SpecFlow 1.4中的新功能):https://github.com/techtalk/SpecFlow/wiki/Scoped-Bindings

答案 3 :(得分:3)

我最初假设步骤文件与特定功能文件相关联。一旦我意识到这不是真的,它帮助我改进了我的所有SpecFlow代码和功能文件。我的特征文件的语言现在减少了上下文,这导致了更多可重用的步骤定义和更少的代码重复。现在我根据一般的相似性来组织我的步骤文件,而不是根据它们的功能。据我所知,没有办法将步骤与特定功能相关联,但我不是SpecFlow专家,所以不要相信我的话。

如果您仍想将步骤文件与特定功能文件关联,请为它们指定相似的名称。即使步骤代码仅对该功能有意义,也不需要强制它仅适用于该功能。这是因为即使您碰巧为不同的功能创建了重复步骤,它也会将其检测为模糊匹配。可以在App.config文件中指定不明确匹配的行为。看到 http://cloud.github.com/downloads/techtalk/SpecFlow/SpecFlow%20Guide.pdf 有关App.config文件的更多详细信息。默认情况下,检测到模糊匹配并将其报告为错误。

[编辑]: 实际上以这种方式工作存在问题(仅在您的脑海中具有与特征文件相关联的步骤文件)。当您添加或修改.feature文件并使用之前使用的相同措辞时,问题就出现了,而您忘记为其添加一个步骤,但是您没有注意到这一点,因为您之前已经为该措辞创建了一个步骤,它是以上下文敏感的方式编写的。此外,我不再相信不将步骤文件与功能文件相关联的用处。我不认为大多数客户会非常擅长以与上下文无关的方式编写规范。这不是我们通常写作,谈话或思考的方式。

答案 4 :(得分:1)

解决方案是实现标签&amp; Scoped Binding与测试场景相关,该场景与Web相关或与代码中的Controller / Core逻辑相关。

将每个场景的范围深入到下面提到的任何前/后执行

BeforeTestRunScenario 
    BeforeFeature
        BeforeScenario
            BeforeScenarioBlock
                BeforeStep
                AfterStep
            AfterScenarioBlock
        AfterScenario
    AfterFeature
AfterTestRunScenario 

答案 5 :(得分:0)

还要考虑使用与实现无关的DSL以及特定于实现的步骤定义。例如,使用

  

When I search for 'Barbados'

而不是

  

`当我在搜索栏中输入'Barbados'并按下搜索按钮

通过实现多个步骤定义程序集,可以通过不同的接口执行相同的方案。我们使用这种方法使用相同的场景测试UI,API等。