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

如何使用Maven和courgette并行运行cucumber jvm测试场景?

殳自怡
2023-03-14

我正试图在Maven中基于cucumber标记运行一套JUnitCucumber特性。我可以让它们按顺序运行,但不能并行运行。我找到了一个名为小胡瓜的软件包,它可以帮我解决这个问题。

然而,我无法让测试运行,我看了github上的示例maven项目,它在Cucumber.class运行良好,但在西葫芦上抛出一个错误。

任何帮助将不胜感激。

我已在pom中包括以下内容

<repositories>
        <repository>
            <id>jcenter</id>
            <url>https://jcenter.bintray.com/</url>
        </repository>
</repositories>
<dependency>
    <groupId>io.github.prashant-ramcharan</groupId>
    <artifactId>courgette-jvm</artifactId>
    <version>2.4.4</version>
    <type>jar</type>
</dependency>

我是在召唤我的跑步者。

import courgette.api.CourgetteOptions;
import courgette.api.CourgetteRunLevel;
import courgette.api.junit.Courgette;
import cucumber.api.CucumberOptions;
import org.junit.runner.RunWith;

@RunWith(Courgette.class)
@CourgetteOptions(
        threads = 1,
        runLevel = CourgetteRunLevel.FEATURE,
        rerunFailedScenarios = false,
        showTestOutput = true,
        cucumberOptions = @CucumberOptions(features="src/test/resources/Features/Online/Regression/",
        plugin={"html:target/OD.html","json:target/OD.json"
                },tags={"@Max"},
                glue="com.Online"
                ))
 public class ONLINE_Regression_RunnerTest {
}

我得到以下错误。

java.lang.IncompatibleClassChangeError: Implementing class

    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at cucumber.runtime.io.ResourceLoaderClassFinder.loadClass(ResourceLoaderClassFinder.java:38)
    at cucumber.runtime.io.ResourceLoaderClassFinder.getDescendants(ResourceLoaderClassFinder.java:26)
    at cucumber.runtime.Reflections.instantiateSubclasses(Reflections.java:28)
    at cucumber.runtime.Runtime.loadBackends(Runtime.java:99)
    at cucumber.runtime.Runtime.<init>(Runtime.java:66)
    at courgette.runtime.CourgetteFeatureLoader.createRuntime(CourgetteFeatureLoader.java:60)
    at courgette.runtime.CourgetteFeatureLoader.<init>(CourgetteFeatureLoader.java:30)
    at courgette.api.junit.Courgette.<init>(Courgette.java:39)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

共有3个答案

季凡
2023-03-14

有N种方法(如下所述)可以实现并行执行,其中一种最可取的方法是从V4.0开始使用Cucumber。0(特别是当我们必须在多个浏览器上而不是在多个操作系统上实现并行执行时)

  1. cucumberJVM并行插件

为了实现4.0。0,请将下面的cucumber依赖项集与Maven配置一起使用,我们也将实现依赖项注入。

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

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </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>
        </dependency>

Maven Surefire配置-

    <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>
            <testFailureIgnore>true</testFailureIgnore>
            <redirectTestOutputToFile>true</redirectTestOutputToFile>
            <includes>
                <include>**/*RunCukeTest.java</include>
            </includes>
        </configuration>
    </plugin>   
阎宝
2023-03-14

通过将依赖关系移动到pom的顶部,我能够消除冲突。似乎与测试ng依赖项存在冲突。

孙泉
2023-03-14

注意,从v4开始,Cucumber jvm就提供了并行选项。十、

 类似资料:
  • 我想为詹金斯创建一个简单的硒项目。当我用Runner.java运行测试时,输出显示0种情况。当我用mvn运行我的测试时,e.g.mvn干净的验证-Dcucumber.options="--tags@烟雾"输出显示我构建成功 我所有的类都在src/test/java/package中 Runner:src/test/java/Runner/Runner。JAVA 胶水:src/test/java/胶

  • 需要一些帮助来获得并行运行testng测试用例的正确方法。

  • 我正在尝试使用2个xml文件与Maven并行运行我的测试,但似乎不起作用。我已经尝试了Maven留档中的步骤/参数:http://maven.apache.org/surefire/maven-surefire-plugin/examples/testng.html 以下是我的pom.xml文件: 这是功能1.xml文件: 我应该做哪些参数/更改才能使其生效? 谢谢你

  • 问题内容: 我在运行Ubuntu的本地计算机上设置Jenkins,将其指向我的jdk,然后进行maven,创建了一个作业来运行我的Selenium测试,并为它提供了项目中pom.xml的路径,但是当我尝试运行该作业时,它立即失败。控制台输出显示 在工作区中构建/ var / lib / jenkins / workspace / new job [new job] $ / usr / share

  • Spock规范如下所示: 是一个测试记录列表,对于该列表的每个成员,方法将按顺序运行。我想要的是,列表的前k个成员运行一个线程,下面的k个成员在第二个线程中运行,等等...理论上,使用Executors框架和类(因为Spock依赖于JUnit),这可以相对容易地完成。 然而,问题是如何将更小的注入到具有方法的类中,因为Spock不允许构造函数,而JUnitCore需要类名(具有测试/规范的类),而