那么,有没有办法确保在运行任何场景之前,已经在UI级别执行/创建/呈现了后台场景.
听起来好像你想要在几个不同的功能文件中有一个共同的背景.至少有两种不同的方法可以做到这一点:复合步骤
一种方法是AlSki提出的建议,创建一个复合步骤,调用许多其他步骤.我不会在这里重新定义,因为他在答复中做得很好.您可以在任何您喜欢的功能中从任何方案(或背景)调用此复合步骤(调用许多步骤的步骤).
挂钩上的标记过滤
另一种方法是使用SpecFlow中定义的Hooks,如[BeforeScenario],在每个场景之前运行一些代码.您可以使用标记过滤(请参阅钩子链接)通过将相应标记添加到方案或功能来指定要运行的挂钩.让我举个例子来证明:
假设我有使用Selenium来驱动Web浏览器的场景,但并非所有场景都使用Selenium.如果我只想为需要它的场景设置Selenium,我可以创建一个只在场景有@web标签时才执行的BeforeScenario钩子.
这是我的功能文件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是什么,因此在场景中创建一个步骤是没有意义的.
使用复合步骤设置业务问题
如果您需要指定业务用户关心的系统状态(如登录用户或现有产品数据),那么这应该是方案(或后台)中的另一个步骤.这是因为这些步骤应包括从业务角度阅读和理解行为所需的所有内容.