如何在同一浏览器会话中运行多个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
相关产品推荐
相关产品推荐

