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

Java 如何使用Maven和courgette并行运行cucumber jvm测试场景?,java,maven,junit,cucumber,Java,Maven,Junit,Cucumber,我正试图在Maven中基于cucumber标记运行一套JUnitCucumber特性。我可以让它们按顺序运行,但不能并行运行。 我找到了一个名为小胡瓜的软件包,它可以帮我解决这个问题 但是,我无法运行测试,我已经查看了示例maven项目,它在Cucumber.class中运行良好,但在courgette中抛出了一个错误 任何帮助都将不胜感激 我已在pom中包括以下内容 <repositories> <repository> <

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

但是,我无法运行测试,我已经查看了示例maven项目,它在Cucumber.class中运行良好,但在courgette中抛出了一个错误

任何帮助都将不胜感激

我已在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>
我得到以下错误

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)
java.lang.CompatibleClassChangeError:实现类
位于java.lang.ClassLoader.defineClass1(本机方法)
位于java.lang.ClassLoader.defineClass(ClassLoader.java:763)
位于java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
位于java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
在java.net.URLClassLoader.access$100(URLClassLoader.java:73)
在java.net.URLClassLoader$1.run(URLClassLoader.java:368)
在java.net.URLClassLoader$1.run(URLClassLoader.java:362)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:361)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
位于cucumber.runtime.io.ResourceLoaderClassFinder.loadClass(ResourceLoaderClassFinder.java:38)
位于cucumber.runtime.io.ResourceLoaderClassFinder.GetSubstands(ResourceLoaderClassFinder.java:26)
在cumber.runtime.Reflections.instanceSubclass(Reflections.java:28)中
atcumber.runtime.runtime.loadBackends(runtime.java:99)
atcumber.runtime.runtime.(runtime.java:66)
在courgette.runtime.courgetefeatureloader.createRuntime(courgetefeatureloader.java:60)
在courgette.runtime.CourgetteFeatureLoader。(CourgetteFeatureLoader.java:30)
位于courgette.api.junit.courgette.(courgette.java:39)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
位于org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
位于org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
位于org.junit.internal.builders.AllDefaultPossibilityBuilder.runnerForClass(AllDefaultPossibilityBuilder.java:26)
位于org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
位于org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
位于com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49)
位于com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
位于com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
位于com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

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

请注意,Cucumber jvm从v4.x开始就提供了并行选项没有N种方法(如下所述)可以实现并行执行,最可取的方法之一是从v4.0.0开始使用Cucumber(特别是当我们必须只在多个浏览器上而不是在多个操作系统上实现并行执行时)

  • 黄瓜JVM并行插件
  • TestNG
  • 硒栅
  • 码头工人
  • 小胡瓜
  • 为了实现4.0.0,请在Maven配置中使用以下cucumber依赖项集,我们也将实现依赖项注入

     <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>
    
    
    黄瓜
    黄瓜爪哇
    4.2.3
    黄瓜
    黄瓜刺柏
    4.2.3
    朱尼特
    朱尼特
    4.12
    黄瓜
    数据表
    1.1.12
    黄瓜
    黄瓜试验
    4.2.3
    黄瓜
    黄瓜皮容器
    4.2.3
    
    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>   
    
    
    org.apache.maven.plugins
    maven surefire插件
    ${maven surefire.plugin.version}
    方法
    1.
    假的
    真的
    真的
    **/*RunCukeTest.java
    
    谢谢你的帮助,我现在已经解决了这个问题。啊,编码的乐趣。因此,为了获得不同浏览器的并行测试选项,我可以为每个浏览器创建一个运行程序。带着黄瓜标签我想跑?
        <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>