JaCoCo缺少可执行问题

时间:2016-10-30 13:22:41

标签: java maven jacoco

我有一个小型的Maven应用程序,它使用JaCoCo进行测试覆盖率报告。我一直收到以下错误:

  

由于缺少执行数据文件而跳过JaCoCo执行

这是我的POM.xml文件。我自己删除了Project Element。

<modelVersion>4.0.0</modelVersion>

<groupId>de.mathema.www</groupId>
<artifactId>jacoco_sample_app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

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

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>
</dependencies>

<build>
  <plugins>

    <plugin>
      <groupId>org.jacoco</groupId>
      <artifactId>jacoco-maven-plugin</artifactId>
      <version>0.7.6.201602180812</version>
      <executions>
        <execution>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
          <id>report</id>
          <phase>prepare-package</phase>
          <goals>
            <goal>report</goal>
          </goals>
        </execution>
      </executions>
    </plugin>           
  </plugins>
</build>

这是我的主要类,它位于src/main/java结构下:

public class Punkt {
    private Double x;
    private Double y;

    public Punkt(Double x,Double y) {
        this.x = x;
        this.y = y;
    }

    public Punkt(Punkt zweiterPunkt) {
        this.x = zweiterPunkt.x;
        this.y = zweiterPunkt.y;
    }

    public Double getX() {
        return x;
    }

    public void setX(Double x) {
        this.x = x;
    }

    public Double getY() {
        return y;
    }

    public void setY(Double y) {
        this.y = y;
    }

    public boolean punkteVergleichen(Punkt zweiterPunkt) {
        return this.getX().equals(zweiterPunkt.getX()) &&  
       this.getY().equals(zweiterPunkt.getY());

    }
    public String toString() {
        return "("+this.x+","+this.y+")";
    }

}

这里是单元测试的类,它位于src/test/java结构下:

public class PunktUnitTests {

    @Test
    public void PunkteVergleichen()  throws Exception {
        //a(10.0, 20.0)
        Punkt a = new Punkt(10.0,20.0);

        //b(30.0,40.0)
        Punkt b = new Punkt(30.0,40.0);

        //Der Fall X1!=X2 und Y1!=Y2
        //a(10.0,20.0) und b(30.0,40.0) sind unterschiedlich
        assertFalse(a.punkteVergleichen(b));

        //Der Fall X1 == X2 && Y1 == Y2
        //a(10.0,20.0) und c(10.0,20.0) sind gleich
        Punkt c = new Punkt(a);
        assertTrue(a.punkteVergleichen(a));

        //Der Fall X1 == X2 && Y1 != Y2
        //a(10.0,20.0) und c(10.0,90.0) sind unterschiedlich
        c.setX(10.0);c.setY(90.0);

        assertFalse(a.punkteVergleichen(c));
    }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

虽然该消息可能有点误导,但JaCoCo Maven plugin将在未运行任何测试时发出此警告。这是你的问题:默认情况下,Maven Surefire Plugin执行遵循特定命名约定的测试,即:

  • "**/Test*.java";
  • "**/*Test.java";
  • "**/*TestCase.java"

但是你的测试名为PunktUnitTests,尾随“s”,导致它不被执行。因此,会发生以下情况:Surefire插件没有运行任何测试,因此从不使用JaCoCo代理,因此,不会创建执行数据文件。

这里的简单解决方案是根据Surefire插件的约定重命名您的测试,即PunktUnitTest

另一个解决方案是配置插件以执行以“s”结尾的测试:

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.19.1</version>
  <configuration>
    <includes>
      <include>**/*Tests.java</include>
    </includes>
  </configuration>
</plugin>

请注意,如果您希望将来阻止此类错误,可以通过将failIfNoTests参数设置为true来将Surefire插件配置为在未运行任何测试时失败。