【问题标题】:BDD Scenario Multi DependentBDD 场景多依赖
【发布时间】:2012-10-10 07:36:55
【问题描述】:

我正在使用 SpecFlow 使用 .Net 来自动化 UI。我已经定义了相同的功能和场景。我的问题是场景在执行主要场景之前依赖于其他场景我必须确保首先创建在同一功能文件中定义为场景的所有依赖数据,因此我将所有这些数据放在后台。那么,当我要运行下一个功能时,它也依赖于我们已经使用功能 1st 创建的相同场景,它是否已经创建?所以我们不需要再次执行相同的操作。

那么,有什么方法可以确保在运行任何场景之前,后台场景已经在 UI 级别执行/创建/呈现。

【问题讨论】:

    标签: bdd specflow


    【解决方案1】:

    听起来好像您希望在多个不同的功能文件中有一个共同的背景。至少有两种不同的方法可以做到这一点:

    复合步骤

    一种方法是 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 是什么,因此在设置它的场景中创建一个步骤是没有意义的。

    使用复合步骤来设置业务关注点

    如果您需要指定业务用户关心的系统状态(如登录用户或现有产品数据),那么这应该是场景(或后台)中的另一个步骤。这是因为这些步骤应包括从业务角度阅读和理解行为所需的一切。

    【讨论】:

      【解决方案2】:

      我认为您在这里询问的是域,因为您有一个称为背景的域,现在您想引入另一个更高级别的域,称为 UI。因此,由于我没有关于您的应用程序的足够信息,我将尝试用另一个示例进行说明。

      假设我们有一家商店,我们可以编写跨多个领域的场景,例如库存控制、早上开门、找零和晚上关门。这可能意味着我们有很多绑定,例如WhenWeFillTheShelves()WhenWeUnlockTheDoor()WhenWeHaveAChangeInTheTill()

      现在我们来处理客户交互,所以我们可能要写

      Given the shop is ready for business
      

      此时,我会写

      [Binding]
      public void GivenTheShopIsReadyForBusiness()
      {
          WhenWeFillTheShelves();
          WhenWeHaveChangeInTheTill();
          WhenWeUnlockTheDoor();
      }
      

      通过这种方式,我们重用了我们较低级别、更细粒度的域来构建更高级别的域测试,并且您可以保证每次都处于正确的状态。

      我也建议你阅读Dan North's Whose domain is it anyway

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多