如何基于单例Driver并行运行自动化测试(支持非单例方案)
嘿,关于并行测试和Driver实例的问题,我给你捋清楚哈~
首先得明确:你当前的单例Driver模式完全不适合并行测试场景!因为单例会让所有并行运行的测试用例共享同一个ChromeDriver实例,多个测试同时操作同一个浏览器窗口,结果必然是步骤混乱、测试失败,完全达不到并行的目的。
要实现可靠的并行测试,核心是保证每个测试用例拥有独立隔离的Driver实例,下面给你提供正确的实现方案:
方案1:测试用例父类实现独立Driver管理
直接在测试父类的SetUp(测试前置)中初始化专属Driver,TearDown(测试后置)中销毁,确保每个测试实例互不干扰:
[TestFixture, Apartment(ApartmentState.MTA)] [Parallelizable(ParallelScope.Self)] public class TestCase { protected IWebDriver driver; // 每个测试实例独占的Driver [SetUp] public void SetupTest() { // 配置Chrome选项,提升并行稳定性 var chromeOptions = new ChromeOptions(); chromeOptions.AddArgument("--disable-gpu"); chromeOptions.AddArgument("--no-sandbox"); chromeOptions.AddArgument("--headless=new"); // 不需要可视化界面时开启,加快测试速度 // 为当前测试创建独立的ChromeDriver实例 driver = new ChromeDriver("你的ChromeDriver所在路径", chromeOptions); driver.Manage().Window.Maximize(); driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10); } [TearDown] public void TeardownTest() { // 测试结束后彻底销毁Driver,避免内存泄漏 if (driver != null) { driver.Quit(); driver.Dispose(); } } }
方案2:封装非单例的Driver工厂(可选)
如果想把Driver的创建逻辑抽离出来,可以写一个工厂类,每次调用都返回新的Driver实例(不是单例):
public static class DriverFactory { public static IWebDriver CreateChromeDriver() { var chromeOptions = new ChromeOptions(); chromeOptions.AddArgument("--disable-gpu"); chromeOptions.AddArgument("--no-sandbox"); chromeOptions.AddArgument("--headless=new"); return new ChromeDriver("你的ChromeDriver所在路径", chromeOptions); } }
然后在父类的SetUp中调用:
driver = DriverFactory.CreateChromeDriver();
关键注意点
[Parallelizable(ParallelScope.Self)]:这个特性是NUnit中控制并行范围的关键,确保每个测试用例实例可以独立并行运行,配合独立的Driver实例,就能实现真正的并行测试。- 一定要避免共享Driver实例:任何形式的全局共享(单例、静态变量)都会破坏测试隔离,导致并行测试失败。
内容的提问来源于stack exchange,提问作者Miguel D'Alessio
相关产品推荐
相关产品推荐

