如何通过并行执行隔离黄瓜场景的Webdriver会话?

时间:2019-05-06 10:38:41

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

当前设置是maven并行执行黄瓜,执行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

黄瓜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显然在一个浏览器会话中运行了多个测试,因此Cookies等在Function和Scenarios之间共享,导致它们之间无法正确隔离,从而导致Cookies,Session等问题进一步出现。

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

1 个答案:

答案 0 :(得分:2)

根据Parallel Tests Execution文章:

  

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

     

它们是

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

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

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

  •   

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


如果您的资源允许,您可以在您的surefire插件配置中添加<forkMode>always</forkMode>行,这样Maven将为每个线程创建一个新的JVM实例,因此您将不再遭受竞争状况的困扰,但是您的测试将开始消耗方式更多的RAM。

<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>