Häufig gestellte Fragen

Frage: Was führt dazu, dass eine Zeile teilweise abgedeckt wird (= gelber Anzeiger)?

Antwort: Eine Zeile wird dann als teilweise abgedeckt gekennzeichnet, wenn nicht alle Verzweigungen im Code ausgeführt werden.

Hierzu ein paar Beispiele:

  1. Ausnahmebehandlungsroutinen

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

    Die Zeile, die methodA aufruft, ist teilweise abgedeckt, weil es zwei Pfade gibt: Entweder wird eine Ausnahmebedingung ausgelöst und abgefangen oder es wird keine Ausnahmebedingung ausgelöst und das Programm normal ausgeführt. Falls keine Ausnahmebedingung ausgelöst wird, gilt die Zeile als teilweise abgedeckt, weil die Abfangoperation nicht ausgeführt wird.

  3. Gemeinsam genutzter Konstruktorcode:
  4. Im obigen Beispiel ist Zeile 4 als teilweise abgedeckt gekennzeichnet. Der Code für die Initialisierung der Instanzvariablen wird unabhängig davon ausgeführt, mit welchem Konstruktor die Objektinstanz erstellt wird. Der Compiler stellt den Initialisierungscode in beide Konstruktoren. Der obige Code ist daher ungefähr äquivalent zu:

    Da lediglich ein einziger Konstruktor verwendet wird, wird der andere Ausführungspfad nicht ausgeführt und eine teilweise Abdeckung angegeben.

Frage: Warum ist in den Codeabdeckungsberichten die für ein Paket gemeldete Summe der Zeilen nicht immer mit den Summen für die Klassen in diesem Paket identisch?

Antwort: Wenn die Summe der Zeilen in einem Paket gemeldet wird, werden alle Zeilen ausgeklammert, die von Methoden gemeinsam genutzt werden, damit sie nicht doppelt gezählt werden.

Frage: Warum werden Klassendefinitionen (z. B. 'public class Foo {..}') als nicht abgedeckt (rot) oder teilweise abgedeckt (gelb) gekennzeichnet?

Antwort: Falls die Klasse keinen expliziten Standardkonstruktor besitzt, generiert der Compiler automatisch einen Konstruktor. Da dieser Konstruktor implizit ist, kann er der entsprechenden Codezeile zugeordnet sein. Außerdem generiert der Compiler bei einem statischen Initialisierungscode (z. B. statischen Feldern) statische Initialisierungsblöcke, die ebenfalls dieser Zeile zugeordnet sein können.

Frage: Warum werden die Abdeckungsanzeiger im Paketexplorer auch dann in Rot angezeigt, wenn der abgedeckte Prozentsatz die zulässige Abdeckungsstufe überschreitet?

Antwort: Wenn mehrere Abnahmekriterien festgelegt sind (z. B. Methode UND Block), wird der Anzeiger in Rot angezeigt, falls eines der Kriterien nicht erfüllt ist. Abnahmekriterien werden durch die Auswahl der Eigenschaften für die Codeabdeckung und die Aktivierung von Anzeigern und Prozentsätzen festgelegt. Das Anzeigen von Abdeckungsanzeigern wird durch die Auswahl der Benutzervorgaben für die Codeabdeckung und die anschließende Aktivierung der Anzeiger (Methode, Block usw.) festgelegt. Die Farbe wird anhand der Kriterien bestimmt, die auf der Eigenschaftenseite (nicht auf der Benutzervorgabenseite) festgelegt wurden.

Frage: Welche Zeilen werden bei der Codeabdeckung nicht gezählt?

Antwort: Die folgenden Zeilen werden nicht als abgedeckt, teilweise abgedeckt oder nicht abgedeckt gezählt und nicht zur Berechnung des abgedeckten Prozentsatzes verwendet:

Frage: Was bedeutet 'Nach Blöcken' bei der Blockabdeckung?

Antwort: Eine ausführbare Einheit beginnt am Anfang jedes Basisblocks und bei jedem Byte-Code, dessen Quellenzeilennummer von der des vorherigen Byte-Codes abweicht. Ein Basisblock ist eine Gruppe von Byte-Code-Anweisungen, die nicht Ausgangs- oder Zielpunkt von Verzweigungen sein können. Wenn die erste Anweisung in einem Basisblock ausgeführt wird, werden alle Anweisungen ausgeführt, die Anweisungen somit als zusammenhängende Gruppe betrachtet.

Basisblöcke enden mit Anweisungen wie 'branch', 'call', 'throw' und 'return'.

Frage: Warum führt der Debugger beim Debug von Anwendungen, die für die Codeabdeckung aktiviert wurden, eine Step-Into-Aktion in 'llc_probe.class' und nicht in die erwartete Methode aus?

Antwort: Dies liegt an dem Verfahren, mit dem die Codeabdeckungsdaten erfasst werden. Zur Umgehung müssen Sie die Step-Filter verwenden: