18

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

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

SpecFlow 中是否有任何方法可以使特定的功能文件与一组特定的步骤定义相关联?还是我从错误的角度接近这个?

4

6 回答 6

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 的功能调用。

于 2010-06-14T15:17:20.727 回答
15

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

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

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

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

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

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

于 2010-06-03T06:59:45.453 回答
8

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

于 2010-10-08T14:05:52.867 回答
3

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

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

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

于 2010-06-03T02:08:07.440 回答
1

对此的解决方案是在代码中使用与 Web 相关或与 Controller / Core 逻辑相关的测试场景来实现 Tag & Scoped Binding。

并将每个场景的范围向下钻取到以下提到的执行前/执行后的任何一个

BeforeTestRunScenario 
    BeforeFeature
        BeforeScenario
            BeforeScenarioBlock
                BeforeStep
                AfterStep
            AfterScenarioBlock
        AfterScenario
    AfterFeature
AfterTestRunScenario 
于 2014-07-19T07:12:27.463 回答
0

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

When I search for 'Barbados'

代替

`当我在搜索字段中输入“巴巴多斯”并按下“搜索”按钮时

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

于 2014-02-24T20:40:47.610 回答