28 votes

Couverture Emma sur les types Enum

Je suis en cours d'exécution EclEmma, le Emma plugin pour Eclipse, et le rapport de couverture de montre seulement une couverture partielle pour un Enum j'ai défini, même si elle montre la seule valeur de l'Enum comme étant couverts. Je suis en supposant qu'il existe une lacune de couverture pour l'implicite des méthodes que l'Enum, mais je ne suis pas tout à fait sûr.

Par exemple, avec cette Enum, EclEmma souligne tout en vert, à l'exception de la déclaration du package:

package com.blah;

public enum UserRole {
 HAS_ACCESS
}

Si je tire la couverture de détails pour la classe, je vois ceci:

alt text

Ma question est, quelle est la meilleure façon d'obtenir une couverture de 100% sur mon énumérer les classes à l'aide de EclEmma?

31voto

deterb Points 2317

Ce que vous voyez est un bytecode caché généré en raison d'une énumération.

Pour vous débarrasser de ce problème, ajoutez un appel aux méthodes values () et valueOf () dans l'énumération, comme mentionné précédemment par Carl Manaster et Peter Lawrey.

6voto

Darren Points 41

Je suis d'accord avec d'autres affiches que 100% de couverture de code peut être erronée. Mais je dois admettre que pour la satisfaction d'avoir 100% de couverture sur le nouveau code de base.

Heureusement, depuis tous les énumérations étendre la même "classe", vous pouvez atteindre votre 100% avec un peu d'aide de votre ami réflexion.

Il suffit d'ajouter le suivant méthode statique dans une classe pour vos testeurs d'appel, à l'aide de [EnumTypeName].la classe en tant que paramètre.

  public static void superficialEnumCodeCoverage(Class<? extends Enum<?>> enumClass) {
    try {
      for (Object o : (Object[])enumClass.getMethod("values").invoke(null)) {
        enumClass.getMethod("valueOf", String.class).invoke(null, o.toString());
      }
    }
    catch (Throwable e) {
      throw new RuntimeException(e);
    }
  }

En supposant que cette fonction statique a été mis en œuvre dans une classe appelée "Partager", vous n'aurez qu'à inclure cette ligne pour chaque enum:

Shared.superficialEnumCodeCoverage(UserRole.class);

Le mot clé est "superficiel".

3voto

Pangea Points 36713

Mes 2 cents comme j'y étais déjà allé et j'ai vu mes développeurs tomber dans ce piège. Se sent comme si vous êtes plus passionné (que souhaité) pour atteindre la couverture de code à 100%. C'est juste une perte de temps. Les rapports sur les outils de couverture doivent simplement être utilisés pour identifier les opportunités d'amélioration du code (ou réduire le service technique) et ne doivent pas être considérés comme des correctifs indispensables.

2voto

Dan Points 1582

Nous avons rencontré un problème similaire dans lequel le compilateur générait des méthodes sur les énumérations, comme values (), n'étaient généralement pas appelées dans notre code de test. Nous avons contourné le problème en filtrant le nombre de nos objets enum de notre rapport final.

C'est pourquoi je n'aime pas utiliser la couverture de code comme mesure d'exhaustivité. Quand je pense à une meilleure métrique, je vous le ferai savoir. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X