Maven / Junit并行执行-Cucumber-JVM v4.0.0

时间:2018-10-25 21:35:27

标签: maven selenium junit cucumber-jvm cucumber-junit

我正在努力获得与JUnit / Maven一起使用的Cucumber-JVM v4.0.0的新并行执行功能。

按照指定的here,如果您在POM中相应地配置<parallel><threadCount>,并使用依赖注入来共享状态(我正在使用Pico Continer),那么您的Cucumber功能应该并行执行。

但是,当我运行Maven时,它仍然一次仅执行一项功能。

我在下面包括了完整的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.softwareautomation</groupId>
<artifactId>selenium</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>selenium</name>
<url>http://maven.apache.org</url>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>
                <parallel>both</parallel>
                <threadCount>4</threadCount>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>

    <!-- AssertJ -->
    <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>3.11.1</version>
        <scope>test</scope>
    </dependency>

    <!-- Cucumber -->
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>4.0.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>4.0.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-picocontainer</artifactId>
        <version>4.0.0</version>
        <scope>test</scope>
    </dependency>

    <!-- JUnit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!-- Selenium WebDriver -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.11.0</version>
    </dependency>

</dependencies>

如果有帮助,下面是我的跑步者班(com.softwareautomation.world是DI班)

package com.evasoftwareautomation.runners;

import org.junit.runner.RunWith;

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

@RunWith(Cucumber.class)
@CucumberOptions(
        plugin = {"pretty", "html:target/cucumber", "junit:target/cucumber.xml"},
        features = "src/test/resources/com/softwareautomation/features",
        glue = {"com.softwareautomation.stepdefs", "com.softwareautomation.world"},
        junit ={ "--step-notifications"},
        monochrome = true)
public class CucumberTest {
}

从下面的Maven运行时,请参阅失败的堆栈跟踪:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Concurrency config is parallel='methods', perCoreThreadCount=true, threadCount=4, useUnlimitedThreads=false
org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.lang.NullPointerException
        at org.junit.runner.Description.createSuiteDescription(Description.java:124)
        at org.apache.maven.surefire.common.junit48.FilterFactory$GroupMatcherCategoryFilter.shouldRun(FilterFactory.java:207)
        at org.junit.runners.ParentRunner.shouldRun(ParentRunner.java:434)
        at org.junit.runners.ParentRunner.filter(ParentRunner.java:382)
        at org.junit.runner.manipulation.Filter.apply(Filter.java:97)
        at org.junit.runners.ParentRunner.filter(ParentRunner.java:384)
        at org.junit.runner.manipulation.Filter.apply(Filter.java:97)
        at org.junit.runners.ParentRunner.filter(ParentRunner.java:384)
        at org.junit.runner.manipulation.Filter.apply(Filter.java:97)
        at org.junit.runners.ParentRunner.filter(ParentRunner.java:384)
        at org.junit.runner.manipulation.Filter.apply(Filter.java:97)
        at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:37)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
        at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.execute(JUnitCoreWrapper.java:62)
        at org.apache.maven.surefire.junitcore.JUnitCoreProvider.invoke(JUnitCoreProvider.java:139)
        ... 9 more

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.709 s
[INFO] Finished at: 2018-10-25T23:36:01+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project selenium: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException

4 个答案:

答案 0 :(得分:3)

at org.apache.maven.surefire.common.junit48.FilterFactory$GroupMatcherCategoryFilter.shouldRun(FilterFactory.java:207)

您正在使用JUnit 4.12。但是,如上所述,堆栈跟踪告诉我们surefire正在尝试对JUnit 4.8使用集成。您的surefire版本于2012年发布,JUnit 4.12于2014年发布。您是否考虑过更新maven surefire插件?

答案 1 :(得分:0)

我设法通过显式添加测试框架的依赖关系使其工作:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.22.2</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <artifactId>surefire-junit47</artifactId>
      <version>2.22.2</version>
    </dependency>
  </dependencies>
  <configuration>
    <parallel>all</parallel>
    <threadCount>4</threadCount>
  </configuration>
</plugin>

答案 2 :(得分:0)

将其留在此处可能会帮助其他人

就我而言

  • maven没有进行Junit 5测试
  • 黄瓜测试未并行运行

让它起作用

  • 添加junit-jupiter 5.5.2
  • 添加maven-surefire-plugin 2.22.2并显式添加 surefire-junit47 2.22.2

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.22.2</version>
                </dependency>
            </dependencies>
            <configuration>
                <parallel>both</parallel>
                <threadCount>4</threadCount>
            </configuration>
        </plugin>
    

答案 3 :(得分:0)

就我而言,我使用的是surefire 2.12.4,并将其更新为2.22.2可以达到目的