我只是开始使用specflow,我知道它的绑定对于程序集来说是全局的。无论如何,我找不到我的问题的解决方案或解决方法:
我在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();
}
}
我有几个FeatureSteps文件,每个页面/功能一个。例如LoginFeature和PurchaseFeature。每个FeatureSteps类都扩展了UITestBase并具有[Binding]属性。
每当我为LoginFeature
运行方案时,它似乎也挂钩BeforeScenario
PurchaseFeatureSteps
。至少那是Debug.WriteLine(this.GetType().Name)
所说的。
这会导致每个方案打开的浏览器数量与UITestBase
的继承者数量相同。虽然测试运行良好但看起来很难看并且感觉不对。
有没有人遇到过这样的问题?我该如何解决?
答案 0 :(得分:3)
如您所述,绑定在specflow中是全局的。此外,您已经发现基类中的绑定对该类的每个继承者运行一次。不要将绑定放在基类中,而是将它们放在专门用于此目的的单独类中,然后Specflow将找到它们并运行它们。如果您需要初始化要使用的方案的对象,那么我发现通过specflow's prescribed ways of sharing data between bindings传递这些对象会更好。我在this answer中概述了一种方法。我倾向于使用上下文注入。
如果您有一些特定于特定功能或方案的设置,那么bindings can be scoped以便它们仅针对特定功能或场景运行