2016-10-30 4 views
1

У меня есть небольшое приложение Maven, которое использует JaCoCo для отчета о покрытии теста. Я продолжаю получать следующую ошибку:JaCoCo отсутствует исполняемый выпуск

Skipping JaCoCo execution due to missing execution data file

Вот мой файл POM.xml. Я сам удалил элемент проекта.

<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)); 
    } 
} 

Как я могу решите эту проблему?

+0

Какую команду вы использовали для запуска Maven? Я не могу воспроизвести это с помощью 'mvn clean package', например. – Tunaki

+0

mvn clean install – user1107888

+0

Можете ли вы показать структуру каталогов, которые вы используете для своего теста? Где они расположены? Что находится под 'src/test/java'? – Tunaki

ответ

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> 

Заметим, что если вы хотите, чтобы предотвратить такие ошибки в будущем, вы можете настроить Surefire плагин к сбою если тесты не выполняются, установите параметр failIfNoTests в значение true.

+0

Спасибо, что в первую очередь решили проблему и, во-вторых, прояснили концепцию. Я отметил ваш ответ как принятый. Приветствия :) – user1107888