Pergunta

Temos um multiproject que estamos tentando executar relatórios de cobertura de teste Cobertura como parte da construção do site da MVN. Eu posso fazer com que a Cobertura seja executada nos projetos infantis, mas isso reporta erroneamente 0% de cobertura, mesmo que os relatórios ainda destacem as linhas de código que foram atingidas pelos testes de unidade.

Estamos usando o MVN 2.0.8. Eu tentei correr mvn clean site, mvn clean site:stage e mvn clean package site. Eu sei que os testes estão em execução, eles aparecem nos relatórios SureFire (os relatórios TXT/XML e do site). Estou perdendo alguma coisa na configuração? O Cobertura não funciona bem com multirojetos?

Isso está no pai .pom:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <inherited>true</inherited>
                <executions>
                    <execution>
                        <id>clean</id>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
            <inherited>true</inherited>
        </plugin>
    </plugins>
</reporting>

Eu tentei executá -lo com e sem o seguinte na criança .poms:

    <reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
        </plugin>
    </plugins>
</reporting>

Eu recebo isso na saída da construção:

...
[INFO] [cobertura:instrument]
[INFO] Cobertura 1.9 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
Instrumenting 3 files to C:\workspaces\sandbox\CommonJsf\target\generated-classes\cobertura
Cobertura: Saved information on 3 classes.
Instrument time: 186ms

[INFO] Instrumentation was successful.
...
[INFO] Generating "Cobertura Test Coverage" report.
[INFO] Cobertura 1.9 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
Cobertura: Loaded information on 3 classes.
Report time: 481ms

[INFO] Cobertura Report generation was successful.

E o relatório se parece com o seguinte:cobertura report

Foi útil?

Solução

Suspeito que você esteja perdendo uma execução do plug -in Cobertura durante a fase de compilação, para que o código seja instrumentado apenas pelos plugins de relatório, no ciclo de vida do site, após a execução dos testes. Portanto, as execuções de teste não são escolhidas porque elas são executadas em código não instrumentado. Analise seus logs de construção com mais cuidado - se eu estiver certo, você notará que os testes SureFire são executados antes do instrumento Cobertura:

Minha configuração é semelhante à sua, mas, além de especificar a Execção limpa no PluginManagement (como você), especifiquei o plug -in Cobertura explicitamente na seção de plugins de construção:

  <build>
  ...
    <plugins>
    ...
      <plugin>
        <inherited>true</inherited>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <version>${cobertura.plugin.version}</version>
      </plugin>
    </plugins>
  </build>

Minha configuração meio que funciona, e todo o material da Cobertura está no POM global em toda a organização, que todos os projetos usam como pai.

Dessa forma, os projetos não especificam nada relacionado à Cobertura em seus Pom.xml, mas eles ainda geram relatórios de cobertura.

Outras dicas

Não fui bem-sucedido em fazer com que a Cobertura combine relatórios de vários projetos. Isso tem sido um problema em geral com relatórios com vários projetos.

Estamos avaliando sonar como uma solução para nossos relatórios de métricas. Parece fazer um ótimo trabalho ao fornecer métricas resumidas em projetos, incluindo vários projetos.

A solução implementada por mim é um tanto manual, mas funciona. Consiste em várias etapas de uma é uma etapa para combinar os vários arquivos .SER gerados pela Cobertura. Isso pode ser feito usando a ferramenta de comando cobertura-merge dentro de uma tarefa Maven.

De acordo com a saída que você mostra, os arquivos não são realmente instrumentados, ele diz que apenas três arquivos são instrumentados.

O @Marco está certo, não é possível alcançar isso normalmente através do MAVEN apenas, pois o plug -in MAVEN Cobertura está faltando uma meta de mesclagem.

Você pode alcançá -lo através de uma mistura de objetivos Maven e ANT: http://thomasundberg.wordpress.com/2012/02/18/test-coverage-in-a-multi-module-maven-project/

No entanto, no caso de você ter um único projeto realizado, não há necessidade de se fundir. Você pode, no projeto de teste, copiar o arquivo .ser e as classes instrumentadas do projeto em teste:

//in test project
<plugin> 
<groupId>com.github.goldin</groupId>
<artifactId>copy-maven-plugin</artifactId>
<version>0.2.5</version>
<executions>
    <execution>
    <id>copy-cobertura-data-from-project-under-test</id>
    <phase>compile</phase>
    <goals>
        <goal>copy</goal>
    </goals>
    <configuration>
    <resources>
        <resource>
                        <directory>${project.basedir}/../<project-under-test>/target/cobertura</directory>
                            <targetPath>${project.basedir}/target/cobertura</targetPath>
                <includes>                  
                              <include>*.ser</include>
                </includes>
           </resource>
           <resource>
                    <directory>${project.basedir}/../<project-under-test>/target/generated-classes/cobertura/</directory>
                    <targetPath>${project.basedir}/target/generated-classes/cobertura</targetPath>
                    <preservePath>true</preservePath>
           </resource>
        </resources>
            </configuration>
        </execution>
</executions>
</plugin>

//in parent project
<build>
<plugins>
    <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>cobertura-maven-plugin</artifactId>
    <configuration>
        <format>xml</format>
        <aggregate>true</aggregate>
    </configuration>
    <executions>
        <execution>
                    <goals>
                <goal>clean</goal>
            </goals>
        </execution>
    </executions>
</plugin>
    </plugins>
</build>
<reporting>
<plugins>
    <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>cobertura-maven-plugin</artifactId>
    <version>${cobertura.version}</version>
        </plugin>
</plugins>
 </reporting>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top