【问题标题】:Any one able to run parallel tests: Using Cucumber 6.10.2 or newer versions, cucumber-Spring, Junit 4.13.2 and Mavensurefire 3.0.0.M3 and above任何能够运行并行测试的人:使用 Cucumber 6.10.2 或更新版本、cucumber-Spring、Junit 4.13.2 和 Mavensurefire 3.0.0.M3 及更高版本
【发布时间】:2022-11-19 02:10:03
【问题描述】:
使用以下版本组合,通过 surefire 的并行执行无法正常工作。如果我们将 Cucumber 更改为 4.8.1,则可以通过 surefire 进行并行执行。
**Cucumber 6.10.2 或更新版本、cucumber-Spring、Junit 4.13.2 和 Maven surefire 3.0.0.M3 及更高版本**
但是一旦把cucumber版本改成6.10.2就不行了。具体问题是,webdriver 会话在线程之间泄漏,或者简单地说,多个线程作用于同一个 webdriver 会话。
我做了很多研究并在 POM 中尝试了多种配置,但它没有用:试用 1.从 cucumber-junit 中排除了 junit-jupiter 和 jupiter-vintage-engine,从 cucumber-Spring 中排除了 junit-jupiter 和 jupiter-vintage-engine,向 surefire 插件添加了 surefire-junit47 依赖项试用 2.添加了 jupiter-vintage-engine 作为对 surefire 插件的依赖试验 3.使用 Spring Boot 版本 2.6.2、Cucumber 6.10.2 或更新版本、cucumber-Spring、Junit 5 和 surefire 3.0.0.M7
将不胜感激任何帮助。
【问题讨论】:
标签:
multithreading
junit4
maven-surefire-plugin
cucumber-junit
cucumber-spring
【解决方案1】:
如果我们将 Cucumber 更改为 4.8.1,则可以通过 surefire 进行并行执行。
但是一旦把cucumber版本改成6.10.2就不行了。
项目通常会发布包含所有相关更改的更改日志。升级主要版本时应参考它。
https://github.com/cucumber/cucumber-jvm/blob/main/CHANGELOG.md
具体问题是,webdriver 会话在线程之间泄露,或者简单地说,多个线程作用于同一个 webdriver 会话。
这是Spring的一个特点!使用 Spring 时,您将在所有测试之间共享相同的应用程序上下文。
您可以通过使用 Web 驱动程序将 bean 标记为场景范围来防止这种情况。
@Component
@ScenarioScope
public class WebDriverComponent {
private WebDriver driver = // create WebDriverhere
public WebDriver getDriver() {
return driver;
}
}
https://github.com/cucumber/cucumber-jvm/tree/main/cucumber-spring#sharing-state
如果你想在同一个线程的场景之间重用 WebDriver,你可以使用本地线程:
@Component
@ScenarioScope
public class WebDriverComponent {
private static ThreadLocal<WebDriver> driver = ThreadLocal.withInitial( create WebDriverhere );
public WebDriver getDriver() {
return driver.get();
}
}