2012-04-18 2 views
7

Если у меня есть проект java, который использует библиотеку (файл jar), можно ли получить покрытие кода классов внутри этой банки?Как я могу получить покрытие кода внешней java-библиотеки с помощью jacoco?

Идея заключается в том, что я хотел бы узнать, какая доля внешних библиотек, на которые опирается проект (скажем, весна, спящий режим, или это могут быть банки scala, если это был проект scala, почему бы и нет) фактически используются. Я даже предполагаю, что я мог бы попытаться перечислить их и отменить их в одной банке, которая должна содержать только. Необходимые файлы .class (например, с плагином, например apache felix), чтобы получить наименьшую возможную банку. Я не уверен, что я действительно хочу это сделать, я знаю, что это, вероятно, плохая идея по ряду причин, но я думаю об этом как о эксперименте.

Я не могу найти, как это сделать, jacoco сообщает только покрытие для файлов классов непосредственно внутри моего проекта. Может быть, я делаю что-то неправильно, я использую Maven плагин, как это:

 <plugin> 
      <groupId>org.jacoco</groupId> 
      <artifactId>jacoco-maven-plugin</artifactId> 
      <version>0.5.6.2012</version> 
      <configuration> 
       <destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile> 
       <datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile> 
       <includes> 
        <include>**</include> 
       </includes> 
      </configuration> 
      <executions> 
       <execution> 
        <id>jacoco-initialize</id> 
        <goals> 
         <goal>prepare-agent</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>jacoco-site</id> 
        <phase>package</phase> 
        <goals> 
         <goal>report</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

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

Заранее благодарен!


Редактировать после ответа Oers':

я узнал, как сделать это с муравьем и antrun-плагин, хотя это очень сложно, у меня было много проблем с antrun версий плагинов (не в состоянии сделать недавняя работа над версиями, даже для основной задачи), и я бы очень хотел придерживаться Maven. Если кто-то знает, как сделать эквивалент с плагином j jacoco maven вместо муравья, мне интересно!

Частичное решение с муравьем: на самом деле файл jacoco.exec содержит ссылки на классы моих внешних банок; поэтому следует сказать, что задача отчета должна учитывать эту флягу, а не фазу времени выполнения, как я думал. Вот конфигурация Maven я (я нашел справку по http://intellectualcramps.wordpress.com/2012/03/22/jacoco-tycho-and-coverage-reports/):

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <!--<version>1.7</version>--> 
      <dependencies> 
       <dependency> 
        <groupId>org.jacoco</groupId> 
        <artifactId>org.jacoco.ant</artifactId> 
        <version>0.5.6.2012</version> 
       </dependency> 
       <dependency> 
        <groupId>ant-contrib</groupId> 
        <artifactId>ant-contrib</artifactId> 
        <version>20020829</version> 
       </dependency> 
      </dependencies> 
      <executions> 
       <execution> 
        <id>jacoco-report</id> 
        <phase>package</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <tasks> 

          <taskdef name="jacoco-report" 
            classname="org.jacoco.ant.ReportTask" 
            classpathref="maven.plugin.classpath" /> 
          <taskdef classpathref="maven.runtime.classpath" 
        resource="net/sf/antcontrib/antcontrib.properties" /> 
          <available 
       file="${project.basedir}/target/jacoco.exec" 
       property="jacoco.exec.file.exists" /> 
          <echo message="${project.basedir}/target/jacoco.exec" /> 
          <if> 
           <equals arg1="${jacoco.exec.file.exists}" 
         arg2="true" /> 
           <then> 
            <echo message="Executing jacoco report" /> 

            <trycatch> 
             <try> 
              <jacoco-report> 
               <executiondata> 
                <file 
           file="${project.basedir}/target/jacoco.exec" /> 
               </executiondata> 

               <structure name="Minerva"> 
                <classfiles> 
                 <fileset 
            dir="target/classes" /> 

                 <fileset dir="C:/Data/dev/m2Repository/com/groupama/framework/crypt/fwk-cryptage/1.0/"> 
                  <include name="**/*.jar"/> 
                 </fileset> 

                </classfiles> 

                <sourcefiles 
            encoding="UTF-8"> 
                 <fileset 
            dir="src/main/java" /> 
                </sourcefiles> 
               </structure> 
               <html destdir="${project.basedir}/target/jacoco/report" /> 
               <xml destfile="${project.basedir}/target/jacoco/report/jacoco.xml"/> 
              </jacoco-report> 
             </try> 
             <catch> 
              <echo>skipping</echo> 
             </catch> 
            </trycatch> 
           </then> 
           <else> 
            <echo message="No jacoco.exec file found." /> 
           </else> 
          </if> 
         </tasks> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

ответ

1

Вы должны дать гол доклад, классы библиотеки вы хотите проанализировать. К сожалению, я не могу найти документацию по этому поводу. The official docu is ... hm ... sparse

ЕСЛИ вы можете выполнить муравей, я бы предложил посмотреть на report task.

<jacoco:report> 

    <executiondata> 
     <file file="jacoco.exec"/> 
    </executiondata> 

    <structure name="Example Project"> 
     <classfiles> 
      <fileset dir="classes"/> <!-- HERE THE CLASSES FROM YOUR LIB --> 
     </classfiles> 
     <sourcefiles encoding="UTF-8"> 
      <fileset dir="src"/> <!-- HERE THE SORUCESFROM YOUR LIB --> 
     </sourcefiles> 
    </structure> 

    <html destdir="report"/> 

</jacoco:report> 
+0

Вы правы в документации, которая действительно должна быть более полной. Я действительно думал, что это была задача запуска, которую нужно было параметризовать; вы заставили меня заглянуть в файл jacoco.exec и понять, что он уже содержит ссылки на классы внутри внешних банок, а это значит, что это отчет, который нужно правильно параметризовать. Не зная муравей, я провел все утро, прежде чем заставить его работать, но он, наконец, работал.Он частично удовлетворяет меня, см. Мой ответ ниже, но это шаг в правильном направлении. Спасибо большое! – Guillaume

+0

спасибо, что сохранил мой день – vinod

0

Несмотря на то, что этот вопрос является старым, он по-прежнему представляется актуальным. Если внешняя библиотека является проект Maven, вы можете перейти в исходный каталог библиотеки и запросить отчет JaCoCo полученный ранее с TestSuite внутри там:

mvn org.jacoco:jacoco-maven-plugin:0.7.8:report -Djacoco.dataFile=/path/to/jacoco.exec 

вы получите отчет в $ {проекта}/цели/сайта/jacoco.