我正在使用SpecFlow进行一些BDD风格的测试 . 我的一些功能是UI测试,所以他们使用WatiN . 有些不是UI测试,所以他们没有 .
目前,我有一个 StepDefinitions.cs
文件,涵盖了我的所有功能 . 我有一个初始化WatiN的 BeforeScenario
步骤 . 这意味着我的所有测试都会启动Internet Explorer,无论他们是否需要它 .
在SpecFlow中是否有任何方法可以将特定的特征文件与特定的步骤定义集相关联?或者我是从错误的角度接近这个?
6 回答
如果您使用标签,则可以使用简单的解决方案解决问题 .
首先标记您的特征文件,以指示特定功能需要WatiN,如下所示:
@WatiN
场景:保存中等范围内的有效样本大小
给定用户输入10作为样本大小
当用户选择保存时
然后存储该值
然后使用指示标记的属性装饰BeforeScenario绑定:
然后,仅针对使用WatiN的功能调用此BeforeScenario方法 .
目前(在SpecFlow 1.3中)步骤定义是全局的,不能限定为特定功能 .
这与设计具有与Cucumber相同的行为 .
我在黄瓜组问了同样的问题:
http://groups.google.com/group/cukes/browse_thread/thread/20cd7e1db0a4bdaf/fd668f7346984df9#fd668f7346984df9
基线是,所有要素文件定义的语言也应该是全局的(整个应用程序的一个全局行为) . 因此,应避免对特征进行范围定义 . 我个人还不完全相信这个......
但是,只有在需要UI集成的场景中启动WatiN的问题可以通过两种不同的方式解决:
标记和标记的钩子:您可以标记您的场景(即使用@web)并定义ina之前的场景,仅适用于具有特定标记的场景(即[BeforeScenario("web")]) . 请参阅BookShop示例中的Selenium集成:http://github.com/techtalk/SpecFlow-Examples/blob/master/ASP.NET-MVC/BookShop/BookShop.AcceptanceTests.Selenium/Support/SeleniumSupport.cs
我们经常将绑定到UI的场景和绑定到程序API(即控制器,视图模型......)的场景完全分离到不同的项目中 . 我们试图在BookShop示例中说明这一点:http://github.com/techtalk/SpecFlow-Examples/tree/master/ASP.NET-MVC/BookShop/ .
检查一下(SpecFlow 1.4中的新功能):https://github.com/techtalk/SpecFlow/wiki/Scoped-Bindings
我最初假设步骤文件与特定的功能文件相关联 . 一旦我意识到这不是真的,它帮助我改进了我的所有SpecFlow代码和功能文件 . 我的特征文件的语言现在减少了上下文,这导致了更多可重用的步骤定义和更少的代码重复 . 现在我根据一般的相似性来组织我的步骤文件,而不是根据它们的功能 . 据我所知,没有办法将步骤与特定功能相关联,但我不是SpecFlow专家,所以不要相信我的话 .
如果您仍想将步骤文件与特定功能文件关联,请为它们指定相似的名称 . 即使步骤代码仅对该功能有意义,也不需要强制它仅适用于该功能 . 这是因为即使您碰巧为不同的功能创建了重复步骤,它也会将其检测为模糊匹配 . 可以在App.config文件中指定不明确匹配的行为 . 有关App.config文件的详细信息,请参阅http://cloud.github.com/downloads/techtalk/SpecFlow/SpecFlow%20Guide.pdf . 默认情况下,检测到模糊匹配并将其报告为错误 .
[编辑]:实际上以这种方式工作存在问题(仅在您的脑海中具有与功能文件相关联的步骤文件) . 当您添加或修改.feature文件并使用之前使用的相同措辞时,问题就出现了,而您忘记为其添加一个步骤,但是您没有注意到这一点,因为您之前已经为该措辞创建了一个步骤,它是以上下文敏感的方式编写的 . 此外,我不再相信不将步骤文件与功能文件相关联的用处 . 我不认为大多数客户会非常擅长以与上下文无关的方式编写规范 . 这不是我们通常写作,谈话或思考的方式 .
解决方案是使用与Web相关或与代码中的Controller / Core逻辑相关的测试场景实现Tags&Scoped Binding .
并将每个场景的范围向下钻取到任何场景以下提到的执行前/后
还要考虑使用与实现无关的DSL以及特定于实现的步骤定义 . 例如,使用
代替
通过实现多个步骤定义程序集,可以通过不同的接口执行相同的方案 . 我们使用此方法使用相同的方案测试UI,API等 .