Foire aux questions

Q. Qu'est-ce qui fait qu'une ligne est partiellement couverte (indicateur jaune) ?

R. Une ligne est marquée comme partiellement couverte si tous les embranchements du code ne sont pas exécutés.

Vous trouverez ci-après quelques exemples :

  1. Gestionnaires d'exceptions :

  2. try {
    methodA() // methodA throws Exception
    } catch (Exception e) {..}

    La ligne qui appelle methodA est partiellement couverte, car il y a deux chemins : soit une exception est lancée et interceptée, soit une exception n'est pas lancée et le programme est exécuté normalement. Dans le cas où l'exception n'est pas lancée, la couverture partielle est indiquée, car l'interception n'est jamais exécutée.

  3. Code de constructeur partagé :
  4. Dans l'exemple ci-dessus, la ligne 4 est marquée comme partiellement couverte. Notez que le code d'initialisation de la variable d'instance est exécuté quel que soit le constructeur utilisé pour créer l'instance de l'objet. Le compilateur place le code d'initialisation dans les deux constructeurs. C'est pourquoi le code ci-dessus est à peu près égal à :

    Etant donné que nous n'utilisons qu'un constructeur, l'autre chemin d'exécution n'est pas exploité et la couverture partielle est signalée.

Q. Dans les rapports de couverture de code, pourquoi le total des lignes reporté pour un package n'est pas toujours égal aux totaux affichés pour les classes de ce package ?

R. Lorsque nous reportons un total de lignes dans un package, nous retirons toutes les lignes partagées par les méthodes, ce qui fait qu'elles ne sont pas comptées en double.

Q. Pourquoi les définitions de classe (par exemple la classe publique Foo {..}) sont-elles indiquées comme non couvertes (rouge) ou partiellement couvertes (jaune) ?

R. Si votre classe ne possède pas de constructeur par défaut précis, le compilateur en génère un pour vous et, comme il est implicite, il peut être associé à cette ligne de code. D'autre part, si vous avez un code d'initialisation statique (par exemple, des champs statiques), le compilateur génère des blocs d'initialisation statiques pouvant également être associés à cette ligne.

Q. Pourquoi les indicateurs de couverture de l'explorateur de packages apparaissent en rouge même si le pourcentage couvert dépasse le niveau de couverture autorisé ?

R. Lorsque plusieurs critères d'autorisation sont paramétrés (par exemple, la méthode ET le bloc), l'indicateur apparaît en rouge si l'un des critères n'est pas atteint. Les critères d'autorisation sont paramétrés en sélectionnant les propriétés de couverture de code, puis en activant les indicateurs et les pourcentages. Les indicateurs de couverture affichés sont paramétrés en sélectionnant les préférences de couverture de code, puis en activant les indicateurs (méthode, bloc, etc.). La couleur est déterminée par les critères paramétrés à l'aide de la page de propriétés et non de la page de préférences.

Q. Quelles sont les lignes non comptées dans la couverture de code ?

R. Les lignes suivantes ne sont pas comptées comme couvertes, non couvertes ou partiellement couvertes et ne sont pas utilisées pour calculer le pourcentage couvert :

Q. Qu'entendez-vous par blocs dans une couverture de bloc ?

R. Une unité exécutable commence au début de chaque bloc de base et à chaque code d'octet dont le numéro de ligne source est différent du code d'octet précédent. Un bloc de base est une zone d'instructions de code d'octet ne pouvant être modifiée par un embranchement. Lorsque la première instruction d'un bloc de base est exécutée, toutes les instructions sont exécutées, par conséquent les instructions sont considérées comme formant un seul groupe.

Les blocs de base se terminent par des instructions telles qu'une branche, un appel, une émission et un retour.

Q. Pourquoi, lorsque je procède au débogage des applications activées par couverture de code, le débogueur suit la progression de llc_probe.class au lieu d'utiliser la méthode prévue ?

R. C'est à cause de la façon dont les données de couverture de code sont collectées. Pour résoudre ce problème, vous devez utiliser les filtres d'étape :