Eu estava na mesma situação que você, as meias respostas espalhadas por toda a Internet eram bastante irritantes, pois parecia que muitas pessoas tinham o mesmo problema, mas ninguém podia se dar ao trabalho de explicar completamente como o resolveram.
Os documentos do Sonar se referem a um projeto do GitHub com exemplos úteis. O que fiz para resolver isso foi aplicar a lógica dos testes de integração aos testes de unidade regulares (embora os testes de unidade adequados devam ser específicos ao submódulo, esse nem sempre é o caso).
No pai pom.xml, adicione estas propriedades:
<properties>
<!-- Sonar -->
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.language>java</sonar.language>
</properties>
Isso fará com que o Sonar obtenha relatórios de teste de unidade para todos os submódulos no mesmo local (uma pasta de destino no projeto pai). Também diz ao Sonar para reutilizar os relatórios executados manualmente, em vez de rodar por conta própria. Nós só precisamos executar o jacoco-maven-plugin para todos os submódulos, colocando-o no pom pai, dentro de build / plugins:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.0.201210061924</version>
<configuration>
<destFile>${sonar.jacoco.reportPath}</destFile>
<append>true</append>
</configuration>
<executions>
<execution>
<id>agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
destFile
coloca o arquivo de relatório no local em que o Sonar o procurará e append
o anexará ao arquivo em vez de substituí-lo. Isso combinará todos os relatórios da JaCoCo para todos os submódulos no mesmo arquivo.
O Sonar examinará esse arquivo para cada submódulo, já que foi o que indicamos acima, fornecendo resultados combinados de testes de unidade para arquivos com vários módulos no Sonar.
mvn package
antes de executarmvn sonar:sonar
para obter o novo caminho do relatório gerado.Perguntas frequentes
Perguntas do alto da minha cabeça desde aquela época eu enlouqueci com o jacoco.
Meu servidor de aplicativos (jBoss, Glassfish ..) localizado no Iraque, na Síria, seja o que for. É possível obter cobertura de vários módulos ao executar testes de integração nele? Jenkins e Sonar também estão em servidores diferentes.
Sim. Você precisa usar o agente jacoco que roda no modo
output=tcpserver
jacoco ant lib. Basicamente doisjar
s. Isso lhe dará 99% de sucesso.Como o agente jacoco funciona?
Você anexa uma string
para o servidor de aplicativos JAVA_OPTS e reinicie-o. Nesta cadeia, apenas
[your_path]
deve ser substituído pelo caminho para jacocoagent.jar, armazenado (armazene-o!) Na sua VM onde o servidor de aplicativos é executado. Desde o momento em que você inicia o servidor de aplicativos, todos os aplicativos implantados serão monitorados dinamicamente e suas atividades (significando uso de código) estarão prontas para você entrar no formato jacocos .exec por solicitação tcl.Posso redefinir o agente jacoco para começar a coletar dados de execução apenas desde o início do teste?
Sim, para esse propósito, você precisa do script jacocoant.jar e ant build, localizado no seu espaço de trabalho jenkins.
Então, basicamente, o que eu preciso de http://www.eclemma.org/jacoco/ é o jacocoant.jar localizado no meu espaço de trabalho jenkins e o jacocoagent.jar localizado na minha VM do servidor de aplicativos?
Está certo.
Eu não quero usar ant, ouvi dizer que o plugin jacoco maven também pode fazer todas as coisas.
Isso não está certo, o plug-in jacoco maven pode coletar dados de teste de unidade e alguns dados de testes de integração (consulte Arquillian Jacoco ), mas se você tiver, por exemplo, testes seguros como uma compilação separada no jenkins e quiser mostrar a cobertura de vários módulos, eu posso veja como o maven plugin pode ajudá-lo.
O que exatamente o agente jacoco produz?
Somente dados de cobertura em
.exec
formato. O sonar pode então lê-lo.O jacoco precisa saber onde estão minhas classes java?
Não, sonar faz, mas não jacoco. Quando você faz
mvn sonar:sonar
caminho para as aulas, entra em jogo.E o roteiro das formigas?
Ele deve ser apresentado no seu espaço de trabalho do jenkins. Meu script formiga, eu chamei
jacoco.xml
assim:Dois parâmetros obrigatórios que você deve passar ao chamar esse script,
-Dworkspace=$WORKSPACE
use-o para apontar para o espaço de trabalho do jenkins e para o-Djacoco.host=yourappserver.com
host semhttp://
Observe também que coloquei meu
jacocoant.jar
em $ {workspace} /tools/jacoco/jacocoant.jarO que eu devo fazer a seguir?
Você iniciou seu servidor de aplicativos com jacocoagent.jar?
Você colocou script ant e jacocoant.jar no seu espaço de trabalho de jenkins?
Se sim, a última etapa é configurar uma compilação do jenkins. Aqui está a estratégia:
jacocoReset
para redefinir todos os dados coletados anteriormente.jacocoReport
para obter o relatórioSe tudo estiver certo, você verá
it-jacoco.exec
no seu espaço de trabalho de construção.Olhe para a captura de tela, eu também
ant
instalei no meu espaço de trabalho no$WORKSPACE/tools/ant
diretório, mas você pode usar um que esteja instalado no seu jenkins.Como empurrar este relatório no sonar?
O Maven
sonar:sonar
fará o trabalho (não esqueça de configurá-lo), aponte-o para o pom.xml principal para que ele execute todos os módulos. Use osonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec
parâmetro para informar ao sonar onde seu relatório de teste de integração está localizado. Toda vez que analisará novas classes de módulos, buscará informações sobre a cobertura noit-jacoco.exec
.Eu já tenho o jacoco.exec no meu diretório `target`, o` mvn sonar: sonar` o ignora / remove
Por padrão,
mvn sonar:sonar
fazclean
e exclui o diretório de destino, usesonar.dynamicAnalysis=reuseReports
para evitá-lo.fonte
NOVA MANEIRA DESDE A VERSÃO 0.7.7
Desde a versão 0.7.7, há uma nova maneira de criar um relatório agregado:
Você cria um projeto separado de 'relatório' que coleta todos os relatórios necessários (qualquer objetivo no projeto agregador é executado antes de seus módulos, portanto, não pode ser usado).
O pom raiz se parece com isso (não se esqueça de adicionar o novo módulo de relatório nos módulos):
Os poms de cada submódulo não precisam ser alterados. O pom do módulo de relatório fica assim:
Um exemplo completo pode ser encontrado aqui .
fonte
Vou postar minha solução, pois ela é sutilmente diferente das outras e também me levou um dia sólido para acertar, com a ajuda das respostas existentes.
Para um projeto Maven com vários módulos:
Onde o
WAR
projeto é o aplicativo Web principal,LIB
1 e 2 são módulos adicionais dos quaisWAR
depende eTEST
é onde os testes de integração residem.TEST
gira uma instância incorporada do Tomcat (não pelo plug-in do Tomcat) e executa oWAR
projeto e os testa por meio de um conjunto de testes JUnit. OWAR
eLIB
projetos têm seus próprios testes de unidade.O resultado de tudo isso é a integração e a cobertura do teste de unidade serem separadas e poderem ser distinguidas no SonarQube.
ROOT pom.xml
WAR
,LIB
ETEST
pom.xml
herdará o a plugins execução JaCoCo.TEST pom.xml
Também achei a publicação no blog de Petri Kainulainens, 'Criando relatórios de cobertura de código para testes de unidade e integração com o JaCoCo Maven Plugin', valiosa para o lado da configuração da JaCoCo.
fonte
agent-for-it
é necessário apenas ao executar os testes noTEST
módulo, mas a configuração atual o executa para todos os outros módulos, nos quais não tem valor. A melhoria seria teragent-for-ut
executado em todos os outros módulos eagent-for-it
somente executadoTEST
.Existe uma maneira de conseguir isso. A mágica é criar um arquivo jacoco.exec combinado. E com o maven 3.3.1 existe uma maneira fácil de conseguir isso. Aqui meu perfil:
Se você adicionar esse perfil ao pom pai e ligar para
mvn clean install sonar:sonar -DrunSonar
para obter a cobertura completa.A mágica aqui é
maven.multiModuleProjectDirectory
. Essa pasta é sempre a pasta em que você iniciou sua compilação.fonte
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar -DrunSonar
devido aA required class was missing while executing org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar: org/sonar/batch/bootstrapper/IssueListener
erro.A configuração que uso no meu pom de nível pai, onde tenho fases de teste de unidade e integração separadas.
Eu configuro as seguintes propriedades no pai POM Properties
Coloco as definições de plug-in sob gerenciamento de plugins.
Observe que eu defino uma propriedade para os argumentos surefire (surefireArgLine) e failafe (failafeArgLine) para permitir que o jacoco configure o javaagent para executar com cada teste.
Em pluginManagement
E na seção de compilação
E na seção de relatórios
fonte
<append>true</append>
configuração de acordo com asprepare-agent
seções ...Encontrei outra solução para as novas versões do Sonar em que o formato de relatório binário da JaCoCo (* .exec) estava obsoleto e o formato preferido é XML (SonarJava 5.12 e superior). A solução é muito simples e semelhante à solução anterior com relatórios * .exec no diretório pai deste tópico: https://stackoverflow.com/a/15535970/4448263 .
Supondo que nossa estrutura de projeto seja:
Você precisa da seguinte configuração do plug-in do maven build no pom do projeto agregado:
Em seguida, crie um projeto com o maven:
E para o Sonar, você deve definir propriedades na GUI de administração:
ou usando a linha de comando:
Descrição
Isso cria relatórios binários para cada módulo em diretórios padrão:
target/jacoco.exec
. Em seguida, cria relatórios XML para cada módulo em diretórios padrão:target/site/jacoco/jacoco.xml
. Em seguida, cria um relatório agregado para cada módulo no diretório personalizado${project.basedir}/../target/site/jacoco-aggregate/
que é relativo ao diretório pai de cada módulo. Para o módulo A e o módulo B, este será o caminho comummoduleC/target/site/jacoco-aggregate/
.Como o módulo B depende do módulo A, o módulo B será construído por último e seu relatório será usado como um relatório de cobertura agregado no Sonar para os módulos A e B.
Além do relatório agregado, precisamos de um relatório normal do módulo, pois os relatórios agregados da JaCoCo contêm dados de cobertura apenas para dependências.
Juntos, esses dois tipos de relatórios fornecem dados de cobertura completa para o Sonar.
Há uma pequena restrição: você deve poder escrever um relatório no diretório pai do projeto (deve ter permissão). Ou você pode definir a propriedade
jacoco.skip=true
no pom.xml (moduleC) do projeto raiz ejacoco.skip=false
nos módulos com classes e testes (moduleA e moduleB).fonte
fonte
Como sonares
sonar.jacoco.reportPath
,sonar.jacoco.itReportPath
esonar.jacoco.reportPaths
todos foram preteridos , você deve usarsonar.coverage.jacoco.xmlReportPaths
agora. Isso também tem algum impacto se você deseja configurar um projeto de maven de múltiplos módulos com o Sonar e o Jacoco.Como o @Lonzak apontou , desde o Sonar 0.7.7, você pode usar o objetivo de agregação de relatórios do Sonars. Basta colocar no seu pai pom a seguinte dependência:
Como as versões atuais do jacoco-maven-plugin são compatíveis com o xml-reports, isso criará para cada módulo em sua própria pasta de destino uma pasta agregada site / jacoco contendo um
jacoco.xml
arquivo.Para permitir que o Sonar combine todos os módulos, use o seguinte comando:
Para manter minha resposta curta e precisa, não mencionei as dependências
maven-surefire-plugin
emaven-failsafe-plugin
. Você pode apenas adicioná-los sem nenhuma outra configuração:fonte
Você pode chamar uma tarefa ant chamada mesclagem no maven, para reunir todos os arquivos de cobertura (* .exec) no mesmo arquivo.
Se você estiver executando testes de unidade, use o pacote de preparação da fase ; se você executar o teste de integração, use o pós-teste de integração .
Esse site tem um exemplo de como chamar tarefa jacoco form no projeto maven
Você pode usar esse arquivo mesclado no sonar.
fonte
para ter testes de unidade E testes de integração, você pode usar o maven-surefire-plugin e o maven-failafe-plugin com inclusões / exclusões restritas. Eu estava tocando com o CDI enquanto entrava em contato com o sonar / jacoco, então acabei neste projeto:
https://github.com/FibreFoX/cdi-sessionscoped-login/
Talvez isso te ajude um pouco. no meu pom.xml, uso "-javaagent" implícito, definindo a opção argLine na seção de configuração dos plug-ins de teste especificados. Explícito usando ANT em projetos MAVEN é algo que eu não tentaria, para mim é muito misturar dois mundos.
Eu só tenho um projeto de módulo único, mas talvez ajude você a ajustar o seu para funcionar.
nota: talvez nem todos os plug-ins do maven estejam atualizados, talvez alguns problemas sejam corrigidos nas versões posteriores
fonte
Este exemplo funciona muito bem para mim:
fonte