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

TestNG+Maven并行启动Chrome浏览器失败问题求助

解决TestNG并行执行时第二个测试类NullPointerException问题

看起来你遇到的核心问题是WebDriver实例的线程安全问题,结合你的场景,大概率是因为LaunchBrowser类里的WebDriver被多个测试线程共享,或者没有在每个测试类的生命周期里正确初始化/销毁实例,导致第二个测试类拿不到有效的WebDriver实例,抛出NPE。下面是一步步的排查和解决方法:

1. 检查LaunchBrowser的WebDriver实例是否为非静态

如果你的LaunchBrowser里把WebDriver定义成了static WebDriver driver,那在多线程并行时,多个测试类会共用同一个driver实例——第一个测试执行完quit之后,第二个测试再调用就会拿到null,直接触发NPE。

修正方式:把WebDriver改成实例变量,每次实例化LaunchBrowser时创建新的ChromeDriver:

public class LaunchBrowser {
    // 不要用static!
    private WebDriver driver;

    public void initDriver() {
        ChromeOptions options = new ChromeOptions();
        // 你的Chrome配置,比如无头模式、窗口大小等
        driver = new ChromeDriver(options);
    }

    public WebDriver getDriver() {
        return driver;
    }

    public void quitDriver() {
        if (driver != null) {
            driver.quit();
            driver = null; // 避免后续引用
        }
    }
}

2. 给每个测试类绑定独立的WebDriver生命周期

用TestNG的@BeforeClass和@AfterClass(或者@BeforeMethod/@AfterMethod,根据你的测试粒度)来初始化和销毁WebDriver,确保每个测试类有自己的LaunchBrowser实例:

public class FirstTestClass {
    private LaunchBrowser browser;

    @BeforeClass
    public void setUp() {
        browser = new LaunchBrowser();
        browser.initDriver();
    }

    @Test
    public void firstTest() {
        browser.getDriver().get("https://example.com");
        // 你的测试逻辑
    }

    @AfterClass
    public void tearDown() {
        browser.quitDriver();
    }
}

每个测试类都要重复这个逻辑,保证线程之间的WebDriver实例完全隔离。

3. 修正TestNG Suite的并行配置

你的两个Suite XML文件需要明确指定并行策略,确保TestNG为每个测试类分配独立线程。比如在每个suite的根节点添加:

<suite name="Suite1" parallel="classes" thread-count="2">
    <!-- 你的测试类配置 -->
</suite>
  • parallel="classes":表示每个测试类在独立线程执行
  • thread-count="2":控制每个suite的并发线程数

4. 调整Maven Surefire插件的配置

原来的执行命令里-Dfile参数是错误的,应该用-DsuiteXmlFiles指定Suite文件,同时在插件配置里明确并行规则,避免冲突:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M7</version>
            <configuration>
                <!-- 这里可以直接指定Suite文件,也可以用命令行参数覆盖 -->
                <suiteXmlFiles>
                    <suiteXmlFile>MyWork/testng1.xml</suiteXmlFile>
                    <suiteXmlFile>MyWork/testng2.xml</suiteXmlFile>
                </suiteXmlFiles>
                <!-- 并行策略要和Suite里的配置匹配 -->
                <parallel>classes</parallel>
                <threadCount>4</threadCount> <!-- 两个Suite各2线程,总共4 -->
                <suiteThreadPoolSize>2</suiteThreadPoolSize> <!-- 控制Suite的并发数 -->
            </configuration>
        </plugin>
    </plugins>
</build>

执行命令改成:

mvn clean test

如果需要动态指定Suite文件,用:

mvn clean test -DsuiteXmlFiles=MyWork/testng1.xml,MyWork/testng2.xml

5. 排查NPE的具体位置

如果以上步骤还没解决,查看堆栈跟踪里NPE的具体行——如果是调用driver.xxx()时抛出,说明driver为null,那就要检查LaunchBrowser.initDriver()是否真的成功创建了实例,比如ChromeDriver的路径是否正确、有没有被防火墙拦截等。如果是其他对象null,那就要检查测试类里的其他依赖是否正确初始化。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:13