2015-07-30 15 views
9

"bohça 'Kod Kapsama Raporu' in Sınıflar yürütme verileri ile eşleşme yapmak". ben gibi hatalar alıyorum:jacoco kod kapsamı rapor üreteci: Rapor etiketi: Ben jacoco kullanarak jacoco raporu oluştururken am

[jacoco:report] Classes in bundle 'Code Coverage Report' do no match with execution data. For report generation the same class files must be used as at runtime. 
[jacoco:report] Execution data for class xxxxx does not match. 
[jacoco:report] Execution data for class yyyyy does not match. 

karınca rapor hedef gibi görünüyor:

böylece üretilen
<target name="report"> 
       <jacoco:report> 
         <executiondata> 
           <file file="${jacocoexec.dir}/${jacocoexec.filename}"/> 
         </executiondata> 
         <!-- the class files and optional source files ... --> 
         <structure name="Code Coverage Report"> 
           <classfiles> 
             <fileset file="./jar/abc.jar"/> 
           </classfiles> 
           <sourcefiles> 
             <fileset dir="./code/src"/> 
           </sourcefiles> 
         </structure> 
         <!-- to produce reports in different formats. --> 
         <html destdir="${jacoco.report.dir}"/> 
       </jacoco:report> 
     </target> 

sadece ./code/src kullanmaktır. O zaman neden böyle hatalar veriyor? Herhangi bir fikir?

+0

executiondata ('$ {jacocoexec.filename}') nasıl oluşturulur? 'Jacoco: kapsama' görevini yürüten ayrı bir hedef olmalıdır. Bu hedefi de sorgulamak için koyun. Test durumunu çalıştırırken -javaagent parametresini ekleyerek –

+0

: -javaagent: JaCoCoProject/lib/jacocoagent.jar = destfile = JaCoCoProject/jacoco.exec, çıktı = dosya – anon

+1

tam oluşturma dosyasını lütfen paylaşın. Bütün bu hata diyor ki, bir kavanoza yardım ettiniz, testleri koştunuz - Bu sınıflar "./jar/abc.jar"- dan değil. Sınıfları ada göre eşleştirmek için yeterli değil. jacoco tarafından görülen "classID" ile eşleşmelidirler - bu, yeniden derlemeniz durumunda bile sınıfların farklı olduğu anlamına gelir. – Jayan

cevap

4

JaCoCo yürütme sırasında kullanılan rapor oluşturma için tam aynı sınıf dosyaları ihtiyacı var. Farklı derleyiciler ve/veya sınıfları değiştiren diğer araçlar nedeniyle, sınıflar farklı olabilir.

13

Sınıf kimliğiyle ilgili hatayı alıyorsunuz. Bu, JaCoCo docs sitesinde ayrıntılı olarak açıklanan bir kavramdır. http://www.eclemma.org/jacoco/trunk/doc/classids.html. Bu, aynı JVM'de birden fazla sınıf sürümünü (örneğin bir uygulama sunucusu) desteklemek için önemli bir adımdır. görünürlük için buraya parçayı da büyük bir bölümünü Kopyalama

.

hangi sınıf kimlikleri ve nasıl oluşturulur?

Sınıf kimlikleri heks gösterimde örneğin 0x638e104737889183 için 64-bit tam değerlerdir. Hesaplamaları JaCoCo'nun uygulama detayı olarak kabul edilir. Şu anda ids, ham sınıf dosyasının CRC64 sağlama toplamı ile oluşturulur.

Farklı sınıf kimlikleri neler olabilir?

Sınıf kimlikleri aynı sınıf dosyası sadece (bayt-bayt) için aynıdır. farklı sınıf dosyaları elde etmenin birkaç nedeni vardır. Farklı bir araç zinciri kullanırsanız İlk derleme Java kaynak dosyaları farklı sınıf dosyalarında sonuçlanacaktır:

  • Farklı derleyici satıcı (örn Eclipse vs Oracle JDK)

  • Farklı derleyici sürümleri

  • Farklı derleyici ayarları (örn ayıklama vs olmayan hata ayıklama)

Ayrıca, işlem sonrası sınıf dosyaları (gizleme, AspectJ vb.) Genellikle sınıf dosyalarını değiştirir. Analiz için olduğu kadar çalışma zamanı için de aynı sınıf dosyalarını kullanırsanız, JaCoCo iyi çalışır. Yani bu sınıf dosyaları oluşturmak için araç zinciri önemli değil.

dosya sisteminde sınıf dosyaları aynı JaCoCo çalışma zamanı ajanı tarafından görülen sınıflar zaten farklı mümkündür var olsa bile. Bu genellikle, JaCoCo aracısı veya özel sınıf yükleyicileri sınıf dosyalarını önceden işlemeden önce başka bir Java aracısı yapılandırıldığında gerçekleşir.

  • alay ediyor çerçeveler
  • Uygulama sunucuları
  • Sebat aynı sayfa olası çözümler kapsar

çerçeveler: Tipik adaylardır.

Çalışma zamanı değiştirilmiş sınıflarla baş etmek için hangi geçici çözümler var? sınıflar Kurulumunuzda zamanında değiştirilmiş alırsanız

JaCoCo neyse çalışması için bazı çözüm yolu vardır:

  • başka bir Java ajan JaCoCo ajan komut satırında ilk başta belirtilen emin olun kullanın. Bu şekilde JaCoCo aracısı orijinal sınıf dosyalarını görmelidir.
  • JaCoCo aracısının classdumpdir seçeneğini belirtin ve rapor oluşturmada dökülen sınıfları kullanın. Sadece yüklenen sınıfların döküleceğine, yani yürütülmeyen sınıfların raporunuzda kapsanmadığından görünmeyeceğini unutmayın.
  • Testlerinizi çalıştırmadan önce çevrimdışı cihazları kullanın. Bu şekilde, sınıflar herhangi bir çalışma zamanı değişikliği gerçekleşmeden önce JaCoCo tarafından çalınır. Bu durumda raporun, aletli olanlarla değil, orijinal sınıflarla oluşturulmasının gerekli olduğunu unutmayın. Çevrim Gereçleri nasıl kullanılır

    22-02-2017 tarihinde

Düzenlendi: Daniel Atallah tarafından sağlanan görevin aşağısında kullanın.

//Additional SourceSets can be added to the jacocoOfflineSourceSets as needed by 
project.ext.jacocoOfflineSourceSets = [ 'main' ] 
task doJacocoOfflineInstrumentation(dependsOn: [ classes, project.configurations.jacocoAnt ]) { 
    inputs.files classes.outputs.files 
    File outputDir = new File(project.buildDir, 'instrumentedClasses') 
    outputs.dir outputDir 
    doFirst { 
     project.delete(outputDir) 
     ant.taskdef(
      resource: 'org/jacoco/ant/antlib.xml', 
      classpath: project.configurations.jacocoAnt.asPath, 
      uri: 'jacoco' 
     ) 
     def instrumented = false 
     jacocoOfflineSourceSets.each { sourceSetName -> 
      if (file(sourceSets[sourceSetName].output.classesDir).exists()) { 
       def instrumentedClassedDir = "${outputDir}/${sourceSetName}" 
       ant.'jacoco:instrument'(destdir: instrumentedClassedDir) { 
        fileset(dir: sourceSets[sourceSetName].output.classesDir, includes: '**/*.class') 
       } 
       //Replace the classes dir in the test classpath with the instrumented one 
       sourceSets.test.runtimeClasspath -= files(sourceSets[sourceSetName].output.classesDir) 
       sourceSets.test.runtimeClasspath += files(instrumentedClassedDir) 
       instrumented = true 
      } 
     } 
     if (instrumented) { 
      //Disable class verification based on https://github.com/jayway/powermock/issues/375 
      test.jvmArgs += '-noverify' 
     } 
    } 
} 
test.dependsOn doJacocoOfflineInstrumentation 

Şimdi "gradlew test jacocoTestReport" komutunu kullanarak rapor oluşturun.

+2

Bu cevabı eklediğiniz için teşekkür ederiz. jacoco framework ve ilgili kavramları anlamada oldukça yararlıdır. – anon

+0

@Jayan: Cevabınız doğru, ancak sorunu çözmek için tam olarak ne yapmam gerektiğini anlamak çok zor. Bazı kod snippet'lerini sağlayabiliyorsanız, benim için çok daha kolay olacaktır.Okuyacak kişinin, Jacoco'nun nasıl çalıştığına dair iyi bir anlayışı olduğunu göz önünde bulundurarak cevabı yazdınız. –

+1

@Jayan: Cevabınızı düzenledim ve çevrimdışı cihazlar için kullandığım bir görevi ekledim. Gözden geçirin. –

İlgili konular