Wie würde ich eine Anmerkung hinzufügen, um eine Methode aus einem JACOCO-Codeabdeckungsbericht auszuschließen?
Lesezeit: 5 Minuten
Don Rhummy
Ich habe Code in Java, den ich von der Codeabdeckung ausschließen möchte. Wie würde ich das tun? Ich möchte eine Anmerkung hinzufügen können. Gibt es eine Möglichkeit, jacoco (wie in Gradle verwendet) zu konfigurieren oder zu erweitern, um dies zu verwenden?
Beispiel:
public class Something
{
@ExcludeFromCodeCoverage
public void someMethod() {}
}
Da es darauf keine direkten Antworten gibt, habe ich ein bisschen recherchiert und bin auf diese PR gestoßen.
private static boolean matches(final String annotation) {
final String name = annotation
.substring(Math.max(annotation.lastIndexOf("https://stackoverflow.com/"),
annotation.lastIndexOf('$')) + 1);
return name.contains("Generated")
}
Sie können eine beliebige Anmerkung erstellen, deren Name „Generiert“ enthält. Ich habe Folgendes in meiner Codebasis erstellt, um Methoden von der Aufnahme in den Jacoco-Bericht auszuschließen.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExcludeFromJacocoGeneratedReport {}
Verwenden Sie diese Anmerkung in Ihren Methoden, um sie wie unten beschrieben von der Abdeckung auszunehmen.
public class Something
{
@ExcludeFromJacocoGeneratedReport
public void someMethod() {}
}
Haben Sie dies ausprobiert und bestätigt, dass es funktioniert?
– Don Rhummy
3. April 2021 um 19:29 Uhr
Ja @DonRhummy . Ich konnte sehen, dass die mit this annotierten Methoden in der Sonarcloud-Analyse übersprungen werden
– Mohamed Anees A
4. April 2021 um 5:30 Uhr
Ist dies ein bestimmter Sonarscanner erforderlich, wie ich sehe, funktioniert er bei mir nicht, trotzdem wird die Funktion im Bericht als Aufdecken angezeigt
– Muhammad Younas
6. April 2021 um 12:57 Uhr
Vielleicht sollten Sie die Jacoco-Plugin-Version aktualisieren
– Mohamed Anees A
6. April 2021 um 13:05 Uhr
@MohamedAneesA Ich finde die Problemumgehung: Die Intellij-Codeabdeckung (ein Wrapper für jacoco) funktioniert nicht. aber laufen die roh jacoco ist ok.
– ch271828n
7. Mai 2021 um 3:53 Uhr
Die neue Funktion wurde in der Version 0.8.2 von JaCoCo hinzugefügt, die die mit @Generated annotierten Klassen und Methoden herausfiltert. Einzelheiten entnehmen Sie bitte der folgenden Dokumentation:
Mit Anmerkung versehene Klassen und Methoden, deren Aufbewahrungsrichtlinie runtime oder class ist und deren einfacher Name Generated ist, werden während der Generierung des Berichts herausgefiltert (GitHub #731).
Dazu gehören Anmerkungen, die Sie in Ihren eigenen Anwendungen definieren, die aufgerufen werden Generated.
– Stupormann
12. Dezember 2019 um 17:52 Uhr
Ich habe Code in Java, den ich von der Codeabdeckung ausschließen möchte. Wie würde ich das tun? Ich möchte eine Anmerkung hinzufügen können. Gibt es eine Möglichkeit, jacoco (wie in Gradle verwendet) zu konfigurieren oder zu erweitern, um dies zu verwenden?
Bis heute gibt es keine solche Funktion in der neuesten veröffentlichten Version von JaCoCo (0.7.9). Es können nur ganze Klassen ausgeschlossen werden.
Die offizielle JaCoCo-Dokumentation enthält Informationen darüber, wie Sie den neuesten unveröffentlichten Build erhalten, sowie eine Liste von unveröffentlichte Änderungen für die nächste Version – http://www.jacoco.org/jacoco/trunk/doc/changes.html das verschiedene Filter enthält, darunter das Filtern von Methoden, die von Lombok und Groovy generiert und durch Annotationen gekennzeichnet sind lombok.Generated und groovy.transform.Generated beziehungsweise. Möglicherweise können Sie dies missbrauchen, aber ich würde dies aus vielen verschiedenen Gründen nicht empfehlen.
+1, aber … was wäre eine legitime Verwendung für eine solche Anmerkung? Ich kann nirgendwo ein solches Beispiel finden, und ich habe das Gefühl, dass diese Funktion in einem Coverage-Tool nur missbraucht und missbraucht werden würde. Wenn eine Methode im Quellcode existiert und nicht leer ist, dann denke ich es sollte bei der Abdeckungsanalyse berücksichtigt werden, auch wenn der Quellcode von einem Tool generiert wurde. Immerhin würde die Methode angeblich nachgeben etwas Beitrag zur App/Systemfunktionalität, richtig? Wenn ja, warum nicht testen?
– Rogerio
7. Januar 2018 um 18:50 Uhr
@Rogério – private Konstruktoren in “statischen” Hilfsklassen – Ich denke nicht, dass die Verwendung von Reflektion, um die Ausführung des Konstruktors zu erzwingen, der richtige Ansatz ist …
– CptBarkeeper
30. Januar 2018 um 15:51 Uhr
@CptBartender Natürlich ist das Aufrufen des privaten Konstruktors über Reflection nicht die Lösung … Die richtige Lösung besteht darin, dass das Codeabdeckungstool sie automatisch herausfiltert. JaCoCo tut dies bereits für einen privaten leeren Konstruktor.
– Rogerio
30. Januar 2018 um 16:03 Uhr
@Rogério Ich möchte main () -Methoden, die für Q & D-Tests verwendet werden, oder Beispiele für die Verwendung der Klasse nicht behandeln. Das scheint naiv wie ein legitimer Anwendungsfall zu sein.
– elfe
3. Mai 2018 um 2:03 Uhr
Unterstützt die neueste Version von JaCoCo diese Funktion?
Jacoco integriert sich mit Lombok. Von Lombok generierter Code ist standardmäßig von der Abdeckung durch Jacoco ausgeschlossen (siehe Release 0.8.0 im Jacoco-Änderungsprotokoll). Sie können missbrauchen lombok.Generated nach Ihrer Methode, damit es aus dem Deckungsbericht ausgeschlossen wird.
Sie können einstellen lombok.addLombokGeneratedAnnotation = true hinein lombok.config im Stammverzeichnis des Projekts. Danach wird der gesamte von Lombok generierte Code von Jacoco ignoriert.
Lombok verwendet undokumentierte, inoffizielle Klassen, die nicht garantiert in jeder Java-Laufzeit enthalten sind. (Und das wird dringend empfohlen, nicht verwendet zu werden)
– Don Rhummy
15. Juni 2020 um 13:57 Uhr
@DonRhummy Ich weiß nicht, ob ich Ihren Kommentar richtig verstehe, Lombok, ist eine Kompilierzeitabhängigkeit/ein Plugin und Anwendungen werden mit kompiliertem Code ausgeliefert, der nichts mit Lombok zu tun haben sollte. Bitte lassen Sie mich wissen, wenn ich etwas vermisse.
– Andreas
18. April 2021 um 3:20 Uhr
Silas Pedrosa
Nach dem @mohamed-anees-a-Ansatz bin ich zu dieser Kotlin-Version gekommen:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
annotation class ExcludeFromJacocoGeneratedReport
Lombok verwendet undokumentierte, inoffizielle Klassen, die nicht garantiert in jeder Java-Laufzeit enthalten sind. (Und das wird dringend empfohlen, nicht verwendet zu werden)
– Don Rhummy
15. Juni 2020 um 13:57 Uhr
@DonRhummy Ich weiß nicht, ob ich Ihren Kommentar richtig verstehe, Lombok, ist eine Kompilierzeitabhängigkeit/ein Plugin und Anwendungen werden mit kompiliertem Code ausgeliefert, der nichts mit Lombok zu tun haben sollte. Bitte lassen Sie mich wissen, wenn ich etwas vermisse.
– Andreas
18. April 2021 um 3:20 Uhr
13815900cookie-checkWie würde ich eine Anmerkung hinzufügen, um eine Methode aus einem JACOCO-Codeabdeckungsbericht auszuschließen?yes