Параллельный тестовый прогон с огурцом - PullRequest
2 голосов
/ 19 апреля 2019

В настоящее время я пытаюсь выполнить параллельный тестовый запуск с огурцом.Мне удалось запустить двух разных бегунов одновременно с надёжным плагином.Теперь я хочу проверить, можно ли запускать файл SingleRunner несколько раз параллельно.

Пример: у меня есть SignUpRunnerTest.java, поэтому мне нужно запустить его на нескольких платформах параллельно. Возможно ли это?

Это мой файл Runner

import cucumber.api.CucumberOptions;
import cucumber.api.cli.Main;
import cucumber.api.junit.Cucumber;

import java.util.List;

import javax.management.MXBean;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty", "html:target/html/", "json:target/cucumber.json", "junit:TEST-all.xml"},
        features = "src/test/java/resources/features/Search.feature", glue = {"com.browserstack.stepdefs"})
public class SignUpeRunnerTest {


}

Без подхода Runner

public class SignUpeRunnerTest {

    @Test
    public void test2() {
    Main.main(new String[]{"--threads", "4","-g", "com.browserstack.stepdefs", "src/test/java/resources/features/"});
    }

}

Фабричный класс

`import org.openqa.selenium.WebDriver;

public final class DriverFactory {

    private static ThreadLocal<WebDriver> drivers = new ThreadLocal();

    //To quit the drivers and browsers at the end only. 
    private static List<WebDriver> storedDrivers = new ArrayList();

    static {
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run(){
                storedDrivers.stream().forEach(WebDriver::quit);
            }
          });
    }

    private DriverFactory() {}

    public static WebDriver getDriver() {
        return drivers.get();
    }

    public static void addDriver(WebDriver driver) {
        storedDrivers.add(driver);
        drivers.set(driver);
    }

    public static void removeDriver() {
        storedDrivers.remove(drivers.get());
        drivers.remove();
    }   
}

`

Step Class

import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;

открытый класс SearchPage {private static WebDriver webDriver;

public SearchPage(WebDriver webDriver) {
    this.webDriver = webDriver;
    DriverFactory.addDriver(webDriver);
}

private By searchTermField = By.name("q");
private By submitSearch = By.id("_fZl");

public void enterSearchTerm(String searchTerm) {
    DriverFactory.getDriver().findElement(searchTermField).sendKeys(searchTerm);
}

public void submitSearch() {
    DriverFactory.getDriver().findElement(submitSearch).click();
}

}

Это мой файл POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.browserstack</groupId>
    <artifactId>cucumber-jvm-java-browserstack</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>cucumber-jvm-java-browserstack</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <cucumber.jvm.parallel.version>2.2.0</cucumber.jvm.parallel.version>
        <surefire.maven.plugin.version>2.19.1</surefire.maven.plugin.version>
        <acceptance.test.parallel.count>4</acceptance.test.parallel.count>
    </properties>

    <dependencies>

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

        <!-- https://mvnrepository.com/artifact/com.gfk.senbot/senbot-maven-plugin -->

  <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.0.1</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M3</version>
                <configuration>
                    <parallel>methods</parallel>
                    <threadCount>4</threadCount>
                    <reuserForks>false</reuserForks>
                    <testErrorIgnore>true</testErrorIgnore>
                    <testFailureIgnore>true</testFailureIgnore>
                    <includes>
                        <include>**/*RunnerTest.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Ответы [ 2 ]

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

Файлы объектов огурца могут быть выполнены без использования бегуна с помощью main() method in class Main of package cucumber.api.cli. Обращайтесь к этой статье cli и этой статье . Используя это возможно это будет работать Нужны некоторые изменения, хотя.

  1. Скопируйте код BrowserStackJUnitTest в новый класс, переименуйте его во что-нибудь другое, скажем NewBSTest. Этот класс будет использоваться для запуска теста.

  2. Потребуются некоторые изменения в том, как драйвер, созданный для каждого потока, будет доступен по коду селена и огурца.

  3. Необходимо использовать фабрику для хранения драйверов в переменной ThreadLocal в NewBSTest. Вы можете обратиться к этому класс .

  4. В созданном вами классе NewBSTest удалите строку № 30 - public WebDriver driver;. Измените строку 94 , чтобы добавить созданный RemoteWebDriver в переменную ThreadLocal. Что-то вроде DriverFactory.addDriver(driver). Добавьте DriverFactory.removeDriver() в методе tearDown() строка 98 , возможно, первая строка. Изменить существующий driver.quit (); до DriverFactory.getDriver().quit().

5. Удалите хук отключения в DriverFactory, BrowserStack все равно будет выходить из фактического драйвера.

  1. Теперь в коде селена или огурца вы можете получить доступ к драйверу, используя DriverFactory.getDriver(). Это очень сильно повлияет на ваш существующий код.

  2. В классе NewBSTest добавьте такой метод тестирования. Надеемся, что это сработает, и одинаковые функции будут выполняться в каждой из настроенных сред стека браузеров.

@Test
public void test() {
Main.main(new String[]{""-g", "stepdef", "src/test/resources/features/"});
}
0 голосов
/ 20 апреля 2019

Зависимость info.cukes (довольно старая), которая поддерживает огурец только до версии 1.2.5 и больше не поддерживает это после 12 сентября 2016 года

Другая сторона, зависимость io.cucumber поддерживает Cucumber начиная с версии 2.0.x до последней версии 4.3.x, доступной на данный момент (Cucumber-JVM 4.0 дает вам большую гибкость для реализация параллельного выполнения) и ниже приведены шаги для реализации параллельного выполнения с использованием io.cucumber (здесь вам не нужно создавать отдельных бегунов для каждого файла функций и не нужно использовать какой-либо старый плагин, такой как плагин jvm-parallel)

1.Добавить правильный набор зависимостей. Я следовал JUnit во время реализации.

<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-picocontainer</artifactId>
    <version>4.2.3</version>
    <scope>test</scope>
</dependency>

2.Добавление подключаемого модуля Maven-Surefire в POM.XML

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M3</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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...