Unit Tests und sie umgebende Mythen

Unit Tests und sie umgebende Mythen

Warum Unit Tests?

Das Testen von Produkten vor ihrer Auslieferung ist keine Neuheit. Maschinen jeglicher Art werden, bevor sie den Kunden erreichen, ausgiebig auf Ihre Stabilität, Laufzeit und Sicherheit getestet. Bei physisch vorhandenen Produkten lassen sich demnach auch physische Eigenschaften testen. Wie aber lässt sich Software testen?

Die Softwaretechnik unterscheidet in verschiedenste Testarten. In diesem Blogeintrag werden wir uns auf eine der gängigen Testarten beschränken, welche bei vergleichsweise niedrigem Aufwand trotzdem leicht zu verwenden und warten ist und somit eine große Entwicklungsunterstützung darstellt: Unit Tests.

Unit Tests sind in ihrer primitivsten Form erst einmal dazu da, zu überprüfen, dass eine Softwarekomponente (eine Unit) aus einem gegebenen Eingabeparametersatz immer bestimmte, erwartete, Ausgabeparameter zurückgibt. Unit Tests gehören damit zu den sogenannten „Black-Box“-Tests. Bei diesen wird darauf verzichtet, die interne Funktionsweise der getesteten Komponente zu verstehen und zu prüfen und es wird nur die Ausgabe bei definierter Eingabe geprüft.

Vorteile

Ein wesentlicher Vorteil von Unit Tests ist somit, dass sie während der Entwicklung des Programm-Codes existieren und somit bereits in anfänglichen Entwicklungsphasen helfen, Fehler aufzudecken. In diesen Entwicklungsphasen muss die Software im Ganzen nicht vollständig entwickelt sein – einzelne Module der Software können trotzdem isoliert getestet werden. Bei Anpassungen an dem Programm, beispielsweise durch Änderungswünsche des Kunden, kann so kontinuierlich verifiziert werden, dass die Funktionen korrekt arbeiten und keine unerwarteten Nebeneffekte auftreten. Arbeiten mehrere Entwickler an einer Software können diese ständig verifizieren, dass ihre eigenen Änderungen keine unerwarteten (negativen) Nebeneffekte auf andere Softwareteile mit sich gebracht haben.

Vor allem bei größeren Projekten wird der Mehraufwand für Unit Tests anfänglich eher als ineffizient angesehen. Dabei rentiert sich der Aufwand gerade in der Anfangsphase eines Projektes auf lange Zeit gesehen immens. Durch die automatisierte Ausführung dieser Tests ist später für jede weitere Ausbaustufe der Software gegeben, dass jede Funktionalität immer noch fehlerfrei vorhanden ist.

Generell gilt: Je später ein Fehler gefunden wird, desto teurer ist die Behebung.

Vorteile von Unit TestsAbb. 1: Vorteile von Unit Tests

 

Probleme und Gründe gegen Unit Tests?

Im Folgenden geben wir Antworten auf gängige Probleme und vermeintliche Gründe, die gegen das Erstellen von Unit Tests sprechen.

 

Gängige Probleme mit und Gründe gegen Unit Tests

 

Abb. 2: Gängige Probleme mit und Gründe gegen Unit Tests

 

Die Methode ist zu kompliziert, um sie zu testen.

Schlägt ein Test bei einer umfangreichen Methode fehl, ist es umso schwieriger die Fehlerursache in der Methode zu finden. Wenn eine Methode so umfangreich ist, dass sie mehrere Funktionalitäten abdeckt, sollten diese verschiedenen Funktionalitäten in verschiedene Methoden ausgelagert werden. Diese Methoden können dann, jede für sich, getestet werden.

Im Allgemeinen gilt: Je komplizierter die Funktionalität, desto wichtiger die Unit Tests. Unit Tests helfen bei dem Verstehen der Funktionsweisen und vor allem unterstützen sie die Wartbarkeit des Programms.

 

Wie soll ein Test Fehler in meinem Programmcode aufdecken, wenn ich beides selber schreibe?

Eine häufige Frage, wenn es um das Schreiben von Unit Tests geht. Generell unterstützen Tests beim Entwicklungsprozess, indem aktiv über mögliche Szenarien nachgedacht wird. Ein Leitfaden, an den man sich halten kann, ist, dass Unit Tests aus der Sicht des Anwenders geschrieben werden sollten. Getestet wird nicht die Implementation, sondern das Verhalten, das von einer Funktion erwünscht ist.

Auch werden in Unit Tests erfahrungsgemäß häufiger fehlerhafte Eingaben getestet. Oft wird beim manuellen Test daran gedacht, was das gewünschte Ergebnis ist. Dabei ist auch interessant, wie Anwendungen auf nicht vorhergesehene Szenarien reagieren, wie beim Ausführen einer Aktion mit nicht vorhandenen Daten.

 

Die Vorbereitung der Tests ist komplizierter als das, was ich testen möchte.

Es gibt mehrere Gründe, warum die Vorbereitung eines Unit Tests kompliziert sein kann. Zum einen kann die Erstellung der Testdaten umfangreich sein. In diesem Fall bietet es sich an, Testdaten zentral für alle Unit Tests bereitzustellen, da sie in weiteren Tests Verwendungsmöglichkeiten finden können. Dies passiert häufig, wenn man Tests für Funktionen schreibt, die auf Daten aus einer externen Datenquelle zugreifen.

Ein anderer Fall ist, dass zu testende Methoden in Klassen sind, deren isolierte Instanziierung für einen Test schwierig ist.

Hier kann die Überlegung, die Methode auszulagern, sinnvoll sein.

 

Ich habe keine Zeit Unit Tests zu schreiben.

Stehen Entwickler unter Zeitdruck, sehen sie in Unit Tests oftmals nur den Mehraufwand und verdrängen den eigentlichen Nutzen. Gerade in Zeiten, wo der Entwickler schnell ein Feature entwickeln muss, werden häufiger Flüchtigkeitsfehler gemacht. Aus diesem Grund sind Unit Tests auch in diesen Zeiten durchaus sinnvoll. Das folgende Bild zeigt den Teufelskreis in den Entwickler dabei häufig geraten:

 

Unit Test zyklen

 

Fazit:

Unit Tests stellen eine hervorragende Möglichkeit dar, Software während der Entwicklung zu testen und somit die Qualität deutlich zu steigern. Durch das Verhindern von Fehlern in sämtlichen Softwaremodulen kann durchgängig dafür gesorgt werden, dass das Endergebnis wesentlich weniger fehleranfällig und deutlich wartbarer ist. Werden dabei die Tests von Anfang an mit entwickelt, reduziert sich auch der Mehraufwand für das Schreiben von Tests, da darauf geachtet wird, dass einzelne Funktionen der Software gut und isoliert zu testen sind. Erfahrungen zeigen, dass Entwickler schon nach kurzer Zeit den enormen Mehrwert von Unit Tests merken, in dem sie sich bei Änderungen oder Weiterentwicklungen sicherer fühlen.

 

Titelbildnachweis: https://pixabay.com/de/checkliste-umfrage-h%C3%A4ckchen-ok-2320130/

-->