Невозможно использовать аннотации Junit или TestNG, такие как @BeforeClass @AfterClass, при использовании плагина Failsafe + Cucumber Parallel - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь провести параллельное тестирование с использованием Selenium и Cucumber. Итак, у нас есть около 130 тестовых сценариев, для запуска которых требуется около 1,5 часов.Теперь, запустив все эти тесты параллельно, я могу сократить время.

Я использую следующие 2 плагина:

 <plugin>
                <groupId>com.github.temyers</groupId>
                <artifactId>cucumber-jvm-parallel-plugin</artifactId>
                <version>5.0.0</version>
                <executions>
                    <execution>
                        <id>generateRunners</id>
                        <phase>generate-test-sources</phase>
                        <goals>
                            <goal>generateRunners</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>runner</outputDirectory>
                            <glue>
                                <package>${PackageName}</package>
                            </glue>
                            <featuresDirectory>${FeaturesDirectory}</featuresDirectory>
                            <cucumberOutputDir>target/cucumber-parallel</cucumberOutputDir>
                            <format>json</format>
                            <plugins>
                                <plugin>
                                    <name>json</name>
                                </plugin>
                            </plugins>
                            <useTestNG>true</useTestNG>

                                                       <parallelScheme>SCENARIO</parallelScheme>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>3.0.0-M3</version>
                <executions>
                                        <execution>
                        <id>acceptance-test</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>

                        </goals>

                        <configuration>
                            <forkCount>3</forkCount>
                            <reuseForks>true</reuseForks>
                            <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
                            <includes>
                                <include>**/Parallel*IT.class</include>
                            </includes>
                            <properties>
                                <property>
                                    <name>junit</name>
                                    <value>false</value>
                                </property>
                            </properties>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

Итак, идея в том, что если я задаю счетчик потоков или счетчик форков 3, он вызовет 3 браузера и запустит тесты.С CUcumber JVM Parallel Plug я создал 131 бегун для всех сценариев.С аннотацией @Before от Cucumber я могу вызвать браузер один раз, и для всех последующих экземпляров он будет использовать один и тот же экземпляр браузера (что позволяет сэкономить время, чтобы снова и снова открывать и закрывать браузеры.)

Теперьесли бы мы могли использовать @BeforeClass или @AfterClass, это было бы гораздо более простым решением.Но как мы не можем.Мне пришлось использовать @Before, таким образом вызывая один и тот же метод снова и снова с каждым сценарием.

import cucumber.api.java.Before;


public class stepdefs(){
static Browser browser;

    public static Scenario scenario;
    static TestConfiguration configuration = TestConfiguration.getConfiguration();
    @Before
    public void before(Scenario scenario) {

        if (browser == null) {

            if (System.getProperty("seleniumRemoteWebDriver") == null) {

                WebTestSettings webTestSettings = configuration.getWebTestSettings();

                browser = Browser.LOAD_LOCAL_BROWSER(webTestSettings.externalBrowser, webTestSettings.driverPath);

            } else {
                if (System.getProperty("version") == null) {
                    browser = new RemoteBrowser(System.getProperty("browser"), System.getProperty("seleniumRemoteWebDriver"), System.getProperty("platform"));

                } else {
                    browser = new RemoteBrowser(System.getProperty("browser"), System.getProperty("seleniumRemoteWebDriver"), System.getProperty("platform"), System.getProperty("version"));
                }
            }

            TestContext.getContext().setBrowser(browser);


        }

        Browser browser = TestContext.getContext().getBrowser();
        this.scenario = scenario;
        browser.driver.manage().window().maximize();
           }}

Так что это сработало для @Before, но не сработает для @After.Здесь я хочу закрыть все экземпляры браузера после завершения теста.Но как я узнаю, какой из них является последним?Или как мне закрыть все экземпляры?Есть ли способ использовать @AfterClass или @BeforeCLass или использовать SetupTeardown с JUnit / TestNG + Maven-Failsafe-plugin?

Я пробовал использовать Junit и TestNG оба.Раньше я использовал файл Runner, который распространяется на класс SetupTearDown для непараллельного выполнения.Но, очевидно, не может использовать это, поскольку классы бегунов генерируются во время выполнения.Пробовал использовать этап до интеграции, а также этап после интеграции.Который не бежал.Может быть, я не правильно использую эту фазу.

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Давайте двигаться шаг за шагом.Сначала мы будем использовать Cucumber V начиная с 4.0 и далее, поскольку он поддерживает параллельное выполнение, и добавим ниже зависимости для его реализации.

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>4.2.3</version>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>4.2.3</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>datatable</artifactId>
    <version>1.1.12</version>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-testng</artifactId>
    <version>4.2.3</version>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-picocontainer</artifactId>
    <version>4.2.3</version>
    <scope>test</scope>
</dependency>  

Затем мы начнем использовать maven-surefireПлагин для того, чтобы фактически запускать тесты параллельно, используя свойства Parallel & ThreadCount, как указано ниже -

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire.plugin.version}</version>
    <configuration>
        <parallel>methods</parallel>
        <threadCount>1</threadCount>
        <reuserForks>false</reuserForks>
        <testErrorIgnore>true</testErrorIgnore>   
        <testFailureIgnore>true</testFailureIgnore>
        <includes>
            <include>**/*RunCukeTest.java</include>
        </includes>
    </configuration>
</plugin>

В зависимости от реализации, он будет запускать тестовые случаи в другом браузере и закрывать все.Теперь, если вы хотите сделать что-то конкретное только один раз до или после выполнения, вы должны использовать @BeforeClass или @AfterClass в файле Java RunCuke.Вещи надежны.

0 голосов
/ 08 апреля 2019

Просмотр вашего существующего кода не является потокобезопасным и не позволит вам выполнять параллельное выполнение из-за статического Browser.Вы должны попытаться использовать QAF - чистую реализацию TestNG для BDD / Gherkin , которая обеспечивает реализацию gherkin , которая позволяет использовать все прослушиватели TestNG, а также иметь дополнительные прослушиватели дляводитель и элемент.Кроме того, qaf позаботился об управлении драйверами, поэтому вам может не понадобиться писать дополнительный код для управления драйверами или другими специфическими задачами автоматизации тестирования.qaf позаботится о том, чтобы закрыть все экземпляры браузера после теста, а также разрешит параллельное выполнение на уровне сценария.

...