Codequalität durch Unit-Tests

[English][Français][Polski]

Bessere Codequalität und Kosteneinsparungen durch Unit-Tests / Modultests

Unit-Tests (Modultests) sind der effektivste Weg zur Aufdeckung möglichst vieler Fehler im Code.

Studien haben gezeigt, daß Modultests im Vergleich zu anderen Softwaretests das höchste Kosten-Nutzen-Verhältnis haben. Ihnen kommt daher (vor allem in sicherheits- oder missionskritischen Projekten) eine Schlüsselfunktion zu.

Units sind die kleinsten Bausteine der Software. In C entsprechen die Units den Funktionen, in C++ in der Regel den Klassen (obwohl Methoden auch separat getestet werden können).

Beim Unit Test werden einzelne Softwarekomponenten (Klassen, Methoden oder Funktionen) in einer "Stand-Alone-Umgebung" getestet. Die restlichen Codeteile oder das Gesamtprojekt müssen dabei nicht vorliegen. Die Tests werden also in der Regel durchgeführt, bevor die Units in größere Module bzw. in das Gesamtsystem integriert werden. 

Der Vorteil dieser Methode ist, der Test "näher am Fehler". Die Fehleraufdeckung ist dadurch leichter und schneller: treten Fehler auf, müssen diese zwangsläufig in der gerade untersuchten Unit liegen.

Durch den Modultest / Unit-Test werden Probleme sehr früh im Entwicklungsprozeß gefunden. Die Fehlerkorrektur ist in dieser frühen Phase noch relativ einfach und damit vergleichsweise kostengünstig. Die Aufdeckung vieler Fehler ist in späteren Entwicklungsphasen nicht oder nur sehr schwierig möglich. Auf jeden Fall gilt, daß jedes Problem um so teurer wird, je später es entdeckt wird. Ein weiterer Vorteil des Unit-Tests ist das Erreichen einer hohen Testüberdeckung.

Trotz dieser Vorteile werden Unit-Tests oft nur ungern und damit unzureichend durchgeführt, da hierfür eine spezielle Testumgebung erstellt werden muß, die oft so groß und komplex wie der zu überprüfende Originalcode ist. Da die zu testende Unit noch kein selbständig ausführbares Programm ist, wird zum Testen ein sogenannter Testharness benötigt, der zusammen mit dem zu testenden Code ein ausführbares Programm bildet. Sofern die zu testende Unit Funktionen aufruft, die noch nicht geschrieben bzw. nicht verfügbar sind, müssen diese Funktionen durch sogenannte Stubs simuliert werden. Das Schreiben des Testharnesses und der Stubs "von Hand" ist sehr mühsam und fehlerträchtig. Beim manuellen Vorgehen, muß die Testsoftware also nicht nur geschrieben, sondern selbstverständlich auch selbst getestet werden.

Manuelle Unit-Tests sind kompliziert und zeitaufwendig, weshalb Unit-Tests trotz der oben beschriebenen Vorteile oft vernachlässigt werden.

Durch den Einsatz eines Unit-Testtools wie CTA++ von Testwell werden die Probleme vermieden, die beim manuellen Aufbau der Testumgeung entstehen.

Unit-Testtools erstellen die komplette Testumgebung bestehend aus Testharness und Stubs automatisch. Der Tester kann sich somit auf das Schreiben von Testfällen konzentrieren. Manche Entwickler erwarten von einem Testtool, daß es auch die Testfälle automatisch schreibt. Diese Aufgabe kann allerdings nicht automatisiert werden, da kein Tool selbständig feststellen kann, wie sich eine Klasse oder ein Modul verhalten soll. Jeder Testfall hat bestimmte erwartete Werte. Erst durch den Vergleich dieser erwarteten Ergebnisse mit den tatsächlichen Werten kann bestimmt werden, ob sich die jeweilige Funktion bzw. Unit in der gegebenen Situation korrekt verhält.

Bei jeder Modifikation einer Codekomponente müssen die bereits durchgeführten Tests wiederholt werden. Durch diese sogenannten Regressionstests wird sichergestellt, daß durch die Codeveränderung keine neuen Fehler eingebaut wurden. Mit Unit-Testtools kann auch diese Routine-Aktivität automatisiert werden. Die bereits existierenden Testfälle vorheriger Testläufe werden durch Unit-Test-Tools automatisch dokumentiert und können für Regressionstests wiederverwendet werden.

Durch die Automatisierung wird der Testaktivität die Monotonie genommen. Der Entwickler bzw. Tester kann sich auf das Design von Testfällen konzentrieren, statt sich um mechanische und oft langweilige Koaktivitäten kümmern zu müssen. Mit dem Einsatz eines Unit-Testing-Tools wird eine höhere Codequalität in kürzerer Zeit und mit weniger Entwicklungskosten erreicht.

Notwendigkeit von Test-Coverage-Analysen

Idealerweise sollten alle Codeteile möglichst intensiv getestet werden. Um dies sicherzustellen, sollten Unit-Testtools in Verbindung mit einem Testüberdeckungstool (Test-Coverage-Tool, Code Coverage Tool) eingesetzt werden. Coveragetools zeigen ungetesteten Code an und messen die Vollständigkeit der Tests.

Die Produktivität des Testers wird erhöht, indem diesem angezeigt wird, welche Codeteile noch nicht ausreichend getestet worden sind.

Das Coverageanalysetool Testwell-CTC++ unterstützt unter anderem die Testabdeckungstypen Eintrittsüberdeckung (Function Coverage), Zweigüberdeckung (Decision- (Branch-) Coverage), Bedingungsabdeckung (Condition Coverage), Mehrfachbedingungsabdeckung (Multicondition Coverage) und Modified Condition/Decision Coverage. Hiermit erfüllt es die Bedingungen des internationalen Standards DO-178B.

weitere Informationen zum Unittesttool CTA++


last updated: 18.01.2009

© 2002-2009 K. Lambertz (Verifysoft GmbH)
CTA++, CTC++, CMT++ and CMTJava are products of Testwell Oy, Tampere (Finland)
all other trademarks of this site are the property of their respective owners.