You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Selenium/NUnit并行运行多浏览器测试夹具?

多浏览器并行自动化测试配置方案

问题场景

需要实现多浏览器并行自动化测试,现有以下两个泛型测试类,但添加[Parallelizable]特性后无法生效,求正确配置方式:

原代码:

[TestFixture(typeof(ChromeDriver))]
[TestFixture(typeof(EdgeDriver))]
[TestFixture(typeof(FirefoxDriver))]
public class BaseTest<TWebDriver> where TWebDriver : IWebDriver, new()
{
    protected IWebDriver _driver;

    [SetUp]
    protected void SetUp()
    {
        _driver = new TWebDriver();
    }

    [TearDown]
    protected void TearDown()
    {
        _driver?.Close();
    }
}

public class GoogleTest<TWebDriver> : BaseTest<TWebDriver> where TWebDriver : IWebDriver, new()
{
    [Test]
    public void NavigateToGoogle()
    {
        // Navigate
        _driver.Manage().Window.Maximize();
        _driver.Navigate().GoToUrl("http://www.google.com/");
    }
}

问题原因

  1. [Parallelizable]特性不会自动继承到泛型子类,需要直接在实际测试类(GoogleTest)上声明。
  2. 基类未指定测试实例生命周期,可能导致多个测试共享同一浏览器实例,引发冲突。
  3. TearDown中使用Close()仅关闭当前窗口,浏览器进程未完全终止,可能残留影响并行执行。

解决方案

1. 调整测试类特性与生命周期

在实际测试类添加并行特性,同时给基类配置实例生命周期,确保每个测试用例拥有独立的浏览器实例:

修改后的BaseTest:

[TestFixture(typeof(ChromeDriver))]
[TestFixture(typeof(EdgeDriver))]
[TestFixture(typeof(FirefoxDriver))]
[FixtureLifeCycle(LifeCycle.InstancePerTestCase)] // 每个测试用例生成独立实例
public class BaseTest<TWebDriver> where TWebDriver : IWebDriver, new()
{
    protected IWebDriver _driver;

    [SetUp]
    protected void SetUp()
    {
        _driver = new TWebDriver();
    }

    [TearDown]
    protected void TearDown()
    {
        _driver?.Quit(); // 关闭整个浏览器进程,释放资源
        _driver?.Dispose();
    }
}

修改后的GoogleTest:

[Parallelizable(ParallelScope.Children)] // 允许该类下的所有测试用例并行执行
public class GoogleTest<TWebDriver> : BaseTest<TWebDriver> where TWebDriver : IWebDriver, new()
{
    [Test]
    public void NavigateToGoogle()
    {
        _driver.Manage().Window.Maximize();
        _driver.Navigate().GoToUrl("http://www.google.com/");
    }
}

2. 可选:全局并行配置(通过nunit.runsettings)

如果需要全局开启并行测试,可在项目中添加nunit.runsettings文件,配置并行工作线程数和范围:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <NUnit>
    <Parallelize>
      <Workers>3</Workers> <!-- 对应浏览器数量,比如3个浏览器设为3 -->
      <Scope>All</Scope> <!-- 所有测试跨类并行执行 -->
    </Parallelize>
  </NUnit>
</RunSettings>

关键说明

  • ParallelScope.Children:允许当前测试类下的所有测试用例(包括不同Fixture的浏览器实例)并行执行。
  • FixtureLifeCycle.InstancePerTestCase:确保每个测试用例都有独立的BaseTest实例,避免浏览器实例共享。
  • 用Quit()替代Close():彻底终止浏览器进程,防止资源泄漏影响后续并行测试。

内容的提问来源于stack exchange,提问作者GenesysRTA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:33:21