Techblog

Testautomatisierung mit TUTTU und TATTA

Von Florian Pilz

1. Februar 2021

Was automatisiere ich auf welcher Ebene?

In vielen meiner Projekte werde ich beauftragt, die Frontend-Tests zu automatisieren. Das hat auf jeden Fall seine Berechtigung, da man nur so sichergehen kann, dass das Frontend auch das macht, was es soll. Es ist jedoch zeitaufwändig, fehleranfällig und hat viele Abhängigkeiten. Es müssen zum Beispiel Browser sowie Backend oder Mock vorhanden sein, oder die Geschwindigkeit der Verbindung muss passen, um Timing-Probleme zu vermeiden… um nur zwei der vielen Abhängigkeiten zu herauszugreifen. Die Frontendautomatisierung eignet sich somit nicht für alle Tests. Das bringt die Frage auf den Tisch „Was automatisiere ich denn auf welcher Ebene?“.

Testpyramide zeigt die Verteilung der Tests

Eine Antwort auf diese Frage bietet die Testpyramide (mehr hier bei Martin Fowler).

Sie besagt, dass es eine breite Basis an Unittest braucht. Gefolgt von vielen Test auf API-Ebene. Und wenigen UI-Tests.

Je weiter man in der Pyramide nach oben geht, umso aufwändiger und vor allem langsamer werden die Tests. Aus diesem Grund werden auf den oberen Ebenen auch weniger Tests erstellt.

Und was eignet sich für die Automatisierung?

Die Testpyramide gibt aber keine Auskunft darüber, was eigentlich auf welcher Ebene automatisiert wird.

Nehmen wir als Beispiel die Validierung eines Formulars: Der Test navigiert an die entsprechende Stelle, gibt Daten in das Formular ein und prüft, ob gegebenenfalls eine Fehlermeldung angezeigt wird oder nicht. Das klingt zunächst nach einem sinnvollen UI-Test. Was aber, wenn viele Kombinationen möglich sind? Das kann die Testausführung enorm in die Länge ziehen, da beispielsweise jedes Mal der Browser gestartet wird, ein Account eingeloggt wird, an die entsprechende Stelle navigiert wird und Daten eingegeben werden. Vielleicht gehört der Test dann doch auf die API-Ebene? Aber woher weiß ich dann, dass sich das Frontend korrekt verhält?

TUTTU und TATTA

Vor einigen Jahren besuchte ich eine Fortbildung, auf der Mark Winteringham eine Mnemonik vorstellte, die ich gern für genau diese Frage verwende: TUTTU und TATTA. In diesen Vortragsfolien gibt es die Erklärung von Mark selbst, alternativ in diesem Vortragsvideo auf YouTube.

TUTTU und TATTA stehen für:

Testing the UI or Testing Through the UI

Und:

Testing the API or Testing Through the API

Bezogen auf das oben genannte Beispiel interpretiere ich diese Mnemonik so:

  • Wenn ich die Validierung einer Webseite überprüfe, prüfe ich dann tatsächlich die Webseite? Eigentlich nicht. Also teste ich „Through the UI“
  • Teste ich also die API? Eigentlich auch das nicht, da die Validierung irgendwo im Backend stattfindet. Also teste ich „Through the API“

Dadurch ergibt sich, dass die eigentliche Validierung vermutlich irgendwo in einer Methode im Backend stattfindet. Es macht also Sinn die Validierung auch dort zu testen. Auf diese Weise können viele Kombinationen innerhalb von Bruchteilen einer Sekunde getestet werden, an deren Ende dann ziemlich sichergestellt ist, dass die eigentliche Validierung funktioniert.

Zusätzlich braucht es aber auch Tests auf der API-Ebene, um beispielweise herauszufinden, ob ein korrekter http-Status zurückgegeben wird oder ob Daten korrekt gesendet werden. Das kann gut über die API getestet werden. In diesem Fall teste ich also tatsächlich die API und erstelle entsprechende Tests.

Und zu guter Letzt braucht es auch UI-Tests. Diese stellen zum Beispiel sicher, dass bei einer falschen Angabe eine Fehlermeldung angezeigt wird. Das geht nur über die UI, also wird hier tatsächlich die UI getestet und UI-Tests erstellt.

 

Fazit

Ich persönlich finde TUTTU und TATTA eine gute Hilfestellung bei der Frage, welche Tests eigentlich auf welcher Ebene der Testpyramide automatisiert werden. Hält man sich an dieses Schema, so kommt man am Ende bei der Struktur der Testpyramide heraus, da dann viele Unittest, einige API-Tests und wenige UI-Tests existieren. Das beschleunigt die Tests und den Aufwand (und damit die Kosten) für die Testautomatisierung.

Vielleicht hilft Dir diese Mnemonik auch, wenn Du das nächste Mal überlegst, was sie auf welcher Ebene automatisieren sollen. Falls Du andere Merksätze oder Tipps hast, freu ich mich auf Deinen Kommentar unten.