gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:56:28 25 4
gpt4 key购买 nike

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

  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 Hook BeforeScenario。至少 Debug.WriteLine(this.GetType().Name) 是这么说的。

  4. 这会导致每个场景打开的浏览器数量与 UITestBase 的继承者数量相同。虽然测试运行良好,但看起来有点丑,感觉不对。

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

最佳答案

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

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

关于c# - SpecFlow BeforeScenario 针对每个功能文件运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31516704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com