当前位置: 首页 > 知识库问答 >
问题:

cucumber的并行测试运行

拓拔安邦
2023-03-14

我目前正在尝试使用Cucumber实现并行测试运行。我设法使用万无一失的插件同时运行了两个不同的运行程序。现在我想检查是否可以并行运行SingleRunner文件多次。

我有一个签名测试。所以我需要在几个平台上并行运行。有可能吗?

这是我的跑步者档案

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 {


}

无跑道进近

public class SignUpeRunnerTest {

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

}

工厂级

`导入org . open QA . selenium . web driver;

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();
    }   
}

`

阶梯班

导入org.openqa.selenium。通过导入org.openqa.selenium.WebDriver;

公共类SearchPage{私有静态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>

共有3个答案

楮阳
2023-03-14

这个问题你可能已经有答案了。为了并行运行测试用例,需要额外的设置,如下面的https://cucumber.io/docs/guides/parallel-execution/链接所示

根据这个链接,如果您使用的是surefire插件,那么运行类的包名称应该是并行的。

对于选择设备类型,您可以为功能文件添加标签,并在挂接之前进一步获取标签。我认为对于选择功能,可能有更好的方法available.Below逻辑对我有用-

@ Before(order = 2)public void launch browser(场景sc){ String browser = " Firefox ";//ArrayList s =(ArrayList)sc . getsourcetagnames();

    //scenarios having this tag will be ignored and not run
    if(s.contains("@chrome"))
        browser = "chrome";
    else if(s.contains("@firefox"))
        browser = "firefox";

    driverfactory=new DriverFactory();
    driver=driverfactory.init_driver(browser);
    
}
慕鹏
2023-03-14

Cucumber功能文件可以在不使用任何运行程序的情况下执行,方法是使用Cucumber.api.cli包的类main中的<code>main()方法。请参阅本cli用法和本文。用这个也许会有用。不过需要一些改变。

>

  • 将BrowserStackJUnitTest的代码复制到一个新类中,将其重命名为其他东西,例如NewBSTest。此类将用于运行测试。

    硒和cucumber代码访问为每个线程创建的驱动程序的方式需要进行一些更改。

    需要使用工厂将驱动程序存储在NewBSTest中的ThreadLocal变量中。U可以引用这个类。

    在你创建的NewBSTest类中,删除第30行-公共WebDriver驱动程序;。更改第94行以将创建的RemteWebDriver添加到ThreadLocal变量中。类似于DriverFactory.addDriver(驱动程序)。在方法tearDown()第98行中添加DriverFactory.removeDriver(),可能是第一行。将现有driver.quit()更改为DriverFactory.getDriver()。退出()

    5.移除DriverFactory中的关闭挂钩,BrowserStack无论如何都会退出实际的驱动程序。

    现在,在硒或cucumber代码中,您可以使用DriverFactory.getDriver()访问驱动程序。这将对您现有的代码产生很大影响。

    在< code>NewBSTest类中添加一个测试方法,如下所示。希望这能起作用,并且相同的特性将在每个配置的browserstack环境中执行。

    @Test
    public void test() {
    Main.main(new String[]{""-g", "stepdef", "src/test/resources/features/"});
    }
    

  • 诸彬郁
    2023-03-14

    info.cukes依赖项(很老了)只支持cumber 1 . 2 . 5版,2016年9月12日以后不再支持

    另一方面,io.cucumber依赖支持cucumber从v 2.0.x到目前可用的最新v 4.3 . x(Cucumber-JVM 4.0为实现并行执行提供了很大的灵活性),下面是使用io.cucumber实现并行执行的步骤(这里您不需要为每个特性文件创建单独的运行器

    1.Adding正确的依赖集。我在实现过程中遵循了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.AddingMaven-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>
    
     类似资料:
    • Cucumber测试没有并行运行(Cucumber jvm并行插件)? 如果我使用runner类执行测试,一次将执行一个功能文件,但是当将以下插件添加到POM文件时,似乎没有功能文件执行? 即使我指向了正确的功能文件文件夹? 我的POM文件:

    • Javav8. x-Springv5. xcucumberv4.2.0 我尝试了temyers/cucumber jvm并行插件,效果很好,但当我进入他们的gitihub页面时,他们宣布停止使用该插件b/c cucumber已经开始支持cucumber jvm 4.0的并行测试运行支持。0 我有使用以下maven依赖项的现有测试。 我有两个问题让我困惑。 为了使用cucumber-jvm,我必须更

    • 我是Serenity和BDD的新手。我有一个基于Serenity Cucumber和Page based模型的小型演示项目。项目结构如下: 登录和注销功能大约有8种情况。 我希望能够并行运行功能文件。实现这一点的最简单和最有效的方法是什么? 到目前为止我已经 > 为每个功能创建了单独的 Runner 类,然后使用故障安全或万无一失的插件 - 这是我不想要的,因为我不希望每个功能文件都有新的运行器。

    • 有没有人能告诉我为什么我不能使用Maven运行任何测试。 已配置SureFire插件 在runner类下设置胶合代码 “测试”被追加到runner类 注意:如果我将文件作为Junit运行,那么它可以正确地运行所有场景。只有当我使用Maven运行它时,才不会运行任何测试。

    • 我正在使用cucumber测试和testng,我计划并行运行测试。我以前有使用testng框架和并行执行的经验,如果不使用mavensurfire插件(pom.xml),我如何实现相同的效果 我的配置, Cucumber JVM,TestNGCucumberRunner。用于触发特性文件的java文件

    • 我有一些cucumber特性,可以通过IDE运行find功能,但现在我需要通过命令行使用“mvn test”命令来执行它们。 CMD输出如下: