Wie würde ich eine Anmerkung hinzufügen, um eine Methode aus einem JACOCO-Codeabdeckungsbericht auszuschließen?

Lesezeit: 5 Minuten

Benutzer-Avatar
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.

https://github.com/jacoco/jacoco/pull/822/files

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

Versionshinweise zu JaCoCo 0.8.2

  • 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.

Auf Seite https://github.com/jacoco/jacoco/wiki/FilteringOptions#annotation-based-filtering (das für Entwickler bestimmt ist) wird dies als Idee für zukünftige Versionen aufgezeichnet.

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?

    – Manju

    13. November 2019 um 11:26 Uhr

Benutzer-Avatar
Markus Schulte

Tl; dr

Anmerkung verwenden @lombok.Generated aus Lombok.

Erläuterung

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.

Weitere Informationen finden Sie in der Dokumentation zum Projekt Lombok: https://projectlombok.org/features/configuration

  • 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

Benutzer-Avatar
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

1381590cookie-checkWie würde ich eine Anmerkung hinzufügen, um eine Methode aus einem JACOCO-Codeabdeckungsbericht auszuschließen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy