为每个Feature文件运行SpecFlow BeforeScenario

时间:2015-07-20 12:36:27

标签: c# testing bdd specflow

我只是开始使用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运行方案时,它似乎也挂钩BeforeScenario PurchaseFeatureSteps。至少那是Debug.WriteLine(this.GetType().Name)所说的。

  4. 这会导致每个方案打开的浏览器数量与UITestBase的继承者数量相同。虽然测试运行良好但看起来很难看并且感觉不对。

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

1 个答案:

答案 0 :(得分:3)

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

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