Fast jedes Team, das sich dazu entschließt, Tests „ernsthaft zu nehmen“, beginnt an der falschen Stelle: bei der Wahl des Tools. Framework, Plugin, Runner werden besprochen, und erst später wird jemandem klar, dass niemand definiert hat, was schließlich wie getestet wird.
Das Werkzeug ist die letzte Entscheidung, nicht die erste. Davor stehen strukturelle Entscheidungen, die darüber entscheiden, ob Ihre Suite eine Bereicherung oder ein Eigengewicht sein wird. Wer diese Entscheidungen in der richtigen Reihenfolge definiert, schafft eine Grundlage, die über Jahre hinweg Bestand hat. Wer improvisiert, stellt eine Suite zusammen, die in sechs Monaten neu geschrieben wird.
Dieser Text ist ein Skript. Dabei handelt es sich nicht um eine Liste loser „guter Praktiken“, sondern um die Abfolge von Schritten, die ich befolge, wenn ich die Testarchitektur eines Produkts von Grund auf strukturieren muss.
Schritt 1: Definieren Sie, was Risiko ist, bevor Sie festlegen, was getestet werden soll
Alles zu testen ist unmöglich und unnötig. Die erste Entscheidung besteht darin, zu verstehen, wo das tatsächliche Risiko des Produkts liegt.
In einem Zahlungssystem liegt das Risiko in der Berechnung von Werten und der Idempotenz von Transaktionen. Bei einem öffentlichen Dienstleistungsportal geht es um die Berechtigung und Kontrolle des Zugriffs auf personenbezogene Daten. Im E-Commerce befindet es sich im Warenkorb und an der Kasse. Planen Sie dies zuerst.
Diese Risikolandkarte definiert, wo es sich lohnt, in ausführliche Tests zu investieren und wo ein leichter Check ausreicht. Ohne sie vergeudet das Team Energie damit, das Triviale zu testen, und lässt das Kritische, die schlimmste aller Welten, unentdeckt.
Schritt 2: Legen Sie die Ebenen und ihre Grenzen fest
Der zweite Schritt besteht darin, die Teststufen festzulegen und festzulegen, was sie jeweils abdecken. Als Orientierung dient die klassische Pyramide: viele Unit-Tests, etwas Integration, wenig End-to-End.
Wichtiger als das Format ist der Rand jeder Ebene. Beim Unit-Test wird eine Regel isoliert und ohne Infrastruktur überprüft. Integrationstests überprüfen, ob Komponenten oder Dienste korrekt kommunizieren. End-to-End-Tests prüfen den gesamten Benutzerfluss.
Durch die Festlegung dieser Grenzen wird der kostspieligste Fehler deutlich vermieden: sich überschneidende Tests. Wenn das gleiche Verhalten auf drei Ebenen überprüft wird, führt jede Änderung zum Scheitern dreier Tests, und die Suite wird brüchig, ohne dass Vertrauen gewonnen wird.
Schritt 3: Stellen Sie die Isolation vom ersten Test sicher
Die Isolierung ist die Eigenschaft, die am meisten über den künftigen Zustand der Suite entscheidet, und die am Anfang am meisten vernachlässigt wird.
Für jeden Test muss ein eigenes Szenario erstellt und am Ende bereinigt werden. Kein Test kann davon abhängen, was ein anderer Test in der Bank, im Speicher oder im Dateisystem übrig hat. Sobald ein Test davon ausgeht, dass „Benutzer X bereits existiert“, haben Sie eine tickende Zeitbombe platziert.
Die praktische Konsequenz ist anspruchsvoll: Unit-Tests berühren weder Bank, Netzwerk noch Uhr. Wenn Ihre Funktion nur durch Hinzufügen einer halben Anwendung getestet werden kann, liegt das Problem in der Codekopplung. Mit dem Test erhalten Sie kostenlos eine Architekturdiagnose.
Schritt 4: Entscheiden Sie, wie mit externen Abhängigkeiten umgegangen werden soll
Datenbank, APIs von Drittanbietern, Zahlungsgateways, E-Mail-Dienste. Jede echte Anwendung hängt von Dingen außerhalb ab. Wie sie beim Testen behandelt werden, ist eine strukturelle Entscheidung.
Es gibt zwei schlechte Extreme. Alles zu verspotten macht die Suite schnell, aber unwahr: Sie testen Ihre Annahme über die Abhängigkeit, nicht die Abhängigkeit. Wenn alles Reale verwendet wird, bleibt die Suite zwar originalgetreu, aber langsam und instabil.
Das Gleichgewicht, das ich verteidige: Verdoppelung der internen und peripheren Abhängigkeiten, echte Integration an kritischen Grenzen. Das Payment Gateway und die Persistenzschicht verdienen es, in einer kontrollierten Umgebung anhand realer Implementierungen getestet zu werden. Der E-Mail-Dienst kann in den meisten Fällen simuliert werden.
Schritt 5: Behandeln Sie Testdaten als Teil der Architektur
Daten sind der unsichtbare Teil, der Suiten versenkt. Von Hand zusammengestellte, verstreute und duplizierte Szenarien werden zu einem Wartungsalbtraum, wenn sich das Datenmodell ändert.
Zentralisieren Sie die Szenarioerstellung in wiederverwendbaren Buildern. Anstatt bei jedem Test eine vollständige Bestellung von Grund auf zusammenzustellen, wird nach einer „gültigen Bestellung“ gefragt und nur das angepasst, was für den Fall wichtig ist. Dies reduziert das Rauschen, macht den Test lesbar und schützt die Suite vor Modelländerungen.
Bei Produkten, die mit personenbezogenen Daten arbeiten, gibt es eine zusätzliche Vorsichtsmaßnahme, die viele vergessen: Verwenden Sie niemals echte Produktionsdaten in einer Testumgebung. Dies widerspricht neben der Leckagegefahr direkt LGPD. Testdaten müssen synthetisch sein.
Schritt 6: Von Anfang an mit dem Laufband integrieren
Eine Suite, die nur auf dem Rechner der Person läuft, die sie geschrieben hat, schützt niemanden. Der sechste Schritt besteht darin, die Tests von Anfang an in das CI zu integrieren, nicht als Nachrüstung.
Aufbau in Etappen: Zuerst fahren, dann schnell scheitern; Integration und End-to-End im Anschluss. Definieren Sie, dass eine Pull-Anfrage nicht in die Red Suite gelangt. Diese einfache Regel verändert die Kultur, da sie das Testen von einer „optionalen Aufgabe“ zu einem Teil des Lieferflusses macht.
Und messen Sie die Ausführungszeit frühzeitig. Eine Suite, die ohne Zeitkontrolle wächst, wird früher oder später zu etwas, mit dem das Team zurechtkommt.
Der Schritt, den niemand formalisiert: Wartung
Es gibt einen letzten Schritt, der es selten in Skripte schafft: die Entscheidung, wer sich im Laufe der Zeit um die Suite kümmern wird. Testcode altert, es kommt zu Duplikaten und es kommt zu unregelmäßigen Tests wie bei jedem anderen System.
Die strukturelle Entscheidung hier besteht darin, Tests als Teil der Definition von erledigt zu behandeln und den Suite-Zustand als technische Metrik zu betrachten. Ohne Eigentümer und ohne Kennzahlen verschlechtert sich die beste Ausgangsarchitektur in ein oder zwei Jahren.
Das Einrichten der Testarchitektur in der richtigen Reihenfolge, dem richtigen Risiko, den richtigen Ebenen, der richtigen Isolierung, den richtigen Abhängigkeiten, den richtigen Daten, dem richtigen Förderband und der richtigen Wartung ist keine Bürokratie. Es ist der Unterschied zwischen einer Suite, die einem den Mut gibt, das System weiterzuentwickeln, und einer Suite, die einem Angst macht, es anzufassen.
Wenn Sie Tests für ein neues Produkt strukturieren oder versuchen, eine zur Last gewordene Suite zu retten, lohnt es sich, mit diesen Schritten zu beginnen, bevor Sie den Editor öffnen. Ich habe weitere Artikel auf dem Blog über Qualität und Technik, und wenn dies ein konkretes Problem in Ihrem Team ist, ist es ein gutes Gespräch.
Lesen Sie auch
- Automatisierte Testarchitektur: eine Kurzanleitung für Teams, die Geschwindigkeit benötigen
- Regressionstests: Versicherung gegen den Bruch dessen, was bereits funktioniert hat
- Automatisiertes Testen: Warum ungetesteter Code Schulden ist
- Softwaretestzyklus: Trends und eine Kurzanleitung für Führungskräfte
- Softwareleistung: Was reale Fälle über Qualität lehren
- Automatisiertes Testen: Architektur und Grundlagen