2013-05-17 4 views
10

Я использую Ant, Jacoco и Sonar. Когда я запускаю свою сборку, Sonar говорит мне, что «Нет информации о покрытии за тест». и панель управления Sonar имеет мои результаты покрытия, но я не могу развернуть их, чтобы увидеть код. Тем не менее, HTML-отчет, созданный Jacoco, включает в себя детализацию в коде. Это моя задача охвата:
«Нет информации о покрытии за тест». от Sonar с Jacoco Ant build

<jacoco:coverage destfile="${coverage.output.file}" > 
     <junit printsummary="on" 
      errorProperty="test.failed" 
      failureProperty="test.failed" 
      haltonfailure="yes" 
      fork="true"> 
      <formatter type="brief" usefile="false" /> 
      <formatter type="xml" /> 
      <classpath> 
       <path refid="test.build.class.path"/> 
       <pathelement location="${test.bin.dir}"/>  
      </classpath> 
      <batchtest todir="${results.dir}"> 
       <fileset dir="${test.bin.dir}"> 
        <include name = "**/**/*Test.class"/> 
       </fileset> 
      </batchtest> 
     </junit> 
    </jacoco:coverage> 

    <jacoco:report> 
     <executiondata> 
      <file file="${coverage.output.file}"/> 
     </executiondata> 
     <structure name="${ant.project.name}"> 
      <classfiles> 
       <fileset dir="${bin.dir}"/> 
      </classfiles> 
      <sourcefiles encoding="UTF-8"> 
       <fileset dir="${src.dir}"/> 
      </sourcefiles> 
     </structure> 
     <html destdir="${coverage.results.dir}"/> 
    </jacoco:report> 
</target> 

И моя цель Sonar выглядит следующим образом:

<target name="sonar" depends = "run"> 
    <property name="sonar.jdbc.url" value="..." /> 
    <property name="sonar.jdbc.username" value="...r" /> 
    <property name="sonar.jdbc.password" value="..." /> 

    <property name="sonar.projectKey" value="org.codehaus.sonar:example-java-ant" /> 
    <property name="sonar.projectName" value="${ant.project.name} (ant)" /> 
    <property name="sonar.projectVersion" value="1.0" /> 
    <property name="sonar.language" value="java" /> 
    <property name="sonar.sources" value="${src.dir}" /> 
    <property name="sonar.binaries" value="${bin.dir},${test.bin.dir}" /> 
    <property name="sonar.libraries" value="${lib.dir}/*.jar" />  

    <property name="sonar.dynamicAnalysis" value="reuseReports" /> 
    <property name="sonar.surefire.reportsPath" value="${results.dir}" /> 
    <property name="sonar.java.coveragePlugin" value="jacoco" /> 
    <property name="sonar.jacoco.reportPath" value="${coverage.output.file}" /> 

    <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml"> 
     <classpath>   
      <fileset dir="${lib.dir}" includes="sonar-ant-task-2.0.jar"/> 
     </classpath> 
    </taskdef> 

    <sonar:sonar />  
</target> 

Кто-нибудь знает, что мне не хватает?

ответ

2

Похоже, вы не установили свойство «sonar.tests», чтобы сообщить Sonar, где найти исходный код ваших модульных тестов. См. http://docs.sonarqube.org/display/SONAR/Analysis+Parameters.

David RACODON | SonarSource

+2

Я подтверждаю, что в моем случае это было установлено для проверки источников, тогда как оно должно указывать на скомпилированные классы. –

+5

Я попытался добавить свойство sonar.tests, чтобы указать как исходный код, так и байтовый код. Ничего не сработало. Я все еще в тупике. –

+0

У меня такая же проблема. Я думаю, что это может быть ошибкой с задачей Ant, поскольку я сделал это с помощью Sonar Runner, и это сработало нормально, но те же свойства в Ant не удались. – rozner

2

Свойство sonar.test должно быть установлено на классы испытаний. У нас в нашем maven pom есть следующее. Для ANT вы сделать что-то подобное:

<profile> 
     <id>sonarprofile</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <properties> 
      <sonar.host.url>....our host..../sonar.host.url> 
      <sonar.projectKey>....our key....</sonar.projectKey> 
      <sonar.projectName>${project.artifactId}</sonar.projectName> 
      <sonar.projectVersion>${project.version}</sonar.projectVersion> 
      <sonar.language>java</sonar.language> 
      <sonar.sources>src/main/java</sonar.sources> 
      <!-- sonar.tests>target/test-classes</sonar.tests --> 
      <!-- that is the default location for Maven projects and --> 
      <!-- this parameter can't actually be set in that case --> 
      <sonar.scm.provider>git</sonar.scm.provider> 
      <sonar.login>${SONAR_LOGIN}</sonar.login> 
      <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> 
      <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin> 
      <sonar.jacoco.reportPath>${basedir}/target/coverage-reports/jacoco-unit.exec</sonar.jacoco.reportPath> 
     </properties> 
    </profile> 

Incidently есть некоторые другие свойства, используемые в этом:

  • Я сгенерированный маркер SONAR через мой эхолот пользователь, а не использовать логин и пароля
  • Покрытие JaCoCo генерируется отдельно с использованием jacoco-maven-plugin, а sonar.jacoco.reportPath - это свойство, используемое в этом плагине. Ответ

Дэвида Racodon (в https://stackoverflow.com/a/16645108/1019307) когда-то был правильным, но в середине 2014 SonarQube остановил выполнение тестов в рамках исполнения эхолота (http://www.sonarqube.org/unit-test-execution-in-sonarqube/). Следовательно, почему указание на источник теста больше не работает.

+0

Это 'sonar.tests', а не' sonar.test'. Также: «Не совместим с Maven, который извлекает тест из местоположения по умолчанию для проектов Java Maven». См. Http://docs.sonarqube.org/display/SONAR/Analysis+Parameters –

+0

Хорошо, что это один из параметров неправильный (хотя он работал для меня). Хотя на самом деле это не так, но избыточно. Это причина для понижения? Простой комментарий заставил бы меня обновить мой ответ. – HankCa

+1

Привет @HankCa, Теперь, когда вы обновили свой ответ, я удалил downvote. Не принимайте единообразных голосов, которые серьезно :-) –