不能 运行 使用 TestNG 和 SpringBootTest 并行测试 Cucumber

Cant run Cucumber tests in parallel using TestNG and SpringBootTest

我正在尝试 运行 使用 TestNG 和 SpringBootTest 并行进行 2 个 Cucumber 测试,但是当我的测试执行时,会发生以下情况

我不确定为什么一个测试停止执行,欢迎任何帮助。

回购:https://github.com/cmccarthyIrl/spring-cucumber-testng-parallel-test-harness

测试运行程序

@CucumberOptions(
        features = {
                "src/test/resources/feature/"
        },
        plugin = {
                "pretty",
                "html:target/cucumber/report-html",
                "json:target/cucumber/report.json",
                "junit:target/cucumber/junit_report.xml",
                "timeline:target/cucumber/timeline"
        })
public class ParallelRunner extends AbstractTestNGCucumberTests {

    @Override
    @DataProvider(parallel = true)
    public Object[][] scenarios() {
        return super.scenarios();
    }

}

DriverManager Class

@Component
public class DriverManager {

    private WebDriver webDriver;
    private Wait<WebDriver> webDriverWait;
    private static ThreadLocal<WebDriver> driverThreadLocal = new ThreadLocal<>();
    private static ThreadLocal<Wait<WebDriver>> driverWaitThreadLocal = new ThreadLocal<>();

    @Autowired
    private ApplicationProperties applicationProperties;

    public void driverManager() {
        if (getDriver() == null) {
            setLocalWebDriver();
        }
    }

    public void setLocalWebDriver() {
        switch (applicationProperties.getBrowser()) {
...
            case ("firefox"):
                System.setProperty("webdriver.gecko.driver", System.getProperty("user.dir") + "/src/test/resources/geckodriver");
                FirefoxOptions firefoxOptions = new FirefoxOptions();
//                firefoxOptions.setHeadless(true);
                firefoxOptions.setCapability("marionette", true);

                webDriver = new FirefoxDriver(firefoxOptions);
                break;
       ...
            default:
                throw new NoSuchElementException("Failed to create an instance of WebDriver for: " + applicationProperties.getBrowser());
        }
        driverThreadLocal.set(webDriver);
        webDriverWait = new WebDriverWait(webDriver, 10, 500);
        driverWaitThreadLocal.set(webDriverWait);
        try {
            Runtime.getRuntime().addShutdownHook(CLOSE_THREAD);
        }catch(Exception ex){
            System.out.println("ex.getMessage() = " + ex.getMessage());
        }
    }

    ...

更改 PageObject 注释并添加 @Scope("prototype") Refer

@Retention(RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
@PageFactoryFinder(FindBy.FindByBuilder.class)
@Lazy
@Component
@Scope("prototype")
public @interface PageObject {
}

现在,对于每个场景,您都应该获取页面对象的新实例。

此外,我可能更愿意在 DriverManager 中进行一些更改,例如

driverThreadLocal.set(new FirefoxDriver(firefoxOptions));
driverWaitThreadLocal.set(new WebDriverWait(driverThreadLocal.get(), 10, 500));

您可以删除此清理驱动程序的逻辑

尝试{ Runtime.getRuntime().addShutdownHook(CLOSE_THREAD); }赶上(异常前){ System.out.println("ex.getMessage() = " + ex.getMessage()); }

将Driver.Quit移动到Hooks.javahttps://github.com/cmccarthyIrl/spring-cucumber-test-harness/blob/testng/wikipedia/src/test/java/com/cmccarthy/step/Hooks.java

  @After
    public void afterScenario(Scenario scenario) {
        hookUtil.endOfTest(StringUtils.capitalize(scenario.getStatus().toString()));
        driverManager.getDriver().quit();
    }