Java testen

Testgetriebene Softwareentwicklumg mit Java ist nicht schwer. Mit JUnit lassen sich sehr einfach Tests schreiben und in jeder Java-IDE genauso leicht ausführen. Doch das Wissen um die Funktion von JUnit allein reicht nicht immer aus, drum hier noch ein paar Tips.

Unit-Tests können auf verschiedenen Ebenen der Softwarearchitektur ausgeführt werden:

  • der Test einer Klasse,
  • der Test einer zusammenhängenden Menge von Klassen, also einer Komponente und
  • der Test der Zusammenarbeit von Komponenten, dem System.

Auf jeder Ebenen lassen sich die Tests mit JUnit implementieren. Im folgenden wird deswegen für Klassen und Softwarekomponenten allgemein von Komponente (Unit) gesprochen. Wichtig ist, das jede zu testende Komponente von ihrer Umgebung isoliert werden kann. Das lässt sich durch eine geringe Kopplung untereinander bewerkstellen. Abhängigen dürfen nur in eine Richtig bestehen, zirkuläre Abhängigen sind zu vermeiden. Am besten ist es, nur Schnittstellen zur Kommuikation zwischen Komponenten zu verwenden.

Sind mehrere Komponenten in einer Kette miteinander verbunden, dann dürfen nur direkte nachbarn miteinander kommunizieren. Beim Testen der Funktionalität einer benachtbarten Komponentekann es das Problem problem geben, dass diese nicht zur Verfügung steht. Entweder ein anderes Team sie noch nicht fertig implementiert hat oder weil man mit ihr das eigene Testergebnis nicht verfäslchen will. An dieser Stelle kommen Stubs und Mocks ins Spiel. Dies setzt i. d. R. eine Schnittstelle voraus. Ein  Stub ist eine Implementierung dieser Schnittstelle, die nichts tut, außer ggf. Defaultwert als Returnwerte von Funktionen bereitzustellen. Ein Mock geht da weiter und besitzt eine für den Test angepasste (stark vereinfachte) Implementierung. Sogenannte Mock-up-Frameworks können beim Erstellen von Mock-Objekten helfen.

Wieviel Tests braucht der Mensch? Es sollten alle Verzweigungen geprüft werden, also alle if's und else's. Für Schleifen reicht es nicht, sie mal durchlaufen zu haben. Alle Möglichkeiten einer Schleife lassen sich nur in wenigen Spezialfällen testen. Im Normalfall sollten aber die folgenden Fälle einer Schleifen geprüft werden:

  • Kein Schleifendurchlauf,
  • genau ein Schleifendurchlauf,
  • eine übliche Anzahl von Schleifendurchläufen und
  • die maximale Anzahl von Schleifendurchläufen.

Die genaue Anzahl der letzten beide Fälle hängt vom konkreten Fall ab. Mit der maximalen Anzahl ist nicht unbedingt Integer.MAX_VALUE gemeint. In allen vier Fällen geht es darum, die Grenzfälle des konkreten Algorithmus zu testen.

Getter und Setter werden nicht explizit getestet, sollten aber von den restlichen Test aufgerufen werden. Um die Testabdeckung zu bestimmen gibt es den Klassiker Emma sowie dessen Nachfolger JaCoCo. Für beide gibt es Plug-ins für Java-IDEs (die aktuelle Version von EclEmma verwendet JaCoCo zur Bestimmung der Code Coverage in Eclipse). Getesteter Code wird grün dargestellt, nicht getesteter rot. Überzweigungen die nur nur teilweise ausgeführt werden, werden gelb dargestellt. Mit diesen Informationen lassen sich einfach fehlende Tests ergänzen oder nicht benötigter Code finden. Nicht benötigten Code zu löschen, erhöht auch die Code Coverage der Tests!!

Links

Zurück