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

标签 c# nunit webdriver

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

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

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

[Test]
public void SomeTest()
{
    foreach (var driver in Drivers)
    {
        driver.Navigate().GoToUrl("...");
...

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

public void SomeTest(IWebDriver driver)
{
    driver.Navigate().GoToUrl("...");
...

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

[TestCase(new ChromeDriver())]
[TestCase(new FireFoxDriver())]
...

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

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

最佳答案

您应该能够使用 TestCaseSourceAttribute .首先创建一个提供网络驱动程序集合的可普遍访问的类:

public static class WebDriverFactory
{
    public static IWebDriver[] Drivers =
    {
        new ChromeDriver(),
        new FirefoxDriver(),
        ...
    };
}

接下来,像这样实现依赖于网络驱动程序的单元测试:

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

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

public class WebDriverSourceAttribute : TestCaseSourceAttribute
{
    public WebDriverSourceAttribute() : base(typeof(WebDriverFactory), "Drivers")
    {            
    }
}

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

[Test, WebDriverSource]
public void SomeTest(IWebDriver driver)
{
    driver.Navigate().GoToUrl("...");
    ...
}

关于c# - 在多个驱动程序上运行 WebDriver NUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12372529/

相关文章:

c# - 将 Func<Type, object> 表达式转换为 Func<T>,其中 T 是泛型约束

c# - Entity Framework 核心 : Fail to update Entity with nested value objects

c# - ASP.NET 集成测试 - TestDrive.net 不会运行它们,其他测试运行者会

ruby - 使用 chromium watir-webdriver 阻止图像

java - 如何在测试启动之前修改 testNG DataProvider 数组对象(在 Saucelabs 中命名测试)

c# - 将 ssl 添加到 webapi...也添加到客户端?

c# - 每个层次结构继承的 Entity Framework 表

c# - 在单元测试中循环

c# - NUnit - 加载所有 TestCaseSources,即使当前测试不需要它们

python - 为什么 selenium webdriver 找不到我的元素