java - Jacoco 在 kotlin 的测试中没有在 Kotlin 和 Java maven 项目中找到 Kotlin 文件覆盖率

标签 java kotlin jacoco jacoco-maven-plugin

我的项目包含 Kotlin 和 Java 源文件夹以及 Kotlin 和 Java 测试源文件夹。但是当我尝试检查覆盖范围时,Jacoco 找不到 Kotlin 类的覆盖范围。

@Godin 我尝试从您的答案中应用 build-helper-maven-plugin answer on similar problem用于添加更多源/测试目录,但结果是相同的“所覆盖的 KotlinExample 类行违反的规则是比率 0.0...”

更新 仅当我从 Java 测试中覆盖 Kotlin 类时,覆盖才有效。但从 Kotlin 的测试来看,这是行不通的。

非常感谢任何帮助。

我的pom是

<modelVersion>4.0.0</modelVersion>

<properties>
    <main.version>0.0.1-SNAPSHOT</main.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jdk.version>1.8</jdk.version>
    <kotlin.version>1.3.72</kotlin.version>
    <kotlin.compiler.incremental>true</kotlin.compiler.incremental>
    <jacoco.version>0.8.3</jacoco.version>
    <sonar.inclusions>src/main/**</sonar.inclusions>
    <sonar.exclusion.001>**/dto/**</sonar.exclusion.001>
    <sonar.exclusion.002>**/stub/**</sonar.exclusion.002>
    <sonar.skip>true</sonar.skip>
</properties>

<dependencies>
</dependencies>

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>*</include>
            </includes>
        </resource>
    </resources>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.3</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                    </manifest>
                    <manifestEntries>
                    </manifestEntries>
                </archive>
                <webResources>
                    <resource>
                        <directory>src/main/resources</directory>
                        <targetPath>WEB-INF/classes</targetPath>
                        <excludes>
                            <exclude>env.properties</exclude>
                        </excludes>
                    </resource>
                </webResources>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <configuration>
                <jvmTarget>${jdk.version}</jvmTarget>
                <compilerPlugins>
                    <plugin>spring</plugin>
                </compilerPlugins>
            </configuration>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                   <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
                            <sourceDir>${project.basedir}/src/main/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${basedir}/src/test/kotlin</sourceDir>
                            <sourceDir>${basedir}/src/test/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.jetbrains.kotlin</groupId>
                    <artifactId>kotlin-maven-allopen</artifactId>
                    <version>${kotlin.version}</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <executions>
                <execution>
                    <id>default-compile</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>default-testCompile</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>java-compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <execution>
                    <id>java-testCompile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>${sonar.exclusion.001}</exclude>
                    <exclude>${sonar.exclusion.002}</exclude>
                </excludes>
            </configuration>
            <executions>
                <execution>
                    <id>pre-unit-test</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <destFile>${basedir}/target/coverage-reports/jacoco-ut.exec</destFile>
                    </configuration>
                </execution>
                <execution>
                    <id>post-unit-test</id>
                    <phase>test</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${basedir}/target/coverage-reports/jacoco-ut.exec</dataFile>
                        <outputDirectory>${basedir}/target/jacoco-ut-report</outputDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>check</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>check</goal>
                    </goals>
                    <configuration>
                        <dataFile>${basedir}/target/coverage-reports/jacoco-ut.exec</dataFile>
                        <rules>
                            <rule>
                                <element>CLASS</element>
                                <limits>
                                    <limit>
                                        <counter>LINE</counter>
                                        <value>COVEREDRATIO</value>
                                        <minimum>0.8</minimum>
                                    </limit>
                                    <limit>
                                        <counter>BRANCH</counter>
                                        <value>COVEREDRATIO</value>
                                        <minimum>0.8</minimum>
                                    </limit>
                                </limits>
                            </rule>
                        </rules>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>

最佳答案

如果您使用0.8.3或类似版本的jacoco-maven-plugin,请确保定义了数据文件,并为插件使用以下配置。

<execution>
  <id>jacoco-check</id>
  <goals>
    <goal>check</goal>
  </goals>
  <configuration>
    <dataFile>${project.build.directory}/coverage-reports/jacoco.exec</dataFile>
    <rules>
      <rule>
        <element>BUNDLE</element>
        <limits>
          <limit>
            <counter>INSTRUCTION</counter>
            <value>COVEREDRATIO</value>
            <minimum>0.17</minimum>
          </limit>
        </limits>
      </rule>
    </rules>
  </configuration>
</execution>

此代码可确保总体覆盖率达到 17%。

请使用以下内容验证这一点

mvn 干净验证

命令。 并将其添加到配置 list

<configuration>
      <excludes>
        <exclude>META-INF/**</exclude>
      </excludes>
</configuration>

关于java - Jacoco 在 kotlin 的测试中没有在 Kotlin 和 Java maven 项目中找到 Kotlin 文件覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61891797/

相关文章:

Java - 网络应用程序 - 实时

android - 在Kotlin中将项目集合与另一个集合进行转换

tomcat - 离线检测是否也需要 jacoco 代理?

java - 从 Java 访问 Kotlin 枚举

java - JAVA Jacoco错误的线路覆盖率

maven - 如何在 jacoco :report? 之后禁用 jacoco-agent

java - 如何在eclipse kepler中安装spring框架?

java - import.io 不加载任何网页

java - Android 上的两个级别的 Activity 。无缝过渡

kotlin - 如何获取javax.lang.model.element.Element实例的类型