Testng, Emma, ​​Cobertura, la couverture et JDK 7 donnent ClassFormatError et VerifyError

Je suis passé à la version la plus récente du JDK 7 et j’ai des problèmes avec l’exécution du test d’unité de test sur le code d’octet qui est truqué par l’outil de couverture emma. Aucun de mes cas de test n’est exécuté correctement et pour la plupart d’entre eux, je reçois de telles erreurs.

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) 

J’ai trouvé un article ici JSR 292 Good Code Fast Cover Cover Tool 10k , qui dit que “JSR 292 introduit une nouvelle instruction de bytecode invoquée dynamicment mais aussi plusieurs nouveaux constantes de pool constant. Ce qui signifie que la plupart des outils d’parsing de bytecodes comme ASM, BCEL, findbugs ou EMMA devront être mis à jour pour être compatibles avec Java 7. ”

Vérifié Emma page d’accueil, mais il semble qu’il n’a pas été mis à jour depuis longtemps.

Quelqu’un a-t-il résolu un problème similaire?

J’ai aussi essayé avec Cobertura. Cela semble fonctionner un peu mieux, mais je reçois beaucoup d’exceptions de type 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) 

J’ai eu le même problème. Heureusement, la version bêta fonctionne avec JDK 7.
Lien de mise à jour du site: http://download.eclipselab.org/eclemma/beta/2.0.0/update/
Ce lien doit être utilisé dans Eclipse:

 Help -> Install new software... -> Add... 

Le repos devrait être facile;)

J’ai eu le même problème en utilisant le plugin maven cobertura. Tous les tests ont échoué lors de l’exécution de cobertura: report. Mais tous les tests ont réussi lorsqu’ils sont exécutés directement à partir du plugin surefire. Comme certains d’entre vous l’ont déjà dit, le problème est que l’instrumentation à code octet de coberture n’est pas compatible avec JDK7.

Vous pouvez voir ici http://vikashazrati.wordpress.com/2011/10/09/quicktip-verifyerror-with-jdk-7/ que l’exception est liée au “nouveau vérificateur de type avec les atsortingbuts StackMapTable” (voir: -X : + Option JVM UseSplitVerifier dans http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html ).

Donc, ma solution consiste à configurer surefire-plugin pour toujours exécuter les tests avec JVM arg “-XX: -UseSplitVerifier. Il fonctionne bien avec et sans instrumentation cobertura.

Ma configuration infaillible dans maven:

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

Gradle 1.0M9, Java 7 et EMMA 2.1 fonctionnent avec les patchs proposés ici: en utilisant l’argument jvm.

Détails ici … 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" ... testComstack 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 comstackd 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" } } 

Exécuter “test de graduation” donne les informations suivantes:

 marcello@hawaii:/u1/development/workspaces/open-source/interviews/vmware$ gradle test :comstackJava :processResources UP-TO-DATE :classes :comstackTestJava :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 fonctionne si vous n’utilisez pas de nouvelles fonctionnalités de langue (comme essayer avec les ressources, etc.). Vous pouvez utiliser Java 7 en utilisant de nouvelles bibliothèques (Paths, DirectoryStream, etc.). Je sais que ce ne serait pas une solution à votre problème, mais si vous voulez seulement vérifier “comment fonctionne JDK 7”, cela peut fonctionner …

J’avais ce problème. La mise à niveau vers 2.0.1.201112281951 en utilisant le marché Eclipse a fonctionné pour moi.

L’outil de couverture interne d’IntelliJ IDEA 11 fonctionne très bien pour mon projet en utilisant un opérateur diamant, mais nous n’utilisons pas invokedynamic. Je pense que l’outil de couverture n’est pas inclus dans l’édition communautaire, ultime seulement.

Je n’ai pas encore essayé le jacoco – c’est là que la plupart des anciens développeurs d’Emma semblent être partis.