没有“最好”的方法可以做到这一点,但是我完成的方法如下:
我创建了一个枚举:
/// <summary>
/// Enum that holds references to different browsers used in testing.
/// </summary>
public enum BrowserTypeEnum
{
/// <summary>
/// Google Chrome.
/// </summary>
Chrome,
/// <summary>
/// Mozilla Firefox.
/// </summary>
Firefox,
/// <summary>
/// Internet Explorer.
/// </summary>
InternetExplorer
}
在 TestFixture 中这样调用它:
/// <summary>
/// Tests related to browsing Google
/// </summary>
[TestFixture(BrowserTypeEnum.Chrome)]
[TestFixture(BrowserTypeEnum.Firefox)]
public class GoogleTests : AbstractTestFixture
{
}
在 AbstractTestFixture 中:
/// <summary>
/// Create's the browser used for this test fixture.
/// <para>
/// Must always be called as part of the test fixture set up.
/// </para>
/// <para>
/// It is the actual test fixture's responsibility to launch the browser. (Usually in the test fixture setup)
/// </para>
/// </summary>
protected override void CreateBrowser()
{
switch (BrowserType)
{
case BrowserTypeEnum.Chrome:
Browser = new ChromeDriver();
break;
case BrowserTypeEnum.Firefox:
Browser = new FirefoxDriver();
break;
case BrowserTypeEnum.InternetExplorer:
Browser = new IEDriver();
break;
default:
break;
}
}
可能不是最好的解决方案,但我发现它非常易读。另一种方法是使用 Selenium Grid 之类的东西,或者将驱动程序的类型传递给 NUnit 并直接创建它。你已经尝试过这个(通过直接类型的驱动程序),它似乎不是你所追求的。唯一的区别可能是您将驱动程序的类型传入测试夹具,而不是实际测试。
另一种选择是,如果您使用 CI 服务器解决方案,请创建一个配置设置以指示用于测试的浏览器。让 CI 驱动程序重复测试 3 次,每次都编辑该配置设置。
我同意,知道他们正在使用什么样的驱动程序并不是实际的测试责任,这就是为什么我把这个责任推到测试夹具中。我这样做的方式可能不是最“优雅”的方式,但至少对我来说是最易读的。看我的代码的人可以很容易地看到这个测试夹具正在重复,以及哪些浏览器正在重复这些步骤。
对我来说,驱动程序的创建必须始终在实际的 TestFixture 中(而不是基本测试夹具)。原因是因为在打开浏览器之前我想做一些逻辑 - 如果这个逻辑失败(在 Setup 或 TestFixtureSetup 方法中),那么 NUnit 将不会运行任何拆卸方法。因此,浏览器窗口将保持打开状态。
所以为了解决这个问题,我在 TestFixtureSetup 中做的最后一件事,在测试运行之前,叫做“CreateBrowser”。