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.
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 –
: -javaagent: JaCoCoProject/lib/jacocoagent.jar = destfile = JaCoCoProject/jacoco.exec, çıktı = dosya – anon
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