【问题标题】:SpecFlow BeforeScenario runs for each Feature fileSpecFlow BeforeScenario 为每个功能文件运行
【发布时间】:2015-07-21 00:35:06
【问题描述】:

我才开始使用 specflow,我知道它的绑定对于程序集是全局的。无论如何,我找不到我的问题的解决方案或解决方法:

  1. 我在 UI 测试中使用抽象类,例如

    public abstract class UITestBase<T>
        where T : FeatureContext, new()
    {
        private static readonly object SyncObject = new object();
        private static AutoTestSettings settings;
    
        private IWebDriver webDriver;
        private IBrowserFactory browserFactory;
        private Container container;
    
        protected static T Context;
    
        [BeforeScenario]
        public virtual void BeforeScenario()
        {
            BuildConfiguration();
    
            var driverPool = container.GetInstance<IWebDriverPool>();
            webDriver = driverPool.GetDriver(settings.BrowserType);
            browserFactory = container.GetInstance<IBrowserFactory>();
    
            Context = new T
                          {
                              Browser = browserFactory.Create(webDriver, settings.WebsiteUrl, settings.BrowserType),
                              Container = container
                          };
        }
    
        [AfterScenario]
        public virtual void AfterScenario()
        {
            webDriver.Dispose();
        }
    }
    
  2. 我有几个 FeatureSteps 文件,每个页面/功能一个。例如 LoginFeature 和 PurchaseFeature。每个 FeatureSteps 类都扩展了 UITestBase 并具有 [Binding] 属性。

  3. 每当我为LoginFeature 运行场景时,它似乎也为PurchaseFeatureSteps 挂上了BeforeScenario。至少Debug.WriteLine(this.GetType().Name) 是这么说的。

  4. 这导致每个场景打开的浏览器数量与UITestBase 的继承者数量一样多。尽管测试运行良好,但它看起来有点难看,感觉不对。

  5. 有人遇到过这样的问题吗?我该如何解决?

【问题讨论】:

  • BeforeScenario 属性可以限定为我认为的标签:[BeforeScenario("myTag")]Binding 属性本身不带范围,但您可以在它旁边应用可以带标签名称的 Scope 属性。
  • 但是这段代码(启动 IOC,启动 Web 驱动程序)对于每个 UI 功能来说都是通用的。我应该在每个功能的场景方法之前放置吗?这听起来也不好。
  • 我在评论您对全局项目的观察,范围界定有助于否定这一点。我们还在 SpecFlow 中通过 Seleno 启动 Selenium - 我会看看我们是如何做到的,但我确定它不涉及 BeforeScenario
  • 我们维护一个浏览器主机和BeforeFeature(标记为需要有一个浏览器)我们检查它是否正在运行,如果没有,我们运行它。
  • @Vladisav 我会避免这样做。 SpecFlow 不仅可以生成 NUnit 测试,它还提供了大多数测试钩子,这些钩子对于此类事情是必需的。

标签: c# testing bdd specflow


【解决方案1】:

如您所述,绑定在规范流中是全局的。此外,正如您发现的那样,基类中的绑定为该类的每个继承者运行一次。不要将绑定放在基类中,而是将它们放在专门为此目的的单独类中,然后 Specflow 会找到它们并运行它们。如果您需要初始化对象以供您的场景使用,那么我发现通过specflow's prescribed ways of sharing data between bindings 传递这些对象会更好。我在this answer 中概述了一种方法。我的偏好是使用上下文注入。

如果您有一些特定于特定功能或场景的设置,那么bindings can be scoped 以便它们仅针对特定功能或场景运行

【讨论】:

  • 非常感谢,你很有帮助。虽然我不喜欢单独类的概念(很难维护钩子所在的位置),但它似乎是合法的解决方案。
猜你喜欢
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 2016-01-09
  • 2016-06-25
相关资源
最近更新 更多