Pergunta

Eu tenho um projeto Maven com 4 módulos - 3 deles contêm código e alguns testes (ensaios iguais e hashcode das classes) Considerando que o quarto módulo é para testar os outros 3 módulos

.

Agora eu quero executar a ferramenta de cobertura de código cobertura para obter uma visão geral que as aulas são bem testado e quais não são. Eu fiz algumas investigações sobre o assunto e parece que cobertura não tem conhecimento de gerar as percentagens de cobertura de código corretas e coberturas de linha, se algumas fontes que são testados estão localizados dentro de outros módulos.

Eu li sobre alguns links como SeamTestCoverageWithCobertura e Usando o plugin de cobertura dentro de um multi -module Maven 2 mas tem que haver uma solução fora da caixa. qualquer pessoa pode relatar alguns novos rumos sobre este tema? Ou existem ferramentas Bether como cobertura? Eu tropecei em emma mas esta ferramenta não oferece cobertura de linha ...

Foi útil?

Solução

A partir da versão 2.6, há uma opção de agregação que pode ser definido como true no pom pai:

<reporting>
<plugins>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>cobertura-maven-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <outputDirectory>./target/tmpCobertura</outputDirectory>
        <formats>
            <format>html</format>
        </formats>
        <aggregate>true</aggregate>
    </configuration>
  </plugin>
</plugins>
</reporting>

Outras dicas

Não temos sonar aqui e agora, nós não podemos instalá-lo. Então eu tinha que encontrar uma solução alternativa e tem uma. Esta solução funciona com um mvn clean install -DrunCobertura=true simples em um projeto de multi módulo. Você só precisa adicionar aos seus super pom.xml do seu projeto, definir a propriedade working.dir e ele deve funcionar.

<profile>
    <id>runCobertura</id>
    <activation>
        <property>
            <name>runCobertura</name>
            <value>true</value>
        </property>
    </activation>
    <properties>
        <cobertura.format>html</cobertura.format>
        <cobertura.working.dir>${working.dir}/${project.version}/cobertura</cobertura.working.dir>
        <cobertura.complete.ser.file>${cobertura.working.dir}/complete.ser</cobertura.complete.ser.file>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.4.1</version>
                <inherited>false</inherited>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>.</directory>
                            <includes>
                                <include>cobertura.ser</include>
                            </includes>
                        </fileset>
                        <fileset>
                                <directory>${cobertura.working.dir}</directory>
                            </fileset>
                    </filesets>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <id>cobertura-Instrument</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <taskdef resource="tasks.properties"/>
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                <if>
                                    <available file="${project.build.outputDirectory}"/>
                                    <then>
                                        <cobertura-instrument>
                                            <fileset dir="${project.build.outputDirectory}">
                                                <include name="**/*.class"/>
                                            </fileset>
                                        </cobertura-instrument>
                                    </then>
                                </if>
                            </target>
                        </configuration>
                    </execution>
                    <execution>
                        <id>cobertura-createCombinedSerFile</id>
                        <phase>generate-test-sources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <taskdef resource="tasks.properties"/>
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                <if>
                                    <available file="${cobertura.complete.ser.file}"/>
                                    <then>
                                        <cobertura-merge datafile="${basedir}/tmp.ser">
                                            <fileset file="${cobertura.complete.ser.file}"/>
                                            <fileset file="${basedir}/cobertura.ser"/>
                                        </cobertura-merge>
                                        <move file="${basedir}/tmp.ser" tofile="${basedir}/cobertura.ser"/>
                                    </then>
                                </if>
                            </target>
                        </configuration>
                    </execution>
                    <execution>
                        <id>cobertura-copyResultSerFileAndSources</id>
                        <phase>test</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <taskdef resource="tasks.properties"/>
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                <if>
                                    <available file="${basedir}/cobertura.ser"/>
                                    <then>
                                        <move file="${basedir}/cobertura.ser" tofile="${cobertura.complete.ser.file}"/>
                                        <mkdir dir="${cobertura.working.dir}/source"/>
                                        <if>
                                            <available file="${basedir}/src/main/java"/>
                                            <then>
                                                <copy todir="${cobertura.working.dir}/source">
                                                    <fileset dir="src/main/java">
                                                        <include name="**/*.java"/>
                                                    </fileset>
                                                </copy>
                                            </then>
                                        </if>
                                        <cobertura-report datafile="${cobertura.complete.ser.file}" format="${cobertura.format}" destdir="${cobertura.working.dir}/report">
                                            <fileset dir="${cobertura.working.dir}/source"/>
                                        </cobertura-report>
                                    </then>
                                </if>
                            </target>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>net.sourceforge.cobertura</groupId>
                        <artifactId>cobertura</artifactId>
                        <version>1.9.4.1</version>
                    </dependency>
                    <dependency>
                        <groupId>ant-contrib</groupId>
                        <artifactId>ant-contrib</artifactId>
                        <version>20020829</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>net.sourceforge.cobertura</groupId>
            <artifactId>cobertura</artifactId>
            <version>1.9.4.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</profile>

O que ele faz:

1. @process-classes-Instrumento as classes compiladas do módulo.

2. @generate-test-sources-Mescla o arquivo .ser a partir de módulos anteriores com o criado um deste módulo para obter a cobertura de código completo.

3. @test-Cria o relatório de cobertura de código. Deve ser chamado no último módulo, mas devido ao fato de que o último módulo pode mudar, eu chamá-lo sempre e os relatórios anteriores serão substituídos. Se você usar o relatório no formato xml (para Jenkins) é rápido, por isso não importa.

De acordo com multi-module MCOBERTURA-65 , o maven cobertura plug-in ainda não sabe como relatórios agregados de sub-módulos em um consolidado. Algum trabalho tem sido feito para implementar um alvo merge no maven cobertura plug-in (veja MCOBERTURA-33 ), mas este código não tenha sido incluído no plugin ainda. Eu não testei o patch mim e não posso dizer se vale a pena uma tentativa.

Em conseqüência, muitas pessoas de fato sugerem usar o maven painel plug-in mas Eu, pessoalmente, ficar longe dele, pois não é muito gratificante no longo prazo e eu enfrentei muitos problemas com ele (problemas técnicos, perdidos da história, ...). Em vez disso, Recomendo vivamente Sonar . Ter um olhar para Nemo , uma instância pública da última versão do Sonar, para uma demonstração ao vivo desta ferramenta. Veja por exemplo o Commons Digester projeto e o detalhar de cobertura de código .

Existem alguns plugins que os relatórios agregados Cobertura (e outros). Confira o sonar e XRadar plugins. Há também a painel plug-in , mas é um pouco estranho.

FWIW Emma faz fazer cobertura de linha .

Eu gostaria realmente de agradecer Sven Oppermann para apresentar a sua solução perfil runCobertura. Isso ajudou -me a resolver a questão de 'como você consegue relatórios de cobertura de agregados para projetos multi-módulo quando você pode não ser capaz de utilizar Sonar.

Eu criei um exemplo que demonstra como criar projectos multi-módulo que produzem relatórios de cobertura de código que avaliam não só a cobertura de teste de unidade (em todos os sub-módulos), mas também a cobertura em testes de integração que TRAGA UP sua aplicação como um .WAR IN Jetty. O exemplo está hospedado aqui:

        http://dl.dropbox.com/u/9940067/code/multi-module-cobertura.zip 

A receita que eu estou oferecendo é bastante reutilizável se você copiar o perfil runCobertura listados abaixo (com base em um fornecer por Sven.)

Aqui estão algumas notas que irá ajudá-lo a usar este perfil:

  • o módulo de teste de integração, que lança cais (e define os testes que correr contra o .war produção) deve ou ser chamado web-test-driver-for-de cobertura de código, ou você deve modificar as declarações no bloco de configuração runCobertura.

  • seus relatórios de cobertura irá aparecer onde quer que você definir a variável

  • Você deve incluir 'limpa' na linha de comando quando você executar a sua construção para a cobertura de código. 'Limpa' vai soprar arquivos cobertura.ser anteriores, que se não rondando pode causar muito confuso relatórios para ser gerado (um sinal de que você precisa para 'limpo' é que os relatórios mostram 100% de cobertura para tudo, incluindo coisas que você sabe nunca é chamado.

      mvn -PrunCobertura clean install      # gives you the aggregate reports.
    
  • o módulo web-test-driver-for-de cobertura de código define um contexto ouvinte servlet que explicitamente libera as métricas cobertura para o disco Quando o servidor Web é desligado. Supostamente, o recipiente é suposto fazer isso automaticamente, mas isso não funcionou para mim, então Eu tive que ligar na chamada explícita para expulsar as métricas.

  • os testes de integração são feitos em Groovy porque eu baseei este em alguns esqueletos projeto Maven que já utilizados Groovy. Desculpe pela confusão acrescentou, mas mostra-lhe como fazer seus testes em Groovy (que é altamente recomendado qualquer maneira.)

  • Note que quando você compilar com a runCobertura perfil todos os seus artefatos são criados com instrumentação cobertura, até mesmo o seu arquivo .war. Você nunca quer deixar isso sair na produção de curso (para uma coisa ele seria executado realllll lento.) Eu não tenho ainda descobriu uma maneira de alimentos para obter os artefatos para renomear-se para que a 'cobertura-ness' é óbvia.

    <profiles>
    <profile>
        <id>runCobertura</id>
        <activation>
            <property>
                <name>runCobertura</name>
                <value>true</value>
            </property>
        </activation>
        <properties>
            <cobertura.format>html</cobertura.format>
            <working.dir>/tmp</working.dir>
            <cobertura.working.dir>${working.dir}/${project.version}/cobertura</cobertura.working.dir>
            <cobertura.complete.ser.file>${cobertura.working.dir}/complete.ser</cobertura.complete.ser.file>
    
            <!-- scope which determines whether or not cobertura is included in .war file: overriden here -->
            <cobertura.dependency.scope>compile</cobertura.dependency.scope>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>2.4.1</version>
                    <inherited>false</inherited>
                    <configuration>
                        <filesets>
                            <fileset>
                                <directory>.</directory>
                                <includes>
                                    <include>**/cobertura.ser</include>
                                </includes>
                            </fileset>
                            <fileset>
                                    <directory>${cobertura.working.dir}</directory>
                                </fileset>
                        </filesets>
                    </configuration>
                </plugin>
    
    
    
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.7</version>
                    <executions>
                        <execution>
                            <id>cobertura-Instrument</id>
                            <phase>process-classes</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <target>
                                    <taskdef resource="tasks.properties"/>
                                    <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                    <echo message="::PROCESS CLASSES: ${artifactId}"/>
    
                                    <if>
                                      <equals arg1="${artifactId}" arg2="web-test-driver-for-code-coverage" />
                                        <then>
                                            <echo message="::SKIPPING PHASE for integration test"/>
                                        </then>
                                        <else>
                                            <if>
                                                <available file="${project.build.outputDirectory}"/>
                                                <then>
                                                    <echo message="::BEFORE INSTRUMENT"/>
                                                    <cobertura-instrument>
                                                        <fileset dir="${project.build.outputDirectory}">
                                                            <include name="**/*.class"/>
                                                        </fileset>
                                                    </cobertura-instrument>
                                                </then>
                                            </if>
                                        </else>
                                    </if>
    
    
                                </target>
                            </configuration>
                        </execution>
                        <execution>
                            <id>cobertura-createCombinedSerFile</id>
                            <phase>generate-test-sources</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <target>
                                    <taskdef resource="tasks.properties"/>
                                    <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                    <echo message=":::generate-test-sources"/>
    
    
                                    <if>
                                      <equals arg1="${artifactId}" arg2="web-test-driver-for-code-coverage" />
                                        <then>
                                            <echo message="::SHORT CIRCUIT COMBINE PHASE for integration test"/>
                                            <echo  message="source - ${cobertura.complete.ser.file} dest - ${basedir}/cobertura.ser"/>
                                            <copy file="${cobertura.complete.ser.file}" tofile="${basedir}/cobertura.ser"/>
                                        </then>
                                        <else>
                                            <if>
                                                <available file="${basedir}/cobertura.ser"/>
                                                <then>
                                                    <echo message="::: Is available ${basedir}/cobertura.ser"/>
                                                </then>
                                            </if>
    
                                            <if>
                                                <available file="${cobertura.complete.ser.file}"/>
                                                <then>
                                                    <echo message="before merge1"/>
                                                    <cobertura-merge datafile="${basedir}/tmp.ser">
                                                        <fileset file="${cobertura.complete.ser.file}"/>
                                                        <fileset file="${basedir}/cobertura.ser"/>
                                                    </cobertura-merge>
                                                    <echo message="move temp.ser to ${basedir}/cobertura.ser"/>
                                                    <move file="${basedir}/tmp.ser" tofile="${basedir}/cobertura.ser"/>
                                                </then>
                                            </if>
                                        </else>
                                    </if>
                                </target>
                            </configuration>
                        </execution>
                        <execution>
                            <id>cobertura-copyResultSerFileAndSources</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <target>
                                    <taskdef resource="tasks.properties"/>
                                    <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
    
                                    <echo message=":::copyResultSerFileAndSources -beforeIf"/>
                                    <if>
                                        <available file="${basedir}/cobertura.ser"/>
                                        <then>
                                            <echo message="move1"/>
                                            <move file="${basedir}/cobertura.ser" tofile="${cobertura.complete.ser.file}"/>
                                            <mkdir dir="${cobertura.working.dir}/source"/>
                                            <if>
                                                <available file="${basedir}/src/main/java"/>
                                                <then>
                                                    <copy todir="${cobertura.working.dir}/source">
                                                        <fileset dir="src/main/java">
                                                            <include name="**/*.java"/>
                                                        </fileset>
                                                    </copy>
                                                </then>
                                            </if>
                                            <echo message="runreport"/>
                                            <cobertura-report datafile="${cobertura.complete.ser.file}" format="${cobertura.format}" destdir="${cobertura.working.dir}/report">
                                                <fileset dir="${cobertura.working.dir}/source"/>
                                            </cobertura-report>
                                        </then>
                                    </if>
                                </target>
                            </configuration>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>net.sourceforge.cobertura</groupId>
                            <artifactId>cobertura</artifactId>
                            <version>1.9.4.1</version>
                        </dependency>
                        <dependency>
                            <groupId>ant-contrib</groupId>
                            <artifactId>ant-contrib</artifactId>
                            <version>20020829</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
        <dependencies>
            <dependency>
                <groupId>net.sourceforge.cobertura</groupId>
                <artifactId>cobertura</artifactId>
                <version>1.9.4.1</version>
            </dependency>
        </dependencies>
    </profile>
    </profiles>
    

Thomas Sundberg oferece uma solução interessante em que a instrumentação e relatórios de teste é feito através ant, mas todo o gerenciamento de testes e dependência através mvn.

Confira aqui: thomassundberg wordpress

Isso significa que você tem que executar os comandos abaixo no nível pai nesta ordem:

mvn clean compile
ant instrument
mvn test
ant report

A integração desses passos em sonar é descrito por Martijn Stelinga.

test-cobertura-in -multi-module-projectos

Eu poderia implementar algo muito parecido com o que você precisa graças a esta resposta: Maven - dependência add on fonte artefato

Eu só acrescentou <classifier>sources</classifier> e cobertura inclui aulas de dependências também.

Cumprimentos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top