> De: "Cédric Champeau" <[email protected]> > À: "dev" <[email protected]> > Envoyé: Vendredi 8 Septembre 2017 15:03:05 > Objet: Re: Groovy and code coverage
> Damn, who thought it was a good idea to put TIMESTAMPS in generated sources? It's a drop in replacement for javax.annotation.Generated [1] which is in a module what will be removed [2] from the modules of Java SE, so a long time ago :) Rémi [1] https://docs.oracle.com/javase/8/docs/api/javax/annotation/Generated.html [2] https://bugs.openjdk.java.net/browse/JDK-8152842 > 2017-09-08 15:00 GMT+02:00 Remi Forax < [ mailto:[email protected] | > [email protected] ] > : >> A standard annotation for generated code was added in Java 9: >> [ >> http://download.java.net/java/jdk9/docs/api/javax/annotation/processing/Generated.html >> | >> http://download.java.net/java/jdk9/docs/api/javax/annotation/processing/Generated.html >> ] >> Rémi >>> De: "Andres Almiray" < [ mailto:[email protected] | [email protected] ] > >>> À: [ mailto:[email protected] | [email protected] ] >>> Envoyé: Vendredi 8 Septembre 2017 11:41:18 >>> Objet: Groovy and code coverage >>> Hello everyone, >>> As you may be aware there are only a few choices in the Java pace that can >>> be >>> used for code coverage, JaCoCo being the one that gives the most accurate >>> results. While it's easy to setup JaCoco for Groovy sources there are times >>> where the tool reports no coverage for some lines of code that should not >>> have >>> been counted for coverage in the first case, these are some of the methods >>> coming from GroovyObject and AST transformations, specifically >>> `getProperty`, >>> `setProperty`, `getMetaClass`, and `invokeMethod`. >>> I had a chat with Marc Hoffmann yesterday about this situation, which is a >>> topic >>> we've discussed a few times in the past. I've got some good news, Groovy is >>> not >>> alone in this problem, the Lombok project has suffered the same fate which >>> has >>> prompted them to seek a solution. The alternative they came up with is to >>> have >>> Lombok identified generated code that should not be covered with a special >>> annotation (@lombok.Generated), JaCoCo has a filtering feature (not yet >>> public) >>> that can identify elements annotated with said annotation and skip them from >>> coverage reports. See >>> [ https://projectlombok.org/api/index.html?lombok/Generated.html | >>> https://projectlombok.org/api/index.html?lombok/Generated.html ] >>> [ https://github.com/jacoco/jacoco/pull/513 | >>> https://github.com/jacoco/jacoco/pull/513 ] >>> [ >>> https://github.com/jacoco/jacoco/blob/master/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java >>> | >>> https://github.com/jacoco/jacoco/blob/master/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java >>> ] >>> This feature will be available for consumption in the next releases of >>> Lombok >>> (1.16.8+) and JaCoCo (0.7.9+). >>> Given this, Marc suggested that Groovy could follow the same idea and >>> provide an >>> annotation that JaCoCo can identify, say for example >>> @groovy.transform.Generated. >>> If such annotation were to be added to Groovy we would need (at least) the >>> following steps too: >>> - update compiler to annotate `getProperty`, `setProperty`, `getMetaClass`, >>> and >>> `invokeMethod` when the class does not explicitly defines any of those >>> methods. >>> - review and update all core AST xforms that generate methods that should be >>> skipped from coverage. >>> - document the usage of this annotation and encourage AST xform developers >>> to >>> use it once they upgrade. >>> Would be great to have this feature in the 2.6.0 release if possible. >>> Thoughts? >>> ------------------------------------------- >>> Java Champion; Groovy Enthusiast >>> [ http://andresalmiray.com/ | http://andresalmiray.com ] >>> [ http://www.linkedin.com/in/aalmiray | http://www.linkedin.com/in/aalmiray >>> ] >>> -- >>> What goes up, must come down. Ask any system administrator. >>> There are 10 types of people in the world: Those who understand binary, and >>> those who don't. >>> To understand recursion, we must first understand recursion.
