move-left Back
🌍 All Regions
Quality Assurance Engineering

12 Merkmale guter, automatisierter Tests

Es gibt mehrere Gründe, automatisierte Tests zu schreiben, und das Verfassen solcher Tests mag relativ einfach erscheinen. Das Schreiben „guter“ automatisierter Tests ist jedoch wesentlich schwieriger und erfordert umfangreiche Erfahrung sowie gezieltes Training.

In diesem Beitrag habe ich einige (übergeordnete) Kriterien zusammengestellt, die erfüllt sein müssen, damit die automatisierten Tests als gut gelten können. Die Kriterien sind in zwölf Merkmalen definiert, und wenn diese erfüllt sind, entspricht dies der Definition von „guten“ automatisierten Tests.

Hier sind einige übergeordnete Ziele, die zutreffen könnten:

  • Tests sollten uns helfen, die Qualität zu verbessern.
  • Tests sollten uns helfen, das System zu verstehen.
  • Tests sollten Risiken verringern (und nicht erhöhen).
  • Tests sollten einfach durchzuführen sein.
  • Tests sollten einfach zu schreiben und zu pflegen sein.
  • Tests sollten nur minimalen Wartungsaufwand erfordern, wenn sich das System um sie herum weiterentwickelt.

Tests sollten uns helfen, die Qualität zu verbessern


1. Test als Spezifikation

Wenn Sie TDD – testgetriebene Entwicklung – oder BDD – verhaltensgetriebene Entwicklung (Test-First-Entwicklung) – verwenden, bieten Ihnen die Tests die Möglichkeit, festzuhalten, was das System leisten soll, bevor Sie mit der Entwicklung beginnen. Das Durchdenken verschiedener Szenarien, um sie in Tests umzusetzen, hilft uns dabei, Bereiche zu identifizieren, in denen die Anforderungen mehrdeutig oder widersprüchlich sind. Eine solche Analyse verdeutlicht das Ziel der Spezifikation, was zu einem präziseren Design führt und somit die Qualität der Software verbessert.

2. Fehlerabwehr

Automatisierte Tests finden Fehler, aber das ist nicht der Hauptzweck der Testautomatisierung. Automatisierte Tests verhindern, dass Fehler überhaupt erst entstehen. Stellen Sie sich automatisierte Tests als Abwehr von Fehlern vor, die verhindert, dass Fehler wieder in unsere Software gelangen, nachdem wir sichergestellt haben, dass sie fehlerfrei ist. Wenn wir über gute und vollständige Regressionstests verfügen, wird es keine Fehler geben, da die Tests die Fehler aufdecken, noch bevor wir unseren Code einchecken.

3. Identifizierung von Fehlern

Sind die automatisierten Tests relativ klein (das heißt, wir testen in jedem einzelnen nur ein einziges Verhalten), können wir den Fehler anhand des fehlgeschlagenen Tests schnell lokalisieren. Um dies zu erreichen, müssen wir jedoch Tests für alle möglichen Szenarien schreiben, um jede Einheit der Software abzudecken. Die Tests dürfen niemals Mehrdeutigkeiten enthalten. Daher ist es entscheidend, dass wir die Tests so klein und einfach wie möglich halten (geringe Komplexität, einheitliches Format und Prüfung eines einzelnen Verhaltens in jedem Test).

Tests sollten uns helfen, das System zu verstehen

4. Tests als Dokumentation

Automatisierte Tests können deutlich machen, wie der Code funktionieren sollte. Sie zeigen, wie das Ergebnis aussehen sollte (sie geben das erwartete Ergebnis einer oder mehrerer Anweisungen an).

Wenn wir wissen wollen, wie das System etwas ausführt, können wir den Debugger starten, den Test ausführen und Schritt für Schritt durch den Code gehen, um zu sehen, wie er funktioniert. Die Unit-Tests dienen als eine Form der Dokumentation für das System.

Tests sollten das Risiko verringern (und nicht erhöhen)

5. Tests als Sicherheitsnetz

Das Ändern von älterem Code ist riskant, da wir oft nicht wissen, was wir dabei kaputtmachen könnten, und es ist auch schwer zu erkennen, ob wir tatsächlich etwas kaputtgemacht haben! Wir müssen sehr langsam und vorsichtig vorgehen und viele manuelle Analysen durchführen, bevor wir Änderungen vornehmen.

Wenn wir jedoch mit Code arbeiten, für den es eine automatisierte Testsuite gibt, können wir viel schneller vorankommen. Die Tests erkennen unerwartete Nebenwirkungen von Änderungen und zeigen uns an, ob wir etwas kaputt gemacht haben. Auf diese Weise fungieren die automatischen Tests als Sicherheitsnetz, das uns ermutigt, Risiken einzugehen.

6. Kein Testrisiko

Wir müssen darauf achten, dass wir durch automatisierte Tests keine neuen Arten von Problemen in das System einbringen. Halten Sie Testcode vom Produktionscode getrennt, um testspezifische Abhängigkeiten im System zu vermeiden (besonders wichtig bei Unit-Test-Code). Der gesamte testspezifische Code und alle testspezifischen Bibliotheken dürfen nur im Test-Build und in der Testumgebung vom Test einbunden werden. Testabhängigkeiten und Testcode dürfen niemals im endgültigen Code enthalten sein, wenn dieser für die Produktion erstellt wird.

Tests sollten einfach auszuführen sein

Es gibt vier spezifische Merkmale, die automatisierte Tests einfach auszuführen machen. Mit diesen vier Merkmalen können Sie einfach auf eine Schaltfläche klicken (oder besser noch den Test automatisch auslösen), um das wertvolle Feedback zu erhalten, das die Tests liefern:

  • Die Tests müssen vollständig automatisiert sein, damit sie ohne Aufwand ausgeführt werden können.

  • Die Tests müssen selbstauswertend sein, damit sie Fehler ohne manuelle Überprüfung erkennen und melden können.
  • Die Tests müssen wiederholbar sein, damit sie mehrfach mit denselben Ergebnissen ausgeführt werden können.
  • Jeder Test sollte eigenständig sein, damit er unabhängig von anderen Tests ausgeführt werden kann.

7. Vollautomatisierte Tests

Ein Test, der ohne jeglichen manuellen Eingriff ausgeführt werden kann, ist ein vollautomatischer Test. Die Erfüllung dieses Merkmals ist eine Voraussetzung für die Erfüllung der anderen Merkmale.

8. Selbstauswertung

Ein Selbstauswertungs-Test kann alles enthalten, was der Test benötigt, um zu überprüfen, ob das erwartete Ergebnis korrekt ist. Der Test benachrichtigt uns nur, wenn das Ergebnis nicht akzeptabel ist; folglich erfordert ein fehlerfreier Testlauf keinerlei manuellen Aufwand.

9. Wiederholbare Tests

Ein wiederholbarer Test kann immer wieder ausgeführt werden und liefert dabei stets genau dieselben Ergebnisse, ohne dass zwischen den Durchläufen ein menschliches Eingreifen oder eine Analyse erforderlich ist.

Tests sollten einfach zu schreiben und zu pflegen sein

Wenn wir das Verhalten in einem Teil eines Systems ändern, sollten wir davon ausgehen, dass nur eine geringe Anzahl von Tests von unseren Änderungen betroffen ist. Einer der Vorteile der Testautomatisierung besteht darin, Änderungen einfach vornehmen zu können. Wir sollten daher stets darauf achten, dass unsere Tests nicht das Gegenteil bewirken (Änderungen erschweren). Tests sollten nur minimalen Wartungsaufwand erfordern, während sich das System um sie herum weiterentwickelt.

10. Einfache Tests

Konzentrieren Sie sich auf die Tests selbst und nicht darauf, wie man sie tatsächlich programmiert. Das bedeutet, dass die Tests einfach/trivial sein müssen (leicht zu lesen, leicht zu schreiben und leicht zu warten). Wir sollten darauf hinarbeiten, pro Test eine Bedingung zu überprüfen, indem wir für jede eindeutige Kombination von Bedingungen eine separate Testmethode erstellen. Jede Testmethode sollte das System über einen einzigen Pfad im System testen.


11. Aussagekräftige Tests

Eine Bibliothek mit Hilfsmethoden, die eine domänenspezifische Testsprache bildet, ermöglicht es dem Verfasser des Testcodes, die zu testenden Konzepte auszudrücken, ohne seine Gedanken in wesentlich detaillierteren Code umsetzen zu müssen.

12. Probleme aufteilen

Halten Sie den Testcode vom Produktionscode getrennt (behalten Sie die Struktur und Logik des Produktionscodes bei, jedoch in einer parallelen Struktur). Jeder Test sollte sich auf ein einzelnes Problem konzentrieren, um komplizierte und unübersichtliche Tests zu vermeiden.

Zusammenfassung

Es gibt einen Unterschied zwischen einem Test und einem guten Test, doch oft ist es schwierig zu definieren, was einen „guten“ Test ausmacht. In dieser Checkliste habe ich 12 Merkmale für gute Testautomatisierungspraktiken vorgestellt, die wiederum zu einfach zu schreibenden Tests und einer ordnungsgemäßen Wartung führen – beides Faktoren, die für ein System von großer Bedeutung sind.

Tags

Quality Assurance Engineering All Industries All Business Units