
In meinem letzten Artikel zum Thema Softwaretest bin ich auf den Schwerpunkt Systemtests eingegangen. Dieses Mal möchte ich den Fokus auf automatisierbare Modultests legen und mit dem Tool C16Unit auch gleich eine Lösung für die Praxis vorstellen.
Modultests allgemein
Das Testen von Software wird häufig als zeitraubende und unbeliebte Angelegenheit betrachtet. Dies ist aufgrund der Randbedingungen nicht verwunderlich:
- Testen ist gewissermaßen destruktiv, da man versucht, eine Software in einen fehlerhaften Zustand zu leiten.
- Testen kommt meist in einer stressigen Phase zum Tragen, in der der Kunde auf eine neue Funktionalität wartet und der zugesagte Freigabetermin immer näher rückt (oder gar bereits überschritten ist?).
- Testen bringt auf den ersten Blick keinen direkten Mehrwert für die Software (im Sinne von „neue Funktionalität“).
Dennoch ist das Testen natürlich unabdingbar, um die Qualität einer Software zu überprüfen. Eine Möglichkeit, um diesen Vorgang zu optimieren, ist die Durchführung von automatisierten Modultests. Der Entwickler schreibt dabei kleine Testprogramme, die die Funktionalität kleinerer Softwareteile – wie beispielsweise einzelner Funktionen – überprüfen. Im einfachsten Fall werden der zu testenden Funktion einige Testwerte als Parameter übergeben und geprüft, ob das korrekte Ergebnis zurückgeliefert wird. Angenommen es gibt eine (zugegeben sehr theoretische) Funktion
sub addiere (wert1 : int; wert2 : int;): int;
die die Summe von zwei Zahlen bildet. Die zugehörige Testfunktion könnte die Funktion addiere() mit den Werten -10 und +10 aufrufen und prüfen, ob das erwartete Ergebnis 0 zurückgeliefert wird. Auch das Verhalten in Grenzbereichen („Was passiert wenn der größte mögliche Wert um 1 erhöht werden soll?“) lässt sich auf diese Weise kontrollieren.
Der Vorteil einer solchen Testfunktion ist, dass sie jederzeit wieder ausgeführt werden kann, um die Funktionalität des entsprechenden Softwareteils zu überprüfen. Durch jede neue Testfunktion vergrößert sich zudem der Pool an testenden Helferlein, die nur darauf warten, auf die Jagd nach Fehlern zu gehen. Die Ausführung der Tests kann dann beispielsweise nach jeder Änderung am Programm durchgeführt werden, um fehlerhafte Auswirkungen zu finden.
Der Nachteil solcher Testfunktionen ist ihre Beschränkung auf Systemfunktionen. Oberflächenfunktionen lassen sich nur selten automatisiert testen, da die Ergebnisse schwer zu kontrollieren sind oder der Aufwand dafür sehr hoch sein kann. Modultests können dadurch keinesfalls als kompletter Ersatz für herkömmliche Tests (Systemtests, Akzeptanztests) gesehen werden, beschleunigen allerdings die Fehlersuche und sparen damit Zeit.
C16Unit – Modultests in CONZEPT 16
Damit die Erstellung von eigenen Modultests in CONZEPT 16 möglichst einfach und schnell von der Hand gehen kann, haben wir ein kleines Test-Framework entwickelt: C16Unit. Dieses lehnt sich an Tools wie JUnit (Java) oder PHPUnit an und ermöglicht das automatisierte Ausführen der eigenen Testroutinen.
In einem in Kürze erscheinenden Blog-Artikel wird C16Unit zum Download bereitgestellt und die ersten Schritte mit dem Tool gezeigt. Zusätzlich wird weiter auf mögliche Strategien zur Erstellung von Modultests eingegangen.
Welche Anforderungen oder Schwierigkeiten sehen Sie zum Thema Modultests? Ich freue mich über Ihre Kommentare und lasse sie gerne in den Folgeartikel einfließen.