code coverage - plugin - Testng, Emma, Cobertura, cobertura y resultado JDK 7 en ClassFormatError y VerifyError
manually install eclemma (6)
Emma funciona si no usa nuevas funciones de idioma (como try-with-resources, etc.). Puede usar Java 7 usando nuevas bibliotecas (Paths, DirectoryStream, etc.). Sé que esto no sería una solución a su problema, pero si solo quiere comprobar "cómo funciona el JDK 7", podría funcionar ...
He cambiado al JDK 7 más nuevo y tengo problemas con la ejecución de la prueba de la unidad de prueba en el código de bytes que está manipulado por la herramienta de cobertura emma. Ninguno de mis casos de prueba se ejecuta correctamente y para la mayoría de ellos recibo tales errores.
java.lang.ClassFormatError: Illegal local variable table length 10 in method measurement.meter.AbstractSerialPortMeter.<init>(Lmeasurement/meter/SerialPort;)V at measurement.meter.Elc3133aTest.setUp(Elc3133aTest.java:42)
He encontrado un artículo aquí JSR 292 Goodness Fast Code Coverage Tool Less 10k , que dice que "JSR 292 introduce una nueva instrucción bytecode invocadadinámica pero también varios tipos nuevos de constantes constantes comunes. Lo que significa que la mayoría de las herramientas que analizan bytecodes como ASM, BCEL, findbugs o EMMA necesitarán ser actualizados para ser compatibles con java 7 ".
Verificó la página de Emma, pero parece que no se ha actualizado durante mucho tiempo.
¿Alguien ha resuelto un problema similar?
También lo intenté con Cobertura. Parece funcionar un poco mejor, pero estoy recibiendo muchas excepciones de tipo VerifyError
.
java.lang.VerifyError: Expecting a stackmap frame at branch target 85 in method measurement.meter.AbstractSerialPortMeter.close()V at offset 26
at measurement.meter.AbstractSerialPortMeterTest.setUp(AbstractSerialPortMeterTest.java:27)
Estaba teniendo este problema. La actualización a 2.0.1.201112281951 usando el mercado de Eclipse funcionó para mí.
La herramienta de cobertura interna de IntelliJ IDEA 11 funciona bien para mi proyecto usando try-with-resources, pero no estamos usando invynamynamic. Creo que la herramienta de cobertura no está incluida en la edición de la comunidad, solo definitiva.
Todavía tengo que probar jacoco, es donde la mayoría de los antiguos desarrolladores de emma parecen haberse ido.
Tengo Gradle 1.0M9, Java 7 y EMMA 2.1 trabajando con los parches sugeridos aquí: usando el argumento jvm.
Detalles aquí ... http://marcellodesales.wordpress.com/2012/04/03/running-emma-code-test-coverage-with-java-7-and-gradle-1-0m9/?preview=true&preview_id=179&preview_nonce=261e892908
configurations{
emma
}
dependencies {
// EMMS Code Coverage
emma "emma:emma:2.1.5320"
emma "emma:emma_ant:2.1.5320"
...
testCompile group: ''junit'', name: ''junit'', version: ''4.9''
}
test {
// add EMMA related JVM args to our tests
jvmArgs "-XX:-UseSplitVerifier", "-Demma.coverage.out.file=$buildDir/tmp/emma/metadata.emma", "-Demma.coverage.out.merge=true"
doFirst {
println "Instrumenting the classes at " + sourceSets.main.output.classesDir.absolutePath
// define the custom EMMA ant tasks
ant.taskdef( resource:"emma_ant.properties", classpath: configurations.emma.asPath)
ant.path(id:"run.classpath") {
pathelement(location:sourceSets.main.output.classesDir.absolutePath)
}
def emmaInstDir = new File(sourceSets.main.output.classesDir.parentFile.parentFile, "tmp/emma/instr")
emmaInstDir.mkdirs()
println "Creating $emmaInstDir to instrument from " + sourceSets.main.output.classesDir.absolutePath
// instruct our compiled classes and store them at $buildDir/tmp/emma/instr
ant.emma(enabled: ''true'', verbosity:''info''){
instr(merge:"true", destdir: emmaInstDir.absolutePath, instrpathref:"run.classpath",
metadatafile: new File(emmaInstDir, ''/metadata.emma'').absolutePath) {
instrpath {
fileset(dir:sourceSets.main.output.classesDir.absolutePath, includes:"**/*.class")
}
}
}
setClasspath(files("$buildDir/tmp/emma/instr") + configurations.emma + getClasspath())
}
// The report should be generated directly after the tests are done.
// We create three types (txt, html, xml) of reports here. Running your build script now should
// result in output like that:
doLast {
def srcDir = sourceSets.main.java.srcDirs.toArray()[0]
println "Creating test coverage reports for classes " + srcDir
def emmaInstDir = new File(sourceSets.main.output.classesDir.parentFile.parentFile, "tmp/emma")
ant.emma(enabled:"true"){
new File("$buildDir/reports/emma").mkdirs()
report(sourcepath: srcDir){
fileset(dir: emmaInstDir.absolutePath){
include(name:"**/*.emma")
}
txt(outfile:"$buildDir/reports/emma/coverage.txt")
html(outfile:"$buildDir/reports/emma/coverage.html")
xml(outfile:"$buildDir/reports/emma/coverage.xml")
}
}
println "Test coverage reports available at $buildDir/reports/emma."
println "txt: $buildDir/reports/emma/coverage.txt"
println "Test $buildDir/reports/emma/coverage.html"
println "Test $buildDir/reports/emma/coverage.xml"
}
}
Ejecutar "prueba de gradle" da lo siguiente:
marcello@hawaii:/u1/development/workspaces/open-source/interviews/vmware$ gradle test
:compileJava
:processResources UP-TO-DATE
:classes
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
Instrumenting the classes at /u1/development/workspaces/open-source/interviews/vmware/build/classes/main
Creating /u1/development/workspaces/open-source/interviews/vmware/build/tmp/emma/instr to instrument from /u1/development/workspaces/open-source/interviews/vmware/build/classes/main
Creating test coverage reports for classes /u1/development/workspaces/open-source/interviews/vmware/src/main/java
Test coverage reports available at /u1/development/workspaces/open-source/interviews/vmware/build/reports/emma.
txt: /u1/development/workspaces/open-source/interviews/vmware/build/reports/emma/coverage.txt
Test /u1/development/workspaces/open-source/interviews/vmware/build/reports/emma/coverage.html
Test /u1/development/workspaces/open-source/interviews/vmware/build/reports/emma/coverage.xml
BUILD SUCCESSFUL
Tuve el mismo problema al usar el plugin maven cobertura. Todas las pruebas fallaron cuando se ejecutó desde cobertura: informe. Pero todas las pruebas tuvieron éxito cuando se ejecutaron directamente desde el plugin surefire. Como algunos de ustedes ya dijeron, el problema es que la instrumentación del código de byte de coberturas no es compatible con JDK7.
Puedes ver aquí http://vikashazrati.wordpress.com/2011/10/09/quicktip-verifyerror-with-jdk-7/ que la excepción está relacionada con el "nuevo tipo de verificador con atributos de StackMapTable" (ver: -X : + Opción JVM UseSplitVerifier en http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html ).
Así que mi solución es configurar el complemento seguro para ejecutar siempre las pruebas con JVM arg "-XX: -UseSplitVerifier. Funciona bien con y sin instrumentación de cobertura.
Mi configuración infalible en maven:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<argLine>-XX:-UseSplitVerifier</argLine>
</configuration>
</plugin>
Tuve el mismo problema. Afortunadamente, Beta funciona con JDK 7.
Actualizar enlace del sitio: http://download.eclipselab.org/eclemma/beta/2.0.0/update/
Este enlace debe usarse en Eclipse:
Help -> Install new software... -> Add...
El descanso debería ser fácil;)