使用cucumber-junit-platform-engine+Selenium测试时线程过多如何解决
问题根因
- Cucumber 6.10.4版本默认采用EAGER测试发现模式,会在测试启动时一次性初始化所有场景实例,触发
@Before钩子初始化driver,而非等待线程调度后再初始化对应场景的资源 - JUnit Jupiter的
@BeforeEach注解对Cucumber场景生命周期不生效,Cucumber只能识别io.cucumber.java包下的钩子注解,所以你替换注解的操作不会有效果
解决步骤
- 新增junit-platform配置项,开启懒加载发现模式,仅在线程调度到对应场景时才初始化场景实例,触发钩子创建driver:
在你的junit-platform.properties文件中追加以下配置:
cucumber.junit.platform.execution.discovery-mode=lazy cucumber.execution.parallel.mode=same_thread
- 调整
ScenarioContext和WebDriver的Bean作用域,保证每个场景/线程对应独立的实例,避免资源冲突:
给ScenarioContext类添加@Scope("cucumber-glue")注解,WebDriver实例的创建逻辑绑定到当前场景的生命周期,不要设置为全局单例。 - 验证执行效果:修改完成后重新运行测试,同时存活的driver实例(浏览器窗口)数量最多等于你配置的
parallelism=4,每个场景执行结束调用driver.quit()释放资源后,下一个待执行场景才会初始化新的driver。
内容的提问来源于stack exchange,提问作者Madalina P.
相关产品推荐
相关产品推荐

