Unit-Tests steigern Qualität und Produktivität von Software - ein Kunststück?

Eine Zusammenfassung von Sebastian Dietrich, Software-Architekt, ANECON

Unit-Testen ist in aller Munde, verspricht doch dessen Einsatz die Anzahl der Fehler, die nach der Entwicklungsphase in der Software verbleiben, eklatant zu reduzieren.

Studien und Projekte beweisen, was Befürworter von Unit-Tests behaupten: Der Einsatz von Unit-Tests bringt bereits während der Entwicklungsphase so viel, dass deren Kosten für Erstellung und Wartung gedeckt sind. Damit verbessert der gekonnte Einsatz von Unit-Tests nicht nur die Qualität von Software, sondern steigert auch die Produktivität.
Unit-Tests sind aber nur erfolgreich, wenn ein Committment von allen Beteiligten, insbesondere der Projektleitung und der Entwickler sowie fundierte Erfahrung im produktiven Umgang mit Unit-Tests vorhanden sind.
Dies entspricht auch den Erfahrungen, die ANECON in Projekten, in denen Unit-Tests zum Einsatz kommen, regelmäßig macht.

Einsatz lässt noch zu wünschen über
Unit-Testen kostet also angeblich in der Entwicklungsphase nichts und bringt dramatische Produktivitätssteigerungen für spätere Phasen wie Testen und Wartung. Warum aber haben viele Projekte Probleme bei der Einführung von Unit-Tests? Warum ist es so schwer, Entwickler von der Sinnhaftigkeit von Unit-Tests nachhaltig zu überzeugen?

Mit langer Erfahrung im Einsatz von agilen Methoden hat ANECON bereits in vielen Projekten und Unternehmen Unit-Tests eingeführt. Dabei wurde besonders folgendes beobachtet:

  • Unit-Tests passen nicht zum Selbstverständnis der Entwickler:
    Gute Entwickler sind SCHNELLE Entwickler. Dass darunter die Qualität des Codes leidet, wird (auch von den Projektleitern) in Kauf genommen.
  • Unit-Tests passen nicht zum Entwicklungsprozess:
    Der Entwicklungsprozess sieht keine Zeit zum Schreiben von Unit-Tests vor bzw. diese, wenn sich Code/Design/Architektur/Anforderungen ändern, zu warten.
  • Unit-Tests zu schreiben ist schwer bzw. beinahe unmöglich:
    Unit-Tests für einen bestehenden, komplizierten Code zu schreiben ist äußerst schwierig. Hat dieser Code dazu noch externe Abhängigkeiten, wird es beinahe unmöglich.

Einfache Kriterien zum Erfolg

Welche Grundsätze sind also nötig, damit Unit-Tests in unterschiedlichen Projekten dennoch erfolgreich zum Einsatz kommen?

  • Erfolgreiches Unit-Testen funktioniert nur durch Überzeugung der Entwickler:
    Nur wenn ALLE Entwickler Unit-Testen beherrschen und auch überzeugt einsetzen, können Unit-Tests ein Erfolg werden.
  • Unit-Tests müssen im Entwicklungsprozess verankert sein:
    Der Entwicklungsprozess muss sowohl Zeit für Unit-Testen vor bzw. während der Codierung (auf gar keinen Fall danach) vorsehen und das Ergebnis der Unit-Tests (100% laufende Tests, hohe Codeabdeckung  > 70%) einfordern.
  • Unit-Testen ist nicht einfach, kann aber gelernt werden:
    Unit-Testen ist die Königs-Disziplin der Software-Entwicklung. Der produktive Umgang mit Techniken wie Testgetriebene Entwicklung, Mock Objects, In-Memory DBs, … sowie die pragmatische Abgrenzung von Integration-Tests muss verstanden und gemeistert werden bevor Unit-Testen nachhaltigen Erfolg zeigen kann.