Erfahren Sie, wie die Continuous Quality Platform von Parasoft dabei hilft, Testumgebungen zu steuern und zu verwalten, um zuverlässig hochwertige Software zu liefern. Für Demo registrieren >>

BLOG

Abdeckungsmetriken für Unit-Tests

Abdeckungsmetriken für Unit-Tests Lesezeit: 3 Minuten

Unabhängig von der DeckungsgranularitätEs gibt eine Reihe unterschiedlicher Deckungskriterien, die unterschiedliche Aspekte der Deckung berücksichtigen.

Der Umfang der verschiedenen Abdeckungskriterien wird anhand der in Listing 2 gezeigten Java-Methode veranschaulicht. Die Beispielmethode führt keine praktische Operation aus, ist jedoch recht einfach und sehr hilfreich, um alle in diesem Artikel beschriebenen Abdeckungskriterien darzustellen. Der Einfachheit halber verfügt die getestete Methode nur über einen einzigen Eingabeparameter. Da eine Methode mit zwei Parametern jedoch auch als Methode mit einem Parameter angesehen werden kann, der zufällig ein Paar oder ein Tupel ist, gelten die in diesem Artikel beschriebenen Konzepte ebenso gut für Methoden mit mehreren Parametern.

Aussagedeckung

Das grundlegendste Abdeckungskriterium ist die Anweisungsabdeckung (manchmal auch als „Blockabdeckung“ bezeichnet). Eine vollständige Anweisungsabdeckung wird erreicht, wenn jede Anweisung einer getesteten Methode von mindestens einem Testfall ausgeführt wird. Für die Beispielmethode aus Listing 2 reichen zwei Testfälle mit den Eingabewerten 0 und 1 aus, um eine vollständige Anweisungsabdeckung zu erreichen. Ein entsprechender JUnit-Test ist in Listing 3 dargestellt. Der Hauptteil der ersten if-Anweisung wird für beide Eingaben ausgeführt.

Die Anweisungsabdeckung berücksichtigt nicht, was passieren würde, wenn die Bedingung der ersten if-Anweisung als falsch bewertet würde. In diesem Fall würde der Hauptteil der ersten if-Anweisung nicht ausgeführt. In der Praxis ist es genauso wichtig zu überlegen, was passiert, wenn ein bestimmter Code nicht ausgeführt wird. Das Testen solcher Situationen muss über die bloße Überprüfung der Ausführung jeder Anweisung hinausgehen.

öffentliche Klasse Listing2 {public static int [] Methode (Byte-Eingabe) {boolesche Bedingung1 = (Eingabe & 1) == 0; boolesche Bedingung2 = (Eingabe & 2) == 0; int output = -1; if (Bedingung2) {Ausgabe ++; } if (Bedingung1) {return null; } else {return new int [Ausgabe]; }}}

Auflistung 2: Beispiel für eine Java-Methode zur Demonstration verschiedener Abdeckungskriterien

öffentliche Klasse Listing3 erweitert junit.framework.TestCase {public void testMethod0 () {int [] result = Listing2.method ((Byte) 0); assertNull (Ergebnis); } public void testMethod1 () {int [] result = Listing2.method ((Byte) 1); assertEquals (0, result.length); }}

Auflistung 3: Beispiel eines JUnit-Testfalls, der eine 100% ige Anweisungsabdeckung für Listing 2 bietet

Zweigstellenabdeckung

Das Abdeckungskriterium, das diese Situationen berücksichtigt, wird als Zweigabdeckung (auch als Bedingungsabdeckung oder Entscheidungsabdeckung bezeichnet) bezeichnet. Eine vollständige Verzweigungsabdeckung erfordert, dass alle möglichen Ergebnisse eines bedingten Ausdrucks von einem Testfall ausgeführt werden. Für die Beispielmethode bedeutet dies, dass eine Testeingabe erforderlich ist, bei der Bedingung2 (in der ersten if-Anweisung) als falsch ausgewertet wird und bei der der Hauptteil der ersten if-Anweisung daher übersprungen wird. Um eine 100% ige Verzweigungsabdeckung für die Beispielmethode zu erreichen, können Sie einen dritten Testfall hinzufügen, der einen Eingabewert von 2 verwendet. Der Testfall, der 0 als Eingabe verwendet, wäre in diesem Szenario redundant. Wenn die Testeingaben sorgfältig ausgewählt werden, können Sie möglicherweise eine vollständige Zweigabdeckung mit der gleichen Anzahl von Eingaben erzielen. Dies ist jedoch keine allgemeine Regel, und Sie benötigen möglicherweise mehr Testfälle, um eine Zweigabdeckung zu erreichen, als Sie für eine Anweisungsabdeckung benötigen.

Pfadabdeckung

Gewährleistet eine 100% ige Filialabdeckung, dass ein Code fehlerfrei ist? Obwohl es eine signifikante Verbesserung gegenüber der bloßen Anweisungsabdeckung darstellt, bietet die vollständige Zweigabdeckung immer noch keine Garantie dafür, dass sich ein Code immer korrekt verhält.

Die Beispielmethode in Listing 2 kann unter bestimmten Umständen tatsächlich eine NegativeArraySizeException auslösen. Dieses Problem tritt bei allen Eingaben auf, bei denen der Hauptteil der ersten if-Anweisung übersprungen wird, da Bedingung2 als falsch und gleichzeitig Bedingung1 als falsch ausgewertet wird. In diesen Fällen versucht der Code, ein Array der Größe -1 zuzuweisen. Die Zweigabdeckung deckt beide Alternativen der zweiten if-Anweisung ab, garantiert jedoch nicht, dass der else-Zweig der Anweisung in Kombination mit dem Hauptteil der ersten if-Anweisung, die übersprungen wird, abgedeckt ist.

Um solche Situationen abzudecken, müssen wir Kombinationen von Zweigen betrachten, die auch als Codepfade bezeichnet werden. Dieses Abdeckungskriterium wird als Pfadabdeckung bezeichnet. Die Pfadabdeckung erfordert nicht nur, dass jeder mögliche Zweig mindestens einmal ausgeführt wird, sondern auch, dass jede mögliche Kombination von Zweigen mindestens einmal ausgeführt wird.


Abbildung 1: UML-Aktivitätsdiagramm mit möglichen Codepfaden durch die Beispielmethode

Abbildung 1 zeigt den Kontrollfluss der Beispielmethode aus Listing 2 als UML-Aktivitätsdiagramme. In jedem Diagramm wird ein anderer Codepfad fett rot hervorgehoben. Die Beispielmethode verfügt über insgesamt vier verschiedene Codepfade. Um eine 100% ige Pfadabdeckung zu erreichen, benötigen Sie mindestens vier verschiedene Testfälle (z. B. unter Verwendung der Eingabewerte 0, 1, 2 und 3).

Geschrieben von

Parasoft

Die branchenführenden automatisierten Softwaretest-Tools von Parasoft unterstützen den gesamten Softwareentwicklungsprozess, vom Schreiben der ersten Codezeile über Unit- und Funktionstests bis hin zu Leistungs- und Sicherheitstests, wobei simulierte Testumgebungen genutzt werden.

Erhalten Sie die neuesten Nachrichten und Ressourcen zum Testen von Software sofort.