Obtendo “Ignorando a execução do JaCoCo devido à falta do arquivo de dados de execução” ao executar o JaCoCo

123

Estou usando o Maven 3.0.3, JUnit 4.8.1 e Jacoco 0.6.3.201306030806 e estou tentando criar relatórios de cobertura de teste.

Tenho um projeto apenas com testes de unidade, mas não consigo fazer relatórios para executar, estou recebendo repetidamente o erro: Skipping JaCoCo execution due to missing execution data filequando executo:

mvn clean install -P test-coverage

Aqui está como meu pom está configurado:

<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>

Todos os meus testes foram executados com sucesso. Aqui estão algumas das saídas do 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] 

Alguma ideia de qual configuração estou perdendo?

Dave
fonte
Parece que você também tem testes de integração em seu pom, o que pode ser uma distração. Além disso, destFileremovemos o e o deixamos gravar no arquivo target / jacoco.exec padrão.
MarkHu
Eu postei uma resposta neste local.
Shivkumar Kawtikwar

Respostas:

134

jacoco-maven-plugin: 0.7.10-SNAPSHOT

Do jacoco: prepare-agent que diz:

Uma das maneiras de fazer isso no caso de maven-surefire-plugin - é usar a sintaxe para avaliação de propriedade tardia:

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

Observe o @{argLine}que foi adicionado a -your -extra -arguments.

Obrigado Slava Semushin por perceber a mudança e relatar no comentário .

jacoco-maven-plugin: 0.7.2-SNAPSHOT

A seguir jacoco: prepare-agent que diz:

[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: prepare-agent] Prepara uma propriedade apontando para o agente de tempo de execução JaCoCo que pode ser passado como um argumento VM para o aplicativo em teste. Dependendo do tipo de embalagem do projeto, por padrão, uma propriedade com o seguinte nome é definida:

  • tycho.testArgLine para o tipo de pacote eclipse-test-plugin e
  • caso contrário, argLine.

Observe que essas propriedades não devem ser substituídas pela configuração de teste, caso contrário, o agente JaCoCo não pode ser anexado. Se você precisar de parâmetros personalizados, anexe-os. Por exemplo:

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

As informações de cobertura resultantes são coletadas durante a execução e, por padrão, gravadas em um arquivo quando o processo termina.

você deve alterar a seguinte linha na maven-surefire-pluginconfiguração do plugin (observe o ${argLine}interior <argLine>):

<argLine>-Xmx2048m</argLine>

para

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

Faça também as alterações necessárias no outro plug maven-failsafe-plugin- in e substitua o seguinte (novamente, observe o ${argLine}):

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

para

<argLine>${argLine} -Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
Jacek Laskowski
fonte
Agora, porém, existe este problema, sem o alvo jacoco, a compilação falha.
Andreas
Funcionou, mas tive que usar tycho.testArgLine, pois estou usando tycho.
Raffi Khatchadourian
1
O link citado agora tem uma sugestão um pouco diferente para usar @{argLine}.
Slava Semushin
2
Exatamente esse era o meu problema. Eu tinha argumentos personalizados no comando mvn mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy". Não estou declarando o maven-surefire-plugin explicitamente e definindo configurações. Acabei de adicionar o espaço reservado argLine na linha de comando do maven, como mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Agora o arquivo jacoco.exec é gerado e o relatório de cobertura é gerado no sonar.
RenatoIvancic
1
Funciona !!! O problema era devido a uma configuração <argLine> que adicionei no maven-surefire-plugin para aumentar a memória para testes de integração. Configurando <argLine> $ {argLine} --my - argumentos adicionais - aqui-- </ argLine > resolveu o problema
Massimo Da Ros
23

Eu enfrentei um problema um pouco diferente que retornou o mesmo erro.

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

A verdade é que esse erro é retornado por muitos e muitos motivos. Experimentamos as diferentes soluções no Stack Overflow, mas descobrimos que este recurso é o melhor. Ele destrói as várias razões potenciais pelas quais Jacoco poderia estar retornando o mesmo erro.

Para nós, a solução foi adicionar um agente de preparação à configuração.

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

Eu imagino que a maioria dos usuários experimentará isso por diferentes razões, então dê uma olhada no recurso mencionado acima!

Chad Van De Hey
fonte
2
Eu acho que você acertou em cheio. As pessoas podem pesquisar no Google por uma "solução rápida", mas a resposta mais correta seria "A verdade é que esse erro é retornado por muitos e muitos motivos". Só preciso descobrir o que é. Para mim, foi um pom pai substituindo o <argLine> no plug-in maven-surefire.
tuan.dinh
Este! Obrigado. Recebi a mesma mensagem, mas foi porque meu plug-in infalível estava apenas procurando por arquivos nomeados **/*Test.javaquando minhas classes de teste foram nomeadas*Tests.java
Roger Worrell
Tive dois problemas: 1. Nenhuma classe de teste, preciso de pelo menos uma *Test.javaclasse e um método de teste anotado com @Testpara que Jacoco possa fazer algo. 2. No Travis, as variáveis ​​de ambiente do meu projeto, se houve erro de digitação SONART_TOKEN=*****, deveriam ter sido nomeadas SONAR_TOKEN=*****. Veja a documentação do Travis aqui , pesquise or define SONAR_TOKEN in your Repository Settings. Depois de consertar isso, o build foi executado com sucesso. Você pode ver meu projeto gitbhub em questão .
José Quijada
15

Pode haver um caso onde alguma outra configuração argline ou plugin no pom pode estar substituindo a configuração da ordem de execução do jacoco.

argLine definida para -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

Um dos exemplos

           <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>

Depois de se livrar do argLine desses plugins, o jacoco começou a funcionar normalmente.

Atish Narlawar
fonte
Resolveu meu problema. Ótimo local!
user1974753
13

Também é possível obter o erro "Ignorando a execução do JaCoCo devido à ausência do arquivo de dados de execução" devido à ausência de testes no projeto. Por exemplo, quando você inicia um novo projeto e não tem nenhum arquivo * Test.java.

Tanya Jivvca
fonte
5

F O que o furacão disse:

mude sua configuração de plugin para isto:

<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>

Edit: apenas notei uma coisa importante, destFile e dataFile parecem fazer distinção entre maiúsculas e minúsculas, então é suposto ser destFile, não destfile.

BoneGoat
fonte
5

Eu sei que esta pergunta é muito antiga, mas se alguém como eu vier aqui procurando uma resposta, isso pode ajudar. Consegui superar o erro acima com isso.

1) Remova o pedaço de código abaixo do plugin maven-surefire-plugin

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

2) Adicione a meta abaixo:

<execution>
<id>default-prepare-agent</id>
<goals>
   <goal>prepare-agent</goal>
</goals>
</execution>
Sempre um novoComer
fonte
3

Encontrei o mesmo problema agora.

Eu tenho uma classe chamada HelloWorlde criei uma classe de teste para ela chamada HelloWorldTests, então obtive a saídaSkipping JaCoCo execution due to missing execution data file.

Tentei mudar o meu pom.xmlpara fazê-lo funcionar, mas a tentativa falhou.

Finalmente, simplesmente renomeio HelloWorldTests para HelloWorldTeste funcionou!

Então eu acho que, por padrão , o jacoco só reconhece a classe de teste chamada como XxxTest, o que indica que é a classe de teste para Xxx. Portanto, basta renomear suas classes de teste para este formato deve funcionar!

afkbrb
fonte
2

Tentei todas as respostas, mas apenas a seguinte combinação de conselhos funcionou para mim. Por quê? Eu tinha requisitos muito específicos:

  1. JaCoCo gera relatório quando a compilação é executada a partir da linha de comando: mvn clean verify(Maven 3.6.0)
  2. Intellij IDEA (2019.01) também executa meus testes
  3. Tudo funciona na presença de outro javaagentdefinido no surefireplugin

Solução - prefixe o argLinevalor na surefireconfiguração com a propriedade maven de "substituição tardia", @{...}conforme explicado no surefire FAQ ( minha configuração fixa )

Como faço para usar as propriedades definidas por outros plug-ins em argLine? Maven faz substituição de propriedade para

$ {...} valores em pom.xml antes de qualquer plugin ser executado. Portanto, o Surefire nunca veria os espaços reservados em sua propriedade argLine. Desde a versão 2.17 usando uma sintaxe alternativa para essas propriedades,

@ {...} permite a substituição tardia de propriedades quando o plug-in é executado, de forma que as propriedades que foram modificadas por outros plug-ins sejam selecionadas corretamente.

Falha na primeira tentativa - definir a propriedade jaCoCoArgLine na prepare-agentconfiguração do objetivo de jacoco- o cenário falhou em meu segundo requisito, IntelliJ IDEA não conseguiu descobrir o agente para jmockit que uso no projeto para simulação de método estático

Pawel Kruszewski
fonte
Enfrentou o mesmo problema ao usar o JMockit e foi capaz de resolver o problema com esta solução. ou seja, adicionando argLine no plugin infalível
Karthik Rao
1

Eu adicionei um projeto Maven / Java com 1 classe de domínio com os seguintes recursos:

  • Teste de unidade ou integração com os plug-ins Surefire e Failsafe.
  • Findbugs.
  • Cobertura de teste via Jacoco .

Onde estão os resultados do Jacoco? Após testar e executar 'mvn clean', você pode encontrar os resultados em 'target / site / jacoco / index.html'. Abra este arquivo no navegador.

Aproveitar!

Tentei manter o projeto o mais simples possível. O projeto reúne muitas sugestões dessas postagens em um projeto de exemplo. Obrigado, colaboradores!

tm1701
fonte
Tentei seu projeto git, mas não está claro como ver o relatório.
Nagaraj Vittal de
Onde estão os resultados do Jacoco? Após testar e executar 'mvn clean', você pode encontrar os resultados em 'target / site / jacoco / index.html'. Abra este arquivo no navegador.
tm1701
Você pode querer vincular seu repositório de volta ao stackoverflow. Tive dificuldade em encontrar a pergunta novamente depois de encontrar um bug em sua demonstração.
Wolfgang Fahl
E ainda não funciona como esperado :-( o diretório de destino tem apenas aggregate.exec como seu conteúdo ao fazer mvn clean install ...
Wolfgang Fahl
1

Eu lutei por dias. Tentei todas as diferentes configurações sugeridas neste tópico. Nenhum deles funciona. Finalmente, acho que apenas a configuração importante é o objetivo de preparar o agente . Mas você tem que colocar na fase certa. Já vi tantos exemplos colocá-lo no " teste de pré-integração ", isso é um equívoco, pois só será executado após o teste unitário. Portanto, o teste de unidade não será instrumentado.

A configuração correta deve usar apenas a fase padrão (não especifique a fase explicitamente). E geralmente, você não precisa se preocupar com o plugin maven-surefire .

  <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
fonte
0

A execução diz que está colocando os dados do jacoco em /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec, mas sua configuração do maven está procurando os dados em $ {basedir} / target / Cover-reports / jacoco-unit. exec.

tdrury
fonte
1
Certo, então por que o plugin está ignorando o que eu especifico na configuração?
Dave
tente mover sua configuração destfile para a configuração da execução do agente de preparação. Nem todos os plug-ins maven lidam graciosamente com herança de configuração.
tdrury
0

Minha resposta está muito atrasada, mas para outros usuários No seu caso, você deve configurar o plug-in à prova de falhas para usar a configuração do agente de linha de comando salva na variável itCoverageAgent. Por exemplo

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

Na configuração do maven, o jacoco prepara os argumentos da linha de comando na fase de preparação do agente, mas o plug-in à prova de falhas não o usa, portanto não há arquivo de dados de execução.

jpl
fonte
0

Tente usar:

mvn jacoco:report -debug

para ver os detalhes sobre seu processo de relatório.

Eu configurei meu jacoco assim:

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

Em seguida, mvn jacoco:report -debugmostra usando a configuração padrão, o que significa que jacoco.execnão está em ~/jacoco.exec. O erro dizmissing execution data file .

Portanto, basta usar a configuração padrão:

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

E tudo funciona bem.

xiaoLiuLiu
fonte
0

Às vezes, a execução é executada na primeira vez e, quando fazemos a instalação limpa do maven, ela não é gerada depois disso. O problema era usar true para skipMain e skip properties em maven-compiler-plugin do arquivo pom principal. Remova-os se eles foram introduzidos como parte de qualquer problema ou sugestão.

Srini M
fonte
0

No meu caso, o agente de preparação tinha uma destFileconfiguração diferente , mas, portanto, o relatório teve que ser configurado com um dataFile, mas essa configuração estava faltando. Depois de dataFileadicionado, ele começou a funcionar bem.

Pavan Kumar
fonte