【问题标题】:Have integration tests in jacoco-it directory在 jacoco-it 目录中进行集成测试
【发布时间】:2016-09-25 21:23:06
【问题描述】:

我有集成测试,它们执行得很好,但 Jacoco 将它们视为单元测试。如何告诉 Jacoco 将它们视为集成测试并显示它们的图形覆盖率,而不是在 jacoco-ut 目录中,而是在 jacoco-it 目录中?

在 Maven 配置中:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
      <argLine>${surefireArgLine}</argLine>
      <excludes>
        <exclude>**/it/java/*.java</exclude>
      </excludes>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.10</version>
    <executions>
      <execution>
        <id>add-test-source</id>
        <phase>process-test-sources</phase>
        <goals>
          <goal>add-test-source</goal>
        </goals>
        <configuration>
          <sources>
            <source>src/it/java</source>
          </sources>
        </configuration>
      </execution>
      <execution>
        <id>add-test-resource</id>
        <phase>generate-test-resources</phase>
        <goals>
          <goal>add-test-resource</goal>
        </goals>
        <configuration>
          <resources>
            <resource>
              <directory>src/it/resources</directory>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
      <execution>
        <id>add-it-resources</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <outputDirectory>${project.build.directory}/it-classes</outputDirectory>
          <resources>
            <resource>
              <directory>src/it/resources</directory>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
      <argLine>${failsafeArgLine}</argLine>
      <testSourceDirectory>src/it/java</testSourceDirectory>
      <testClassesDirectory>${project.build.directory}/it-classes</testClassesDirectory>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.6.201602180812</version>
    <configuration>
      <skip>${maven.test.skip}</skip>
      <output>file</output>
      <append>true</append>
      <excludes>
        <exclude>**/config/*</exclude>
        <exclude>**/dialect/*</exclude>
      </excludes>
    </configuration>        
    <executions>
      <execution>
        <id>pre-unit-test</id>
        <phase>process-test-classes</phase>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
        <configuration>
          <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
          <propertyName>surefireArgLine</propertyName>
          <includes><include>**/ut/*</include></includes>
        </configuration>
      </execution>
      <execution>
        <id>post-unit-test</id>
        <phase>test</phase>
        <goals>
          <goal>report</goal>
        </goals>
        <configuration>
          <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
          <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
        </configuration>
      </execution>
      <execution>
        <id>pre-integration-test</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>prepare-agent-integration</goal>
        </goals>
        <configuration>
          <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
          <propertyName>failsafeArgLine</propertyName>
          <includes><include>**/it/*</include></includes>
        </configuration>
      </execution>
      <execution>
        <id>post-integration-test</id>
        <phase>post-integration-test</phase>
        <goals>
          <goal>report-integration</goal>
        </goals>
        <configuration>
          <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
          <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
        </configuration>
      </execution>
    </executions>
  </plugin>

更新:我在 maven-failsafe-plugin 插件中遗漏了这一点:

<executions>
  <execution>       
    <goals>                       
      <goal>integration-test</goal>               
    </goals>                                                  
  </execution>                                                          
</executions> 

添加后如下:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
      <argLine>${failsafeArgLine}</argLine>
      <includes>
        <include>**/it/**</include>
      </includes>
    </configuration>
    <executions>
      <execution>       
        <goals>                       
          <goal>integration-test</goal>               
        </goals>                                                  
      </execution>                                                          
    </executions>                                                                   
  </plugin>

集成测试报告显示集成测试。

最终完整配置为:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
      <argLine>${surefireArgLine}</argLine>
      <includes>
        <include>**/ut/**</include>
      </includes>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.10</version>
    <executions>
      <execution>
        <id>add-test-source</id>
        <phase>process-test-sources</phase>
        <goals>
          <goal>add-test-source</goal>
        </goals>
        <configuration>
          <sources>
            <source>src/it/java</source>
          </sources>
        </configuration>
      </execution>
      <execution>
        <id>add-test-resource</id>
        <phase>generate-test-resources</phase>
        <goals>
          <goal>add-test-resource</goal>
        </goals>
        <configuration>
          <resources>
            <resource>
              <directory>src/it/resources</directory>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
      <argLine>${failsafeArgLine}</argLine>
      <includes>
        <include>**/it/**</include>
      </includes>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>integration-test</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.6.201602180812</version>
    <configuration>
      <skip>${maven.test.skip}</skip>
      <output>file</output>
      <append>true</append>
      <excludes>
        <exclude>**/config/*</exclude>
        <exclude>**/dialect/*</exclude>
      </excludes>
    </configuration>        
    <executions>
      <execution>
        <id>pre-unit-test</id>
        <phase>process-test-classes</phase>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
        <configuration>
          <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
          <propertyName>surefireArgLine</propertyName>
        </configuration>
      </execution>
      <execution>
        <id>post-unit-test</id>
        <phase>test</phase>
        <goals>
          <goal>report</goal>
        </goals>
        <configuration>
          <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
          <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
        </configuration>
      </execution>
      <execution>
        <id>pre-integration-test</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>prepare-agent-integration</goal>
        </goals>
        <configuration>
          <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
          <propertyName>failsafeArgLine</propertyName>
        </configuration>
      </execution>
      <execution>
        <id>post-integration-test</id>
        <phase>post-integration-test</phase>
        <goals>
          <goal>report-integration</goal>
        </goals>
        <configuration>
          <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
          <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
        </configuration>
      </execution>
    </executions>
  </plugin>

【问题讨论】:

    标签: maven integration-testing jacoco jacoco-maven-plugin


    【解决方案1】:

    您误解了 maven-failsafe-plugin 的 include 标签的模式。该模式用于测试类路径中类的包名称(另请参见https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html)。

    build-helper-maven-plugin 将src/it/java 中的所有类包含到测试类路径中。然后在两个测试插件(surefire、failsafe)中包含标签的模式过滤了这个测试类路径中的类。这些过滤的类由测试插件执行。

    所以工作流程是

    1. Build-Helper-Plugin 扩展了必须编译和执行的测试类集。因此使用了 source 指令。此源指令中定义的路径位置与 Maven 项目路径相关。
    2. Compiler Plugin 编译 java 类。
    3. Jacoco-Plugin 应使用单元测试测量生产类中的覆盖率。因此,在执行测试之前必须准备好普通代理。您可以指定应在覆盖率测量中包含或排除哪些生产代码(包含/排除指令)。这些指令中的模式是基于包的(使用斜杠而不是点)。
    4. Surefire-Plugin 执行其全限定类名与包含指令的模式匹配的测试。该模式使用斜线而不是点。
    5. 现在 Jacoco-Plugin 应该使用集成测试来测量生产类中的覆盖率。因此,必须在执行测试之前准备好集成代理。同样,您可以指定应在覆盖率测量中包含或排除哪些生产代码(包含/排除指令)。这些指令中的模式是基于包的(使用斜杠而不是点)。
    6. Failsafe-Plugin 也是如此。它执行完全限定类名与包含指令的模式匹配的测试。该模式使用斜线而不是点。

    【讨论】:

    • 我知道我必须使用路径模式而不是包模式。那正确吗 ?您是说所有类都在同一个目录中混合在一起吗?那么没有办法用子目录名称来区分它们吗?只有类名后缀,如 IT,可以在这里提供帮助?
    • 不,反过来。您必须使用包模式。编译后,所有从 src/it/java 和 src/test/java 编译的类都在 target/test-classes(test-classpath)下。然后,surefire/failsafe 插件执行包含标签中的模式所描述的类。因此,使用类名后缀的方法会有所帮助。 BTW 检查故障保护插件的默认后缀(maven.apache.org/surefire/maven-failsafe-plugin/…)以减少配置。
    • 我仍然很困惑,因为文档显示了类似包含的路径。斜线表示路径。点的意思是像包装一样。我试过这个配置: ${project.build.directory}/coverage-reports/jacoco-it.execfailsafeArgLine*.it .**/it/* 但这两个配置没有包含任何内容。我在 it/ 文件夹中有我的集成测试。您知道如何将其表达为包含吗?
    • 例如,您有两个名为 com.example.integrationtest.ATest 和 com.example.unittest.BTest 的类。 ATest.java 位于 src/it/java 中(意味着 failsafe 应该执行它),BTest.java 位于 src/test/java 下(意味着 surefire 应该执行它)。那么故障安全的包含模式是*/integration/*,而surefire的模式是*/unittest/*。这是一种包装模式,但他们使用斜线而不是点。
    • 在我的最后一条评论中,它应该意味着“它不是一个好方法”。原因是如果您测试受包保护的类,您的结构可能会遇到问题。我会更喜欢后缀方式。
    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 2015-05-01
    • 2014-12-18
    • 2012-10-15
    • 2014-09-26
    • 2018-05-10
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多