听起来好像您希望在多个不同的功能文件中有一个共同的背景。至少有两种不同的方法可以做到这一点:
复合步骤
一种方法是 AlSki 提出的,创建一个调用许多其他步骤的复合步骤。我不会在这里重新定义这一点,因为他在回复中做得很好。您可以在任何您喜欢的功能中从任何场景(或背景)调用此复合步骤(调用多个步骤的步骤)。
Hooks 上的标签过滤
另一种方法是使用 SpecFlow 中定义的Hooks,如[BeforeScenario],在每个场景之前运行一些代码。您可以使用标签过滤(请参阅挂钩链接)通过将相应标签添加到场景或功能来指定要运行的挂钩。让我用一个例子来演示:
假设我有使用 Selenium 执行的场景来驱动 Web 浏览器,但并非所有场景都使用 Selenium。如果我只想为需要它的场景设置 Selenium,我可以创建一个 BeforeScenario 挂钩,该挂钩仅在场景具有标签 @web 时执行。
这是我的功能文件LoggingIn.feature:
Feature: Logging In
@web
Scenario: Log In
Given I am on the login page
When I supply valid credentials
Then I should be taken to the homepage
这是我的步骤定义文件StepDefinitions.cs:
[Binding]
public class StepDefinitions
{
[BeforeScenario("web")]
public static void BeforeWebScenario()
{
// Code to startup selenium
}
[BeforeScenario]
public static void BeforeAllScenarios()
{
// Code that executes before every scenario...regardless of tag.
}
}
对于任何带有@web 标签的场景,BeforeAllScenarios() 和 BeforeWebScenario() 都将在场景执行之前执行。对于没有@web 标签的场景,只会执行BeforeAllScenarios() 方法。
通过这种方式,您可以通过将特定属性应用于场景来运行一组代码。
仅供参考:从 SpecFlow 1.9 开始,如果指定了多个挂钩,则无法指定这些挂钩的执行顺序。
何时使用其中一种?
这取决于您是设置技术问题还是业务问题。
使用标签设置技术问题
如果您想设置业务用户不需要了解的测试的某些技术方面,我会使用标记方法。一个很好的例子是我提出的……设置 Selenium。业务用户可能不太关心 Selenium 是什么,因此在设置它的场景中创建一个步骤是没有意义的。
使用复合步骤来设置业务关注点
如果您需要指定业务用户关心的系统状态(如登录用户或现有产品数据),那么这应该是场景(或后台)中的另一个步骤。这是因为这些步骤应包括从业务角度阅读和理解行为所需的一切。