如何并行运行我的cucumber-jvm功能? (maven使用cucumber-jvm-parallel-plugin)

时间:2016-11-11 00:14:54

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

我正在尝试将maven插件cucumber-jvm-parallel-plugin合并到我的 Cucumber-JVM 代码中并遇到一些问题...我认为我已正确配置了pom.xml ,但我的黄瓜功能仍在逐一而不是并行运行

如何配置我的pom.xml以使我的黄瓜功能并行运行?我有一些阻止执行的功能文件,我不想等待它们完成为了开始测试其他功能。

我遵循了两个教程,找不到我出错的地方,或者是否预期:

结构

这是我的程序结构:

├── features/
│   └── api/
│       ├── 006-Email.feature
│       └── 999-Login.feature
├── results/
│   └── api-json.json
└── src/
    └── java/
        ├── pom.xml
        ├── src/
        │   └── test/
        │       └── java/
        │           └── com/
        │               └── mycompany/
        │                   └── commonapps/
        │                       └── queuemanager/
        │                           ├── Globals.java
        │                           ├── GmailHelper.java
        │                           ├── HttpDeleteWithBody.java
        │                           ├── JsonHelper.java
        │                           ├── RequestHelper.java
        │                           ├── RunApiTest.java
        │                           ├── ThreadedSteps.java
        │                           └── UserHelper.java
        └── steps/
            └── com/
                └── mycompany/
                    └── commonapps/
                        └── queuemanager/
                            ├── GivenSteps.java
                            ├── Setup.java
                            ├── ThenSteps.java
                            └── WhenSteps.java

Maven Pom Logic

我配置我的pom的方式如下:

  1. 我使用Maven Resources Plugin

    ../../features/api/复制到我的构建路径
    <build>
      <resources>
         <resource>
            <directory>../../features/api/</directory> 
         </resource>
      </resources>
    </build>
    
  2. 我告诉cucumber-jvm-parallel-plugin我的features现在位于target/classes/active/,因为我认为../../features/api/已复制到target/,所以{{ 1}}应该包含我的target/active/文件..我想。

    .feature
  3. 然后,在我运行 <plugin> <groupId>com.github.temyers</groupId> <artifactId>cucumber-jvm-parallel-plugin</artifactId> ... <configuration> ... <featuresDirectory>${project.build.directory}/classes/active/</featuresDirectory> ... </configuration> </plugin> 之后,所有maven test文件都会被编译为.feature。每个功能文件一个。

  4. 所以我告诉maven-surefire-plugin并行运行所有target/test-classes/Parallel**IT.class个文件,这是由cucumber-jvm-parallel-plugin创建的功能文件。

    <include>**/Parallel*IT.class</include>
  5. 完整的pom.xml

    我的pom.xml是:

     <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <executions>
           <execution>
              <id>acceptance-test</id>
              <phase>integration-test</phase>
              <goals>
                 <goal>test</goal>
              </goals>
              <configuration>
                <forkCount>5</forkCount>
                <reuseForks>true</reuseForks>
                <includes>
                  <include>**/Parallel*IT.class</include>
                </includes>
              </configuration>
           </execution>
        </executions>
     </plugin>
    

    黄瓜亚军

    我的黄瓜跑步课程看起来像这样:

    <?xml version="1.0" encoding="UTF-8"?>
    <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.mycompany.commonapps</groupId>
       <artifactId>e2e-server</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <dependencies>
         ...
       </dependencies>
       <build>
    <!-- COPY RESOURCES TO TARGET/ -->
          <resources>
        <!-- copies features to target: "${project.build.directory}/classes/active/" -->
             <resource>
                <directory>../../features/api/</directory> 
             </resource>
          </resources>
    <!-- RUN EACH CUCUMBER FEATURE FILE AS A FORK -->
          <plugins>
        <plugin>
          <groupId>com.github.temyers</groupId>
          <artifactId>cucumber-jvm-parallel-plugin</artifactId>
          <version>1.2.1</version>
          <executions>
            <execution>
              <id>generateRunners</id>
              <phase>generate-test-sources</phase>
              <goals>
            <goal>generateRunners</goal>
              </goals>
              <configuration>
              <glue>com.mycompany.commonapps.queuemanager</glue>
               <outputDirectory>${project.build.directory}/generated-test-sources</outputDirectory>
               <featuresDirectory>${project.build.directory}/classes/active/</featuresDirectory>
               <cucumberOutputDir>${project.build.directory}</cucumberOutputDir>
               <format>json</format>
               <!--<strict>true</strict>
               <monochrome>true</monochrome> 
               <useTestNG>false</useTestNG>
               <namingScheme>simple</namingScheme>-->
               <parallelScheme>FEATURE</parallelScheme>
              </configuration>
            </execution>
          </executions>
        </plugin>
             <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
    <!-- RUN ALL CLASSES CREATED BY cucumber-jvm-parallel-plugin IN PARALLEL -->
            <executions>
             <execution>
                 <id>acceptance-test</id>
                 <phase>integration-test</phase>
                 <goals>
                     <goal>test</goal>
                 </goals>
                 <configuration>
                     <forkCount>5</forkCount>
                     <reuseForks>true</reuseForks>
                     <includes>
                        <include>**/Parallel*IT.class</include>
                     </includes>
                 </configuration>
            </execution>
            </executions>
             </plugin>
    <!-- ADD ../../STEPS/ TO THE SOURCE -->
             <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.7</version>
                <executions>
                   <execution>
                      <id>add-source</id>
                      <phase>generate-sources</phase>
                      <goals>
                         <goal>add-source</goal>
                      </goals>
                      <configuration>
                         <sources>
                            <source>steps/</source>
                            <source>src/test/java/</source>
                         </sources>
                      </configuration>
                   </execution>
                </executions>
             </plugin>
          </plugins>
       </build>
    </project>
    

    输出

    当我运行@RunWith(Cucumber.class) @CucumberOptions(plugin={"pretty","json:../../results/api-json.json"}, glue={"com.mycompany.commonapps.queuemanager"}, features={"../../features/api/active"}) public class RunApiTest { } 时,我得到以下内容:

    mvn test

    有谁看到我做错了什么?

    更多调试信息

    • cucumber-jvm-parallel-plugin的... [INFO] ------------------------------------------------------------------------ [INFO] Building e2e Server Tests 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [WARNING] The artifact org.apache.commons:commons-io:jar:1.3.2 has been relocated to commons-io:commons-io:jar:1.3.2 [INFO] [INFO] --- build-helper-maven-plugin:1.7:add-source (add-source) @ e2e--server --- [INFO] Source directory: /media/ifc-dev-1/ESD-ISO/e2e-/src/java/steps added. [INFO] Source directory: /media/ifc-dev-1/ESD-ISO/e2e-/src/java/src/test/java added. [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ e2e--server --- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 7 resources [INFO] Copying 2 resources [INFO] Copying 7 resources [INFO] [INFO] --- maven-compiler-plugin:3.2:compile (default-compile) @ e2e--server --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! [INFO] Compiling 12 source files to /media/ifc-dev-1/ESD-ISO/e2e-/src/java/target/classes [INFO] /media/ifc-dev-1/ESD-ISO/e2e-/src/java/src/test/java/com/mycompany/commonapps/queuemanager/GmailHelper.java: /media/ifc-dev-1/ESD-ISO/e2e-/src/java/src/test/java/com/mycompany/commonapps/queuemanager/GmailHelper.java uses unchecked or unsafe operations. [INFO] /media/ifc-dev-1/ESD-ISO/e2e-/src/java/src/test/java/com/mycompany/commonapps/queuemanager/GmailHelper.java: Recompile with -Xlint:unchecked for details. [INFO] [INFO] --- cucumber-jvm-parallel-plugin:1.2.1:generateRunners (generateRunners) @ e2e--server --- [INFO] Adding /media/ifc-dev-1/ESD-ISO/e2e-/src/java/target/generated-test-sources to test-compile source root [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ e2e--server --- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory /media/ifc-dev-1/ESD-ISO/e2e-/src/java/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.2:testCompile (default-testCompile) @ e2e--server --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! [INFO] Compiling 10 source files to /media/ifc-dev-1/ESD-ISO/e2e-/src/java/target/test-classes [INFO] /media/ifc-dev-1/ESD-ISO/e2e-/src/java/src/test/java/com/mycompany/commonapps/queuemanager/GmailHelper.java: /media/ifc-dev-1/ESD-ISO/e2e-/src/java/src/test/java/com/mycompany/commonapps/queuemanager/GmailHelper.java uses unchecked or unsafe operations. [INFO] /media/ifc-dev-1/ESD-ISO/e2e-/src/java/src/test/java/com/mycompany/commonapps/queuemanager/GmailHelper.java: Recompile with -Xlint:unchecked for details. [INFO] [INFO] --- maven-surefire-plugin:2.17:test (default-test) @ e2e--server --- [INFO] Surefire report directory: /media/ifc-dev-1/ESD-ISO/e2e-/src/java/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.mycompany.commonapps.queuemanager.RunApiTest .... *Tests run one by one properly* ... Tests run: 31, Failures: 2, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 02:40 min [INFO] Finished at: 2016-11-10T15:49:11-08:00 [INFO] Final Memory: 20M/261M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test (default-test) on project e2e--server: There are test failures. [ERROR] [ERROR] Please refer to /media/ifc-dev-1/ESD-ISO/e2e-/src/java/target/surefire-reports for the individual test results. [ERROR] -> [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/MojoFailureException 正在创建正确并包含一堆Parallel ** IT.class文件
    • cucumber-jvm-parallel-plugin的outputDirectory 正在正确访问
    • cucumber-jvm-parallel-plugin的 featuresDirectory 在构建完成后并非创建

1 个答案:

答案 0 :(得分:1)

我终于开始工作了!以下是我必须要做的事情才能让我的测试并行运行:

  1. 我将maven-surefire-plugin execution标记中的某些字段移至configuration标记。我移动了这一部分:

         <forkCount>5</forkCount>
         <reuseForks>true</reuseForks>
         <includes>
            <include>**/*IT.class</include>
         </includes>
    
    • 所以我的maven-surefire-plugin现在看起来像这样:

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.19.1</version>
    
          <configuration>
             <forkCount>5</forkCount>
             <reuseForks>true</reuseForks>
             <includes>
                 <include>**/*IT.class</include>
             </includes>
          </configuration>
    
        </plugin>
    
  2. 由于cucumber-jvm-parallel-plugin现在正在运行节目,我不得不删除我的黄瓜跑步者类。我这样评论过:

  3.     /*
        @RunWith(Cucumber.class)
        @CucumberOptions(plugin={"pretty","json:../../results/api-json.json"}, glue={"com.mycompany.commonapps.queuemanager"}, features={"../../features/api/active"})
        */
        public class RunApiTest {
        }
    

    就是这样。自创建Parallel**IT.class以来,maven-surefire-plugin无法正常工作。