【问题标题】:How to isolate Webdriver sessions for Cucumber scenarios with parallel execution?如何隔离具有并行执行的 Cucumber 场景的 Webdriver 会话?
【发布时间】:2019-05-06 10:38:41
【问题描述】:

当前设置是 maven 并行执行 cucumber,执行 webdriver,执行 chromedriver 来测试我的软件:

马文:

<project>
  ...
    <build>
      ...
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M3</version>
                <configuration>
                    <parallel>both</parallel>
                    <threadCount>3</threadCount>
                    <runOrder>random</runOrder>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

小黄瓜:

Function: Example

    Scenario: Example 1
       When I do something
       Then I expect something

    Scenario: Example 2
       When I do some other thing
       Then I expect some other thing

Cucumber-JVM / Webdriver-JVM / Chromedriver:

    @Before
    public void setUp() {
        WebDriverManager.chromedriver().setup();
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--window-size=1920,1080");
        driver = new ChromeDriver(options);
        driver.navigate().to(baseUrl);
    }

    @After
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }

原则上,这可以正常工作。测试以随机顺序并行执行,按照 maven pom 中的说明,在每个场景之前调用setUp(),在每个场景之后调用tearDown()

然而,ChromeDriver 显然在一个浏览器会话中运行多个测试,因此 Cookie 等在 Functions 和 Scenarios 之间共享,导致它们没有正确地相互隔离,从而导致 cookie、会话等进一步出现问题。

通过 Cucumber-JVM 并行运行 Webdriver 时如何正确隔离每个测试用例(ChromeDriver 会话)?

【问题讨论】:

  • "ChromeDriver 显然在一个浏览器会话中运行多个测试" -- 如果驱动程序是在 Before 钩子中创建并在 After 钩子中关闭的,它应该为每个场景打开新的浏览器。驱动变量是静态的吗?你应该考虑使用 ThreadLocal 来存储每个线程的驱动程序。
  • 您是否尝试过运行匿名/隐身会话?

标签: maven selenium selenium-webdriver selenium-chromedriver cucumber-jvm


【解决方案1】:

根据Parallel Tests Execution文章:

我们还需要确保开发可以同时执行的测试,我们需要遵循一些最佳实践来开发测试。

他们是,

  • 独立测试方法:测试应该相互独立。

  • 线程安全引用的使用:测试应使用线程安全变量。例如,避免在测试中使用静态引用。

  • 可重复:对于相同版本的应用程序和测试输入,测试应始终返回相同的结果。

您似乎正在使用WebDriverManager,当您调用chromedriver() function 时,它会从instanceMap(即static)返回相关的WebDriver 实例,这似乎是您的问题的根本原因。最好坚持ThreadLocal pattern,这样您就会确信每个 WebDriver 实例绝对独立于其他实例。


如果您的资源允许,您可以将&lt;forkMode&gt;always&lt;/forkMode&gt; 行添加到您的surefire 插件配置中,这样Maven 将为每个线程创建一个新的JVM 实例,因此您将不再受到竞争条件的影响,但您的测试将开始消耗更多内存。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M3</version>
            <configuration>
                <parallel>both</parallel>
                <threadCount>3</threadCount>
                <runOrder>random</runOrder>
                <forkMode>always</forkMode> <!--this should help-->
            </configuration>
        </plugin>
    </plugins>
</build>

【讨论】:

  • 非常感谢。这解决了我的问题。
  • 只是一个小注释:&lt;forkMode&gt; 已弃用,人们现在应该使用&lt;forkCount&gt;&lt;reuseForks&gt;
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 2017-05-26
  • 2022-06-30
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多