¿Cómo agregaría una anotación para excluir un método de un informe de cobertura de código jacoco?

6 minutos de lectura

Avatar de usuario de Don Rhummy
don rhummy

Tengo un código en Java que quiero excluir de la cobertura de código. ¿Cómo haría esto? Quiero poder agregar una anotación. ¿Hay alguna manera de configurar o extender jacoco (como se usa en gradle) para usar esto?

Ejemplo:

public class Something
{
    @ExcludeFromCodeCoverage
    public void someMethod() {}
}

Como no hay respuestas directas a esto, investigué un poco y encontré este PR.

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")
  }

Puede crear cualquier anotación cuyo nombre contenga “Generado”. Creé lo siguiente en mi base de código para excluir métodos de la inclusión en el informe de Jacoco.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExcludeFromJacocoGeneratedReport {}

Use esta anotación en sus métodos para eximirlo de la cobertura como se muestra a continuación.

public class Something
{
    @ExcludeFromJacocoGeneratedReport
    public void someMethod() {}
}

  • ¿Has probado esto y has confirmado que funciona?

    – Don Rhamy

    3 abr 2021 a las 19:29

  • Sí @DonRhummy. Pude ver que los métodos anotados con esto se omiten en el análisis de Sonarcloud

    – Mohamed Anees A

    4 de abril de 2021 a las 5:30

  • ¿Se requiere este escáner de sonda específico, ya que puedo ver que no funciona para mí, pero la función se muestra como descubierta en el informe?

    – Muhammad Younas

    6 de abril de 2021 a las 12:57

  • Tal vez deberías actualizar la versión del complemento Jacoco

    – Mohamed Anees A

    6 de abril de 2021 a las 13:05

  • @MohamedAneesA Encuentro la solución alternativa: la cobertura del código Intellij (un contenedor para jacoco) no funciona. pero ejecuta el crudo Jacobo está bien.

    – ch271828n

    7 de mayo de 2021 a las 3:53

La nueva función se agregó en la versión 0.8.2 de JaCoCo, que filtra las clases y los métodos anotados con @Generated. Para obtener más información, consulte la siguiente documentación:

Las clases y métodos anotados con anotación cuya política de retención es tiempo de ejecución o clase y cuyo nombre simple es Generado se filtran durante la generación del informe (GitHub #731).

Notas de la versión de JaCoCo 0.8.2

  • Esto incluye las anotaciones que defina en sus propias aplicaciones que se denominan Generated.

    – estuporman

    12 de diciembre de 2019 a las 17:52

Tengo un código en Java que quiero excluir de la cobertura de código. ¿Cómo haría esto? Quiero poder agregar una anotación. ¿Hay alguna manera de configurar o extender jacoco (como se usa en gradle) para usar esto?

A partir de hoy, no existe tal característica en la última versión lanzada de JaCoCo (0.7.9). Solo se pueden excluir clases enteras.

En la página https://github.com/jacoco/jacoco/wiki/FilteringOptions#annotation-based-filtering (que está dedicado a los desarrolladores) esto se registra como una idea para futuras versiones.

La documentación oficial de JaCoCo contiene información sobre cómo obtener la última compilación inédita, así como una lista de cambios inéditos para la próxima versión – http://www.jacoco.org/jacoco/trunk/doc/changes.html que incluye varios filtros, entre los que se encuentran el filtrado de métodos generados por Lombok y Groovy y marcados con anotaciones lombok.Generated y groovy.transform.Generated respectivamente. Potencialmente, puede abusar de esto, pero no recomendaría hacerlo por muchas razones.

  • +1, pero… ¿cuál sería un uso legítimo para tal anotación? No puedo encontrar ningún ejemplo de este tipo en ninguna parte, y tengo la sensación de que esta característica en una herramienta de cobertura solo se usaría mal y se abusaría de ella. Si existe un método en el código fuente y no está vacío, entonces creo que debería tenerse en cuenta en el análisis de cobertura, incluso si el código fuente fue generado por alguna herramienta. Después de todo, el método supuestamente daría alguno contribución a la funcionalidad de la aplicación/sistema, ¿verdad? Si es así, ¿por qué no probarlo?

    – Rogerio

    07/01/2018 a las 18:50


  • @Rogério – constructores privados en clases auxiliares “estáticas” – No creo que usar la reflexión para forzar la ejecución del constructor sea el enfoque correcto …

    – CptBarman

    30 de enero de 2018 a las 15:51

  • @CptBartender Por supuesto, llamar al constructor privado a través de Reflection no es la solución … La solución adecuada es que la herramienta de cobertura de código los filtre automáticamente; JaCoCo ya lo está haciendo para un constructor vacío privado.

    – Rogerio

    30 de enero de 2018 a las 16:03

  • @Rogério Me gustaría no cubrir los métodos main() que se usan para las pruebas de preguntas y respuestas o ejemplos de cómo usar la clase. Eso parece ingenuamente un caso de uso legítimo.

    – elhefe

    3 de mayo de 2018 a las 2:03


  • ¿La última versión de JaCoCo es compatible con esta función?

    – Manju

    13 de noviembre de 2019 a las 11:26

Avatar de usuario de Markus Schulte
Markus Schulte

Dr.

Usar anotación @lombok.Generated de Lombok.

Explicación

Jacoco se integra con Lombok. El código generado por Lombok está excluido de la cobertura de Jacoco por defecto (ver Versión 0.8.0 en el registro de cambios de Jacoco). puedes hacer un mal uso lombok.Generated a su manera para que sea excluido del informe de cobertura.

Puedes configurar lombok.addLombokGeneratedAnnotation = true dentro lombok.config en la raíz del proyecto. Después de eso, Jacoco ignorará todo el código generado por Lombok.

Ver más en la documentación del Proyecto Lombok: https://projectlombok.org/features/configuration

  • Lombok usa clases no oficiales y no documentadas que no se garantiza que estén en cada tiempo de ejecución de Java. (Y que se recomienda encarecidamente no utilizar)

    – Don Rhamy

    15 de junio de 2020 a las 13:57

  • @DonRhummy No sé si entiendo correctamente su comentario, Lombok, es una dependencia/complemento del tiempo de compilación y las aplicaciones se enviarán con un código compilado que no debe incluir nada relacionado con lombok. Por favor, avíseme si me estoy perdiendo algo.

    – Andrés

    18 de abril de 2021 a las 3:20

Avatar de usuario de Silas Pedrosa
Silas Pedrosa

Siguiendo el enfoque de @mohamed-anees-a, llegué a esta versión de kotlin:

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
annotation class ExcludeFromJacocoGeneratedReport

  • Lombok usa clases no oficiales y no documentadas que no se garantiza que estén en cada tiempo de ejecución de Java. (Y que se recomienda encarecidamente no utilizar)

    – Don Rhamy

    15 de junio de 2020 a las 13:57

  • @DonRhummy No sé si entiendo correctamente su comentario, Lombok, es una dependencia/complemento del tiempo de compilación y las aplicaciones se enviarán con un código compilado que no debe incluir nada relacionado con lombok. Por favor, avíseme si me estoy perdiendo algo.

    – Andrés

    18 de abril de 2021 a las 3:20

¿Ha sido útil esta solución?