Gemeinsam zum Erfolg

Statische Codeanalyse und dynamische Tests

6. Dezember 2021, 9:10 Uhr | Royd Lüdtke

Fortsetzung des Artikels von Teil 1

Kombination von statischer Codeanalyse und dynamischem Testen

Um eine gute Softwarequalität zu gewährleisten, ist eine Kombination von statischer Analyse und dynamischen Tests in Verbindung mit einer Messung der Testabdeckung erforderlich. Im folgenden Praxisbeispiel wird deutlich, warum beide Verfahren zur Absicherung der Softwarequalität genutzt werden müssen und warum die Konzentration auf nur eine Test- oder Analyseform gefährliche Konsequenzen haben kann.

Für die Steuereinheit einer Waschmaschinen-Produktreihe wurde eine Software in der Programmiersprache C für einen Mikrocontroller mit ARM-Prozessorkern geschrieben. Für alle Waschmaschinen der Produktreihe wurde eine identische Steuereinheit mit identischer Software genutzt, wobei je nach Maschinentyp bestimme Funktionen ein- bzw. abgeschaltet wurden. Die Maschinen der etwas höheren Preisklasse sollten z. B. mit einem Sensor ausgestattet werden, um den Verschmutzungsgrad der Wäsche zu messen und dem Programm so zu ermöglichen, die notwendigen Zeiten des Hauptwaschgangs automatisch und bedarfsgerecht anzupassen. Die Waschzeiten der einfacheren Maschinen ohne Sensor sollten dagegen konstant sein.

Anbieter zum Thema

zu Matchmaker+
Waschmaschinen-Software zur Berechnung der Waschdauer
Listing 1. Beispiel Waschmaschinen-Software: Funktion zur Berechnung der Waschdauer des Hauptwaschgangs.
© Verifysoft Technology

Zur Sicherstellung einer hinreichenden Softwarequalität wurden Testfälle unter der Vorgabe einer MC/DC-Test­abdeckung von 100 % erstellt. Auf eine statische Analyse wurde zunächst verzichtet.

Die Waschdauer des Hauptwaschgangs wurde mit dem Code in Listing 1 berechnet. Die Funktion errechnet die Waschdauer in Abhängigkeit vom gewählten Waschprogramm, der Beladungsmenge und dem Verschmutzungsgrad der Wäsche.

Testfall Nr.

Nr.

product_ version

prog

load

staining

Ergebnis

erw. Ergebnis

1 11 3 4 3 15 15
2 11 5 4 3 15 15
3 11 7 4 3 15 15
4 11 3 6 3 27 27
5 12 4 2 1 8 7
6 12 6 2 1 8 7
7 13 4 4 1 8 8
8 13 6 4 1 8 8

 

Bezogen auf diese Funktion wurden während der Modultests die in der Tabelle 1 aufgeführten Testfälle ausgeführt, wobei der Verschmutzungsgrad »staining« in das Testergebnis als Faktor einfließt. Inwieweit der Maschinentyp »product_version« das Ergebnis beeinflusst, wird später erläutert.

Messung der Testabdeckung
Bild 1. Messung der Testabdeckung (MC/DC) mit dem Code Coverage Analyser Testwell CTC++.
© Verifysoft Technology

Das Ergebnis der Messung der Testabdeckung zeigt Bild 1. Die Testabdeckung der betrachteten Funktion lag zunächst nur bei 71 %. Aus dem Report der Testabdeckung in Verbindung mit den Test­ergebnissen wurde sofort ein Problem sichtbar: Der Programmpfad mit der if-Bedingung mit Beginn in Zeile 31 (siehe Bild 1) – in Listing 2 isoliert dargestellt – wurde nicht durchlaufen, obwohl die entsprechenden Testfälle (Nr. 5 und 6) ausgeführt wurden.

Die im Test als problematisch erkannte Programmzeile.
Listing 2. Die im Test als problematisch erkannte Programmzeile in der Funktion zur Berechnung der Waschdauer des Hauptwaschgangs.
© Verifysoft Technology

Das Testergebnis für diese Testfälle wich zudem von den erwarteten Ergebnissen ab. Aus dem Testabdeckungsbericht wird deutlich, dass stattdessen die if-Bedingung ab Zeile 28 durchlaufen wurde.

Ein Tausch der beiden else-if-Bedingungen im Code behob diesen Fehler. Ein erneuter Testlauf ergab nunmehr eine Testabdeckung von 95 %, wobei die Testergebnisse den Erwartungen entsprachen.

Aus dem Report der Testabdeckung war ersichtlich, dass für eine Testabdeckung von 100 % noch ein zusätzlicher Testfall benötigt wird (Tabelle 2).

Testfall Nr.

Nr.

product_ version

prog

load

staining

Ergebnis

erw. Ergebnis

9 14 6 6 1 9 9

 

Ein Test unter Berücksichtigung des zuvor fehlenden 9. Testfalls ergab dann die geforderte Testabdeckung von 100 %.

Nach dem erfolgreichen Abschluss der Integrationstests gingen die Waschmaschinen schließlich in Produktion. Einige Zeit nach der Auslieferung kam es jedoch zu Reklamationen: bei einigen Maschinen war das Waschergebnis unzureichend, da der Hauptwaschgang bereits nach kurzer Zeit beendet war.

Code zur Ermittung des Verschmutzungsgrads.
Listing 3. Ermittlung des Verschmutzungsgrads in Abhängigkeit vom Typ der Wachmaschine (product_version).
© Verifysoft Technology

Es wurden auch Fälle berichtet, bei denen die Maschinen die Hauptwäsche auf mehrere Stunden ausgedehnt hatten. Zuverlässig nachstellen ließ sich das Verhalten nicht. Die Reklamationen waren allerdings auf einen bestimmten Maschinentyp der Produktreihe beschränkt, sodass die Möglichkeit eines Softwarefehlers in Betracht gezogen und eine statische Codeanalyse durchgeführt wurde.

Bei der statischen Codeanalyse fiel auf, dass die Vorgabe, bei allen Maschinentypen ab dem Modell Nr. 12 den Verschmutzungssensor abzufragen und alle Modelle darunter mit einem konstanten Verschmutzungswert arbeiten zu lassen, fehlerhaft umgesetzt wurde (Listing 3).

Fehlerfundstelle
Bild 2. Eine nicht initialisierte Variable im Code (siehe Listing 3) – gefunden per statischer Codeanalyse – verursacht unbestimmtes Verhalten.
© Verifysoft Technology

Für das Modell Nr. 12 bleibt die Variable »y« in der Funktion »getStainingLevel()« uninitialisiert und übergibt damit einen unbestimmten Wert für den Verschmutzungsgrad. Da während der Modultests der Wert nicht auffällig war, blieb dieser schwerwiegende Fehler unentdeckt (Bild 2).

Das Ergebnis der statischen Quellcodeanalyse (Bild 3) zeigt, dass der Fehler des nicht erreichbaren Codeabschnitts mit statischer Codeanalyse bereits zur Implementierungszeit hätte aufgedeckt werden können. Beide Fehler konnten nur durch die Kombination von statischer und dynamischer Analyse aufgedeckt werden.

Fundstelle: unerreichbarer Programmcode
Bild 3. Mit der statischen Codeanalyse lässt sich nicht erreichbarer Code finden.
© Verifysoft Technology

Statische Codeanalyse und dynamische Tests kombiniert mit der Messung der Code-Coverage müssen komplementär eingesetzt werden, um möglichst viele Fehler ausschließen zu können. Die statische Codeanalyse kann dabei bereits früh im Entwicklungsprozess eingesetzt werden und somit hohe Kosten einsparen. Richtig eingesetzt, bieten Tools zur statischen und dynamischen Codeanalyse erhebliches Potenzial zur Kosteneinsparung und zur Steigerung der Produktivität.

 

Der Autor

Royd Lüdtke, Verifysoft Technology
Royd Lüdtke, Verifysoft Technology
© Verifysoft Technology

Royd Lüdtke

leitet bei Verifysoft Technology den Bereich Pre-Sales und Support für Statische Codeanalysetools. Er hat umfangreiche Erfahrung als Applikationsingenieur und Berater, hält mehrere Patente und ist Autor von Veröffentlichungen im IT-Bereich.

luedtke@verifysoft.com


  1. Statische Codeanalyse und dynamische Tests
  2. Kombination von statischer Codeanalyse und dynamischem Testen

Verwandte Artikel

Verifysoft Technology