【发布时间】:2015-07-21 00:35:06
【问题描述】:
我才开始使用 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运行场景时,它似乎也为PurchaseFeatureSteps挂上了BeforeScenario。至少Debug.WriteLine(this.GetType().Name)是这么说的。这导致每个场景打开的浏览器数量与
UITestBase的继承者数量一样多。尽管测试运行良好,但它看起来有点难看,感觉不对。有人遇到过这样的问题吗?我该如何解决?
【问题讨论】:
-
BeforeScenario属性可以限定为我认为的标签:[BeforeScenario("myTag")]。Binding属性本身不带范围,但您可以在它旁边应用可以带标签名称的Scope属性。 -
但是这段代码(启动 IOC,启动 Web 驱动程序)对于每个 UI 功能来说都是通用的。我应该在每个功能的场景方法之前放置吗?这听起来也不好。
-
我在评论您对全局项目的观察,范围界定有助于否定这一点。我们还在 SpecFlow 中通过 Seleno 启动 Selenium - 我会看看我们是如何做到的,但我确定它不涉及
BeforeScenario。 -
我们维护一个浏览器主机和
BeforeFeature(标记为需要有一个浏览器)我们检查它是否正在运行,如果没有,我们运行它。 -
@Vladisav 我会避免这样做。 SpecFlow 不仅可以生成 NUnit 测试,它还提供了大多数测试钩子,这些钩子对于此类事情是必需的。