Obteniendo "Omitiendo la ejecución de JaCoCo debido a que falta el archivo de datos de ejecución" al ejecutar JaCoCo

123

Estoy usando Maven 3.0.3, JUnit 4.8.1 y Jacoco 0.6.3.201306030806, y estoy tratando de crear informes de cobertura de prueba.

Tengo un proyecto con pruebas unitarias solamente, pero no puedo ejecutar los informes, recibo repetidamente el error: Skipping JaCoCo execution due to missing execution data filecuando ejecuto:

mvn clean install -P test-coverage

Así es como se configura mi pom:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.14.1</version>
  <configuration>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx2048m</argLine>
  </configuration>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.14.1</version>
  <configuration>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>integration-test</goal>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>
...
<profile>
  <id>test-coverage</id>
  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.6.3.201306030806</version>
        <configuration>
          <destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile>
          <datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile>
        </configuration>
        <executions>
          <execution>
            <id>prepare-unit-tests</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
          </execution>
          <!-- prepare agent for measuring integration tests -->
          <execution>
            <id>prepare-integration-tests</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
            <phase>pre-integration-test</phase>
            <configuration>
              <propertyName>itCoverageAgent</propertyName>
            </configuration>
          </execution>
          <execution>
            <id>jacoco-site</id>
            <phase>verify</phase>
            <goals>
              <goal>report</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</profile>

Todas mis pruebas se ejecutan con éxito. Aquí está algunos de los resultados de Maven:

[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-unit-tests) @ myproject ---
[INFO] argLine set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec
[INFO] 
    ...
Tests run: 14, Failures: 0, Errors: 0, Skipped: 0

[INFO]
    ...
[INFO] 
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-integration-tests) @ myproject ---
[INFO] itCoverageAgent set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec 
[INFO] 
[INFO] --- maven-failsafe-plugin:2.14.1:integration-test (default) @ myproject ---
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] 
[INFO] --- maven-failsafe-plugin:2.14.1:verify (default) @ myproject ---
[INFO] Failsafe report directory: /Users/davea/Dropbox/workspace/myproject/target/failsafe-reports
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] 
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:report (jacoco-site) @ myproject ---
[INFO] Skipping JaCoCo execution due to missing execution data file
[INFO] 

¿Alguna idea de qué configuración me falta?

Dave
fuente
Parece que también tienes pruebas de integración en tu pom, lo que podría ser una distracción. Además, eliminamos el destFiley lo dejamos escribir en el archivo target / jacoco.exec predeterminado.
MarkHu
He publicado la respuesta en esta ubicación.
Shivkumar Kawtikwar

Respuestas:

134

jacoco-maven-plugin: 0.7.10-SNAPSHOT

De jacoco: prepare-agent que dice:

Una de las formas de hacer esto en el caso de maven-surefire-plugin es usar la sintaxis para la evaluación tardía de la propiedad:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <argLine>@{argLine} -your -extra -arguments</argLine>
  </configuration>
</plugin>

Tenga en cuenta el @{argLine}que se agrega a -your -extra -arguments.

Gracias Slava Semushin por notar el cambio e informar en el comentario .

jacoco-maven-plugin: 0.7.2-SNAPSHOT

Siguiendo a jacoco: prepare-agent que dice:

[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: prepare-agent] Prepara una propiedad que apunta al agente de tiempo de ejecución de JaCoCo que se puede pasar como un argumento de VM a la aplicación bajo prueba. Dependiendo del tipo de empaquetado del proyecto, se establece de forma predeterminada una propiedad con el siguiente nombre:

  • tycho.testArgLine para el tipo de paquete eclipse-test-plugin y
  • argLine de lo contrario.

Tenga en cuenta que la configuración de la prueba no debe sobrescribir estas propiedades; de lo contrario, no se puede adjuntar el agente JaCoCo. Si necesita parámetros personalizados, añádalos. Por ejemplo:

<argLine>${argLine} -your -extra -arguments</argLine>

La información de cobertura resultante se recopila durante la ejecución y, de forma predeterminada, se escribe en un archivo cuando finaliza el proceso.

debe cambiar la siguiente línea en la maven-surefire-pluginconfiguración del complemento desde (tenga ${argLine}en cuenta el interior <argLine>):

<argLine>-Xmx2048m</argLine>

a

<argLine>${argLine} -Xmx2048m</argLine>

Realice también los cambios necesarios en el otro complemento maven-failsafe-pluginy reemplace lo siguiente (nuevamente, observe el ${argLine}):

<argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>

a

<argLine>${argLine} -Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
Jacek Laskowski
fuente
Ahora, sin embargo, existe este problema, sin el objetivo de jacoco, la compilación falla.
Andreas
Funcionó, pero tuve que usar tycho.testArgLine ya que estoy usando tycho.
Raffi Khatchadourian
1
El enlace citado ahora tiene una sugerencia un poco diferente para usar @{argLine}.
Slava Semushin
2
Exactamente este era mi problema. Tenía argumentos personalizados en el comando mvn mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy". No estoy declarando maven-surefire-plugin explícitamente y estableciendo configuraciones. Solo agrego el marcador de posición argLine en la línea de comando de maven como mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Ahora se genera el archivo jacoco.exec y el informe de cobertura se genera en la sonda.
RenatoIvancic
1
Funciona !!! El problema se debió a una configuración de <argLine> que agregué en maven-surefire-plugin con el fin de aumentar la memoria para las pruebas de integración. Configuración de <argLine> $ {argLine} --my - additional-parameters - here-- </ argLine > resuelto el problema
Massimo Da Ros
23

Enfrenté un problema un poco diferente que devolvió el mismo error.

Skipping JaCoCo execution due to missing execution data /target/jacoco.exec

La verdad es que este error se devuelve por muchas, muchas razones. Experimentamos con las diferentes soluciones en Stack Overflow, pero descubrimos que este recurso es el mejor. Derriba las diferentes razones potenciales por las que Jacoco podría estar devolviendo el mismo error.

Para nosotros, la solución fue agregar un agente de preparación a la configuración.

<execution>
   <id>default-prepare-agent</id>
   <goals>
       <goal>prepare-agent</goal>
   </goals>
</execution>

Me imagino que la mayoría de los usuarios lo experimentarán por diferentes razones, ¡así que eche un vistazo al recurso mencionado anteriormente!

Chad Van De Hey
fuente
2
Creo que lo clavaste. La gente puede buscarlo en Google para una "solución rápida", pero la respuesta más correcta sería "La verdad es que este error se devuelve por muchas, muchas razones". Solo necesito averiguar qué es eso. Para mí, fue un pom principal que sobrescribió la <argLine> en el complemento maven-surefire-plugin.
tuan.dinh
¡Esta! Gracias. Recibí el mismo mensaje, pero fue porque mi complemento infalible solo buscaba archivos nombrados **/*Test.javacuando se nombraron mis clases de prueba*Tests.java
Roger Worrell
Tuve dos problemas: 1. Ninguna clase de prueba, necesito al menos una *Test.javaclase y un método de prueba anotado @Testpara que Jacoco pueda hacer algo. 2. En las variables de entorno de Travis para mi proyecto, tenía un error tipográfico SONART_TOKEN=*****, debería haber sido nombrado SONAR_TOKEN=*****. Consulte los documentos de Travis aquí , busque or define SONAR_TOKEN in your Repository Settings. Después de que solucioné eso, la compilación se ejecutó correctamente. Puede ver mi proyecto de gitbhub en cuestión .
José Quijada
15

Puede haber un caso en el que alguna otra configuración de argumentación o complemento en pom pueda anular la configuración de la orden de ejecución de jacoco.

argLine establecido en -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec

Uno de los ejemplos

           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.16</version>
                <configuration>
                    <forkCount>5</forkCount>
                    <reuseForks>true</reuseForks>
                    <argLine>-Dnet.sf.ehcache.disabled=true</argLine>
                </configuration>
            </plugin>

Después de deshacerse de argLine de estos complementos, jacoco comenzó a funcionar normalmente.

Atish Narlawar
fuente
Resolvió mi problema. ¡Gran lugar!
user1974753
13

También se puede obtener el error "Omitiendo la ejecución de JaCoCo debido a que falta el archivo de datos de ejecución" debido a que faltan pruebas en el proyecto. Por ejemplo, cuando inicia un nuevo proyecto y no tiene ningún archivo * Test.java.

Tanya Jivvca
fuente
5

F Lo que dijo tdrury:

cambie la configuración de su complemento a esto:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.3.201306030806</version>
    <executions>
      <!-- prepare agent for measuring integration tests -->
      <execution>
        <id>prepare-integration-tests</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
        <configuration>
          <destFile>${basedir}/target/coverage-reports/jacoco-unit.exec</destFile>
        </configuration>
      </execution>
      <execution>
        <id>jacoco-site</id>
        <phase>post-integration-test</phase>
        <goals>
          <goal>report</goal>
        </goals>
        <configuration>
          <dataFile>${basedir}/target/coverage-reports/jacoco-unit.exec</dataFile>
        </configuration>
      </execution>
    </executions>
  </plugin>

Editar: Acabo de notar una cosa importante, destFile y dataFile parecen distinguir entre mayúsculas y minúsculas, por lo que se supone que es destFile, no destfile.

Hueso de cabra
fuente
5

Sé que esta pregunta es bastante antigua, pero si alguien como yo viene aquí buscando una respuesta, esto podría ayudar. He podido superar el error anterior con esto.

1) Elimine el siguiente código del complemento maven-surefire-plugin

 <reuseForks>true</reuseForks>
 <argLine>-Xmx2048m</argLine>

2) Agregue el siguiente objetivo:

<execution>
<id>default-prepare-agent</id>
<goals>
   <goal>prepare-agent</goal>
</goals>
</execution>
Siempre un recién llegado
fuente
3

Encontré el mismo problema en este momento.

Tengo una clase nombrada HelloWorld, y creé una clase de prueba para ella nombrada HelloWorldTests, luego obtuve el resultadoSkipping JaCoCo execution due to missing execution data file.

Luego intenté cambiar mi pom.xmlpara que funcionara, pero el intento falló.

Finalmente, simplemente cambio el nombre HelloWorldTestsa HelloWorldTest, ¡y funcionó!

Entonces supongo que, por defecto , jacoco solo reconoce la clase de prueba nombrada como XxxTest, lo que indica que es la clase de prueba para Xxx. ¡Así que simplemente cambiar el nombre de sus clases de prueba a este formato debería funcionar!

afkbrb
fuente
2

Probé todas las respuestas, pero solo la siguiente combinación de consejos me ha funcionado. ¿Por qué? Tenía requisitos muy específicos:

  1. JaCoCo genera un informe cuando la compilación se ejecuta desde la línea de comando: mvn clean verify(Maven 3.6.0)
  2. Intellij IDEA (2019.01) también ejecuta mis pruebas
  3. Todo funciona en presencia de otro javaagentdefinido en el surefirecomplemento.

Solución : anteponer el argLinevalor en la surefireconfiguración con la propiedad maven de "reemplazo tardío" @{...}como se explica en las surefire preguntas frecuentes ( mi configuración fija )

¿Cómo utilizo las propiedades establecidas por otros complementos en argLine? Maven reemplaza propiedades para

$ {...} valores en pom.xml antes de ejecutar cualquier complemento. Entonces Surefire nunca vería los marcadores de posición en su propiedad argLine. Dado que la versión 2.17 utiliza una sintaxis alternativa para estas propiedades,

@ {...} permite el reemplazo tardío de propiedades cuando se ejecuta el complemento, por lo que las propiedades que han sido modificadas por otros complementos se seleccionarán correctamente.

Falló el primer intento: defina la propiedad jaCoCoArgLine en la prepare-agentconfiguración del objetivo de jacoco: el escenario falló en mi segundo requisito, IntelliJ IDEA no pudo averiguar el agente para jmockit que uso en el proyecto para la simulación de métodos estáticos

Pawel Kruszewski
fuente
Enfrentó el mismo problema al usar con JMockit y pude resolver el problema con esta solución. es decir, agregar argLine en el complemento surefire
Karthik Rao
1

He agregado un proyecto Maven / Java con 1 clase de dominio con las siguientes características:

  • Pruebas unitarias o de integración con los complementos Surefire y Failsafe.
  • Findbugs.
  • Prueba de cobertura a través de Jacoco .

¿Dónde están los resultados de Jacoco? Después de probar y ejecutar 'mvn clean', puede encontrar los resultados en 'target / site / jacoco / index.html'. Abra este archivo en el navegador.

¡Disfrutar!

Traté de mantener el proyecto lo más simple posible. El proyecto reúne muchas sugerencias de estas publicaciones en un proyecto de ejemplo. ¡Gracias, colaboradores!

tm1701
fuente
Probé su proyecto git pero no está claro cómo ver el informe.
Nagaraj Vittal
¿Dónde están los resultados de Jacoco? Después de probar y ejecutar 'mvn clean', puede encontrar los resultados en 'target / site / jacoco / index.html'. Abra este archivo en el navegador.
tm1701
Es posible que desee vincular su repositorio de nuevo a stackoverflow. Me costó encontrar la pregunta nuevamente después de encontrar un error en su demostración.
Wolfgang Fahl
Y aún no funciona como se esperaba :-( el directorio de destino solo tiene aggregate.exec ya que su contenido cuando se realiza una instalación limpia de mvn ...
Wolfgang Fahl
1

Luché durante días. Probé todas las diferentes configuraciones sugeridas en este hilo. Ninguno de ellos funciona. Finalmente, encuentro que solo la configuración importante es el objetivo del agente de preparación . Pero hay que ponerlo en la fase correcta. Vi tantos ejemplos ponerlo en la " prueba previa a la integración ", eso es engañoso, ya que solo se ejecutará después de la prueba unitaria. Por tanto, la prueba unitaria no estará instrumentada.

La configuración correcta debería usar la fase predeterminada (no especifique la fase explícitamente). Y, por lo general, no es necesario concentrarse en maven-surefire-plugin .

  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.4</version>
    <executions>
      <execution>
        <id>default-prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
      <execution>
        <id>jacoco-site</id>
        <phase>post-integration-test</phase>
        <goals>
          <goal>report</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
Jianwu Chen
fuente
0

La ejecución dice que está poniendo los datos de jacoco en /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec pero su configuración de maven está buscando los datos en $ {basedir} / target / coberturas-informes / jacoco-unit. ejecutivo.

tdrury
fuente
1
Bien, entonces, ¿por qué el complemento ignora lo que especifico en la configuración?
Dave
intente mover su configuración de destfile a la configuración de la ejecución del agente de preparación. No todos los complementos de Maven manejan amablemente la herencia de configuración.
tdrury
0

Mi respuesta es muy tardía, pero para otros usuarios. En su caso, debe configurar el pluging a prueba de fallas para usar la configuración del agente de línea de comandos guardada en la variable itCoverageAgent. Por ejemplo

<configuration>
    <argLine>${itCoverageAgent}</argLine>
</configuration>

En su configuración de maven, jacoco prepara los argumentos de la línea de comando en la fase de preparación del agente, pero el complemento a prueba de fallas no lo usa, por lo que no hay un archivo de datos de ejecución.

jpl
fuente
0

Tratar de usar:

mvn jacoco:report -debug

para ver los detalles sobre su proceso de denuncia.

Configuré mi jacoco así:

<configuration>
    <dataFile>~/jacoco.exec</dataFile>
    <outputDirectory>~/jacoco</outputDirectory>
</configuration>

Luego lo mvn jacoco:report -debugmuestra usando la configuración predeterminada, lo que significa que jacoco.execno está en ~/jacoco.exec. El error dice missing execution data file.

Así que usa la configuración predeterminada:

<execution>
    <id>default-report</id>
    <goals>
    </goals>
    <configuration>
        <dataFile>${project.build.directory}/jacoco.exec</dataFile>
        <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
    </configuration>
</execution>

Y todo funciona bien.

xiaoLiuLiu
fuente
0

A veces, la ejecución se ejecuta por primera vez, y cuando hacemos una instalación limpia de maven, no se genera después de eso. El problema era usar true para skipMain y skip properties en maven-compiler-plugin del archivo pom principal. Elimínelos si se presentaron como parte de algún problema o sugerencia.

Srini M
fuente
0

En mi caso, el agente de preparación tenía una destFileconfiguración diferente , pero en consecuencia, el informe tenía que configurarse con a dataFile, pero faltaba esta configuración. Una vez que dataFilese agregó, comenzó a funcionar bien.

Pavan Kumar
fuente