Testng, Emma, ​​Cobertura, cobertura y resultado JDK 7 en ClassFormatError y VerifyError

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.(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) 

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;)

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:

  org.apache.maven.plugins maven-surefire-plugin 2.12  -XX:-UseSplitVerifier   

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 y 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 

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 …

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.

    Intereting Posts