Как изолировать сеансы Webdriver для сценариев Cucumber с параллельным выполнением? - PullRequest
0 голосов
/ 06 мая 2019

Текущая настройка: maven выполняет параллельное выполнение огурца, webdriver, chromedriver для проверки моего программного обеспечения:

Maven:

<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 и т. д. распределяются между функциями и сценариями, что приводит к их неправильной изоляции друг от друга, что приводит к дальнейшим проблемам с файлами cookie, сеансами и т. д.

Как правильно изолировать каждый тестовый случай (сеанс ChromeDriver) при параллельном запуске Webdriver через Cucumber-JVM?

1 Ответ

2 голосов
/ 06 мая 2019

Согласно Выполнение параллельных тестов статья:

Нам также необходимо убедиться, что для разработки тестов, которые могут выполняться одновременно, нам необходимо разработать тесты, соответствующие некоторым передовым методам.

Они есть,

  • Методы независимых тестов: тесты должны быть независимы друг от друга.

  • Использование потоковобезопасных ссылок: тесты должны использовать потоково-безопасные переменные. Например, избегайте использования статических ссылок в тестах.

  • Повторяется: тесты должны всегда возвращать одинаковые результаты для одной и той же версии приложения и входов теста.

Кажется, вы используете WebDriverManager , и когда вы вызываете chromedriver() функцию , она возвращает соответствующий экземпляр WebDriver из instanceMap , который является статическим и, похоже, это является основной причиной вашей проблемы. Лучше придерживаться ThreadLocal pattern , таким образом вы получите уверенность в том, что каждый экземпляр WebDriver абсолютно независим от других.


Если ваши ресурсы позволяют, вы можете добавить <forkMode>always</forkMode> строку к вашей конфигурации плагина 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...