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

如何在同一浏览器会话中运行多个TestNG@Test测试用例

解决TestNG保持浏览器会话执行所有测试用例的方案

首先得明确你的需求:是同一个测试类里的所有测试方法共享浏览器,还是多个测试类之间也共享?我分两种情况给你梳理解决方案:

情况1:同一个测试类内的所有测试方法共享浏览器

如果你的测试用例都集中在同一个类里,现在每次测试后浏览器关闭,大概率是你在@AfterMethod中写了关闭浏览器的代码。调整思路很简单:

  • 保留@BeforeClass做浏览器初始化(你已经这么做了),确保整个测试类只启动一次浏览器
  • 把关闭浏览器的逻辑移到@AfterClass中,这样所有测试方法执行完毕后才会关闭浏览器

给你个代码示例参考:

public class ProductDetailTest {
    private WebDriver driver;
    private String browserName;
    private String url;
    private Properties propDatas;

    @BeforeClass
    @Parameters({"browser", "pdpurl"})
    public void setData(@Optional("")String browser, @Optional("")String pdpurl) {
        browserName = browser.isEmpty() ? "chrome" : browser;
        url = pdpurl.isEmpty() ? propDatas.getProperty("PDP_URL") : pdpurl;
        
        // 初始化浏览器
        if(browserName.equalsIgnoreCase("chrome")) {
            driver = new ChromeDriver();
        }
        // 其他浏览器配置逻辑...
        driver.get(url);
        driver.manage().window().maximize();
    }

    @Test
    public void verifyProductTitle() {
        // 测试逻辑:验证商品标题
        String title = driver.findElement(By.cssSelector(".product-title")).getText();
        Assert.assertNotNull(title);
    }

    @Test
    public void addToCartTest() {
        // 测试逻辑:点击加入购物车
        driver.findElement(By.id("add-to-cart")).click();
    }

    // 整个类测试完成后再关闭浏览器
    @AfterClass
    public void cleanUp() {
        if(driver != null) {
            driver.quit();
        }
    }
}

这样设置后,右键类名运行TestNG测试时,只会启动一次浏览器,跑完所有测试方法后才会关闭。

情况2:多个测试类之间共享同一个浏览器会话

如果测试用例分散在多个类里,想要所有类共用一个浏览器会话,就得用到TestNG的@BeforeSuite和@AfterSuite,再配合静态变量(或单例模式)来共享WebDriver实例:

步骤1:创建基础测试类,统一管理浏览器生命周期

public class BaseTest {
    protected static WebDriver driver;
    protected static String testUrl;
    protected static Properties propDatas;

    @BeforeSuite
    @Parameters({"browser", "pdpurl"})
    public void initSuite(@Optional("")String browser, @Optional("")String pdpurl) {
        String browserName = browser.isEmpty() ? "chrome" : browser;
        testUrl = pdpurl.isEmpty() ? propDatas.getProperty("PDP_URL") : pdpurl;
        
        // 初始化浏览器
        if(browserName.equalsIgnoreCase("chrome")) {
            driver = new ChromeDriver();
        }
        // 其他浏览器配置...
        driver.get(testUrl);
        driver.manage().window().maximize();
    }

    @AfterSuite
    public void closeSuite() {
        if(driver != null) {
            driver.quit();
        }
    }
}

步骤2:让所有测试类继承这个基础类

public class ProductInfoTest extends BaseTest {
    @Test
    public void verifyProductPrice() {
        // 直接使用父类的静态driver
        String price = driver.findElement(By.cssSelector(".product-price")).getText();
        Assert.assertTrue(price.contains("$"));
    }
}

public class CartOperationTest extends BaseTest {
    @Test
    public void checkCartCount() {
        driver.findElement(By.id("cart-icon")).click();
        String count = driver.findElement(By.className("cart-count")).getText();
        Assert.assertEquals(count, "1");
    }
}

步骤3:通过TestNG XML执行所有测试类

创建一个testng.xml文件,把所有测试类加入进去,右键这个XML文件运行TestNG Suite:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="E-commerce Test Suite">
    <parameter name="browser" value="chrome"/>
    <parameter name="pdpurl" value="https://your-test-site.com/product"/>
    <test name="All Functional Tests">
        <classes>
            <class name="com.yourpackage.ProductInfoTest"/>
            <class name="com.yourpackage.CartOperationTest"/>
        </classes>
    </test>
</suite>

这样整个Suite执行过程中只会启动一次浏览器,所有测试类的用例都在同一个会话里运行,全部执行完成后才会关闭浏览器。

额外注意事项

  • 务必检查代码中是否有@AfterMethod里写driver.quit()或driver.close()的逻辑,有的话要删掉,不然还是会每次测试后关闭浏览器
  • 用静态WebDriver时要注意线程安全问题(如果开启并行测试的话,但你要共享会话的话一般不会用并行)
  • 可以保留@AfterMethod里的页面清理逻辑(比如刷新页面、回到首页),只要不关闭浏览器就没问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:38:27