如何用Selenium在同一浏览器不同实例中同时运行多个TestNG.XML文件
TestNG多套件并行执行问题解决
我在TestNG测试套件中有大量测试类,现有两个测试套件文件:
Testng.xml1
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite1.xml"> <test name="Test Cases1"> <classes> <class name="com.test1" /> </classes> </test> <test name="Test Cases2"> <classes> <class name="com.test2" /> </classes> </test> </suite>
Testng.xml2
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite2.xml"> <test name="Test Cases1"> <classes> <class name="com.test1" /> </classes> </test> <test name="Test Cases2"> <classes> <class name="com.test2" /> </classes> </test> </suite>
我希望同时运行Suite1.xml和Suite2.xml,让每个套件的首个测试用例在同一浏览器的不同实例中同时执行。尝试了通过父套件并行运行子套件,但未成功,配置的Testng.xml3如下:
Testng.xml3
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="RegressionSuite.xml" thread-count="10" verbose="2" parallel="test"> <suite-files> <suite-file path="Suite1.xml"> </suite-file> <suite-file path="Suite2.xml"> </suite-file> </suite-files> </suite>
问题分析与解决步骤
当前父套件配置的parallel="test"仅会让单个子套件内部的
修正父套件并行配置
将父套件的parallel属性设为"tests"(与"test"等效),同时调整thread-count为实际需要的并行数(比如2,刚好匹配两个套件的首个测试用例并行)。子套件不要设置任何parallel或thread-count属性,确保继承父套件的并行策略。修改后的父套件配置如下:<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="RegressionSuite.xml" thread-count="2" verbose="2" parallel="tests"> <suite-files> <suite-file path="Suite1.xml"/> <suite-file path="Suite2.xml"/> </suite-files> </suite>实现浏览器实例线程隔离
必须用ThreadLocal存储WebDriver实例,避免不同线程的浏览器实例互相干扰。基础测试类示例:public class BaseTest { private static final ThreadLocal<WebDriver> driverHolder = new ThreadLocal<>(); @BeforeMethod public void initDriver() { ChromeOptions options = new ChromeOptions(); // 可添加浏览器启动参数,如无头模式等 driverHolder.set(new ChromeDriver(options)); } protected WebDriver getDriver() { return driverHolder.get(); } @AfterMethod public void quitDriver() { WebDriver driver = driverHolder.get(); if (driver != null) { driver.quit(); driverHolder.remove(); } } }所有测试类继承该BaseTest,通过
getDriver()获取当前线程的浏览器实例。验证执行逻辑
运行修改后的父套件,TestNG会将所有子套件中的节点统一纳入并行调度池,此时Suite1的Test Cases1和Suite2的Test Cases1会在不同线程中启动独立的浏览器实例,实现同时执行。
内容的提问来源于stack exchange,提问作者Ruppal Vachaswa
相关产品推荐
相关产品推荐

