在多个驱动程序上运行 WebDriver NUnit 测试

chi*_*oro 2 c# nunit webdriver

我们最近开始使用 WebDriver(支持 Selenium 1)来执行浏览器测试,使用 NUnit 框架。由于我们想在各种浏览器中运行测试,我们为每个浏览器定义了驱动程序,并在夹具设置期间将它们放在一个列表中:

[TestFixtureSetUp]
public void SetupTest()
{
    // Load drivers
    Drivers = new List<IWebDriver>
            {
                new ChromeDriver(),
                ...
            };
Run Code Online (Sandbox Code Playgroud)

在每一个测试中,我们都像这样遍历列表:

[Test]
public void SomeTest()
{
    foreach (var driver in Drivers)
    {
        driver.Navigate().GoToUrl("...");
...
Run Code Online (Sandbox Code Playgroud)

在所有的测试方法中都这样做感觉不对。测试方法不应该关心他们应该使用什么驱动程序。理想情况下,我们会有这样的事情:

public void SomeTest(IWebDriver driver)
{
    driver.Navigate().GoToUrl("...");
...
Run Code Online (Sandbox Code Playgroud)

我们可以解决这个问题的一种方法是使用 TestCases:

[TestCase(new ChromeDriver())]
[TestCase(new FireFoxDriver())]
...
Run Code Online (Sandbox Code Playgroud)

但这是很多重复,并将正确初始化驱动程序的问题转移到每个测试的属性中。不是真正的收获。

有没有什么办法可以告诉 NUnit 框架执行整个测试套件并在每次运行时向单个测试注入不同的参数?或者有没有其他好的解决方案?

And*_*son 6

您应该能够使用TestCaseSourceAttribute。首先创建一个公共可访问的类,该类提供 Web 驱动程序的集合:

public static class WebDriverFactory
{
    public static IWebDriver[] Drivers =
    {
        new ChromeDriver(),
        new FirefoxDriver(),
        ...
    };
}
Run Code Online (Sandbox Code Playgroud)

接下来,实现您的 Web 驱动程序相关单元测试,如下所示:

[Test, TestCaseSource(typeof(WebDriverFactory), "Drivers")]
public void SomeTest(IWebDriver driver)
{
    driver.Navigate().GoToUrl("...");
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者,为了在实现每个单元测试时减少输入,还可以定义一个新的Attribute类,该类继承自TestCaseSourceAttribute并且仅实现默认构造函数:

public class WebDriverSourceAttribute : TestCaseSourceAttribute
{
    public WebDriverSourceAttribute() : base(typeof(WebDriverFactory), "Drivers")
    {            
    }
}
Run Code Online (Sandbox Code Playgroud)

使用继承的WedDriverSource属性,单元测试现在可以简化为:

[Test, WebDriverSource]
public void SomeTest(IWebDriver driver)
{
    driver.Navigate().GoToUrl("...");
    ...
}
Run Code Online (Sandbox Code Playgroud)