Objektforum Karlsruhe – “Trotz Nebenläufigkeit erfolgreich Unit Tests schreiben”

Ein wirklich interessanter Vortrag mit einer nur auf den ersten Blick überraschenden Erkenntnis:

Wie erstellt man Unit Tests für nebenläufige Funktionen? Man testet nicht die Nebenläufigkeit. Man abstrahiert von der Nebenläufigkeit, das heißt man erstellt das System so, daß nebenläufige Funktionen über abstrakte Interfaces beschrieben werden.

Die nachfolgende Diskussion zeigte wieder einmal, daß der Informatiker an sich nicht einer der Flexibelsten oder Lernfähigsten ist (*). Anmerkungen wie: “Damit testen Sie aber nicht die Aspekte X und Y”, “Das ist bei uns so nicht einsetzbar, weil X” oder “Bei uns liegt aber Z vor, daher können wir nicht…” zeigten, das einige Kollegen wieder exakt die Argumente aufwärmten, die sie in den letzten 10 Jahren bereits (erfolglos) gegen die Konzepte beim Unit-Testing von Benutzerschnittstellen, Datenbankzugriffen, Netzwerkdiensten und anderem vorgebracht hatten:

Wie erstellt man Unit Tests für Benutzerschnittstellen?

Man testet nicht die Benutzerschnittstelle. Man abstrahiert von der eigentlichen Benutzerschnittstelle, indem man beispielsweise MVP (Model View Presenter) nutzt.

Wie erstellt man Unit Tests für die Datenbank?

Man testet nicht die Datenbank. Man abstrahiert von den eigentlichen Datenbankzugriffen, indem man diese in eine eigene, möglichst einfache Mapping-Schicht auslagert.

Wie erstellt man Unit Tests für Netzwerkdienste?

Man testet nicht die Netzwerkdienste. Man abstrahiert von den Netzwerkdiensten, indem man diese durch abstrakte Interfaces beschreibt.

Um zwei weitere Beispiele aus der täglichen Praxis der extragroup GmbH zu bringen:

Wie erstellt man Unit Tests für das Erstellen von Objekten in einem CAD-System?

Man testet nicht das Erstellen der Objekte. Man abstrahiert vom Erstellen der CAD-Objekte, indem das eigentliche Erstellen der CAD-Objekte in eine möglichst einfache Klasse auslagert – die man im schlimmsten Falle über ein abstraktes Interface beschreibt.

Wie erstellt man Unit Tests für das Erstellen von Werkzeugen in einem CAD-System?

Man testet nicht das Verhalten der Werkzeuge. Man abstrahiert vom den CAD-Werkzeugen, indem die eigentliche Schnittstelle zum API des CAD-System durch ein abstraktes Interface beschreibt.

Der geneigte Leser wird sicher inzwischen ein Muster erkannt haben.

Die entscheidende Erkenntnis (für uns wie für die oben genannten Kollegen) ist, daß all dies nur mit testgetriebener Entwicklung sauber möglich ist. Unit Tests nachträglich zu einem System hinzuzufügen, welches nicht auf solche Tests ausgelegt ist, erweist sich in der Praxis als enorm aufwendig.

(*) Ich zähle mich selbstverständlich auch zu genau dieser Gruppe, die neuen Ideen mit einem gezielten “Das funktioniert nicht, weil….” begegnet.