无法通过Maven Failsafe插件并行运行Cucumber测试
你的配置存在以下几个关键问题,导致无法并行运行两个Feature文件:
1. Failsafe插件使用了无效目标
maven-failsafe-plugin的<goal>E2ETest</goal>不是合法目标,该插件用于集成测试,正确的运行目标是integration-test,配合verify目标完成结果校验。
修复方式:
将Failsafe插件的goals部分修改为:
<goals> <goal>integration-test</goal> <goal>verify</goal> </goals>
2. 线程配置存在拼写错误
<perCoreTgreadCount>是拼写错误,正确参数名应为<perCoreThreadCount>,错误参数会被Maven忽略,导致线程数配置不生效。
3. Maven并行策略未针对Feature文件设置
当前配置的<parallel>methods</parallel>仅会让Maven并行执行测试方法,但如果你的TestRunner.java是单类执行所有Feature,这种方式只会并行执行Scenario内的方法,不会为每个Feature启动独立浏览器。
要实现Feature级别的并行,需结合Cucumber的并行配置,分两种情况处理:
情况A:使用Cucumber 7.x及以上版本(原生支持并行)
在TestRunner.java中添加parallel = true和threadCount配置:
@CucumberOptions( features = "src/test/resources/features", glue = "com.yourpackage.stepdefs", parallel = true, threadCount = 2 ) public class TestRunner { }
同时在Maven的Failsafe插件中保持并行配置(可设置为classes或methods,Cucumber会接管Feature级并行逻辑)。
情况B:使用低版本Cucumber(需借助并行插件)
添加cucumber-jvm-parallel-plugin自动生成每个Feature对应的TestRunner,再让Maven并行执行这些生成的Runner类:
<plugin> <groupId>com.github.temyers</groupId> <artifactId>cucumber-jvm-parallel-plugin</artifactId> <version>5.0.0</version> <executions> <execution> <id>generateRunners</id> <phase>generate-test-sources</phase> <goals> <goal>generateRunners</goal> </goals> <configuration> <glue>com.yourpackage.stepdefs</glue> <featuresDirectory>src/test/resources/features</featuresDirectory> <outputDirectory>target/generated-test-sources/cucumber</outputDirectory> <parallelScheme>FEATURE</parallelScheme> </configuration> </execution> </executions> </plugin>
然后修改Failsafe插件的并行配置:
<parallel>classes</parallel> <threadCount>2</threadCount> <forkCount>2</forkCount> <reuseForks>true</reuseForks>
4. 确保WebDriver实例线程安全
每个并行线程需要独立的WebDriver实例,避免共享导致冲突。可使用ThreadLocal管理WebDriver:
public class DriverManager { private static ThreadLocal<WebDriver> driverThreadLocal = new ThreadLocal<>(); public static WebDriver getDriver() { if (driverThreadLocal.get() == null) { // 根据环境配置初始化WebDriver driverThreadLocal.set(new ChromeDriver()); } return driverThreadLocal.get(); } public static void quitDriver() { WebDriver driver = driverThreadLocal.get(); if (driver != null) { driver.quit(); driverThreadLocal.remove(); } } }
在Step Definitions中使用DriverManager.getDriver()获取实例,并在钩子方法中调用quitDriver()清理资源。
完成以上修复后,执行mvn verify -Denvironment=dev即可启动两个浏览器窗口并行运行两个Feature文件。
内容的提问来源于stack exchange,提问作者dggadhia

