如何使用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/"); } }
问题原因
[Parallelizable]特性不会自动继承到泛型子类,需要直接在实际测试类(GoogleTest)上声明。- 基类未指定测试实例生命周期,可能导致多个测试共享同一浏览器实例,引发冲突。
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
相关产品推荐
相关产品推荐

