SpecFlow BeforeScenario 针对每个功能文件运行

SpecFlow BeforeScenario runs for each Feature file

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

  1. 我使用抽象 class 进行我的 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 文件,每个文件一个 page/feature。例如 LoginFeature 和 PurchaseFeature。每个 FeatureSteps class 扩展 UITestBase 并具有 [Binding] 属性。

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

  4. 导致UITestBase的继承者有多少,每个场景打开多少浏览器。尽管测试 运行 很好,但看起来有点丑而且感觉不对。

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

如您所述,绑定在 specflow 中是全局的。此外,正如您所发现的那样,基础 class 中的绑定对于该 class 的每个继承者都是 运行 一次。不要将绑定放入基 classes 中,而是将它们放在一个单独的 class 中,专门用于此目的,然后 Specflow 将找到它们并 运行 它们。如果您需要为您的场景使用初始化对象,那么我发现最好通过 specflow's prescribed ways of sharing data between bindings. I have outlined an approach in this answer 传递这些对象。我的偏好是使用上下文注入。

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