Instabilität von Automatisierten Tests der Benutzeroberfläche

Geschrieben von Virginie Rochat

Artikel veröffentlicht - Website (1)

Was ist ein instabiler Test?

Ein instabiler Test - oft auch Flaky Test genannt - ist ein automatisierter Test, welcher inkonsistente Resultate generiert, oobwohl keine Änderungen am entsprechenden Test-Skript vorgenommen wurden. Solche Tests sind bekannt für ihre Unvorhersehbarkeit, da sie unregelmäßig und ohne Veränderungen des Codes oder der Applikation falsches Scheitern (“fails”) oder auch möglicherweise falsche Erfolge (“passes”) generieren können. 

Artikel Freigabe (6)

Flaky Tests sind Tests, welche manchmal richtig, manchmal falsch sind, ohne Änderungen am produktiven oder am Test-Code. Eine im Jahr 2024 von Dorothy Graham​ [1]​ durchgeführte Untersuchung ergab, dass Flakiness immer noch zu den Top 4 der größten Probleme bei der Testautomatisierung gehört. Im Allgemeinen gelten automatisierte Tests von Benutzeroberflächen der Benutzeroberfläche als:

  • Flaky
  • Anfällig
  • Spröde
  • Unzuverlässig
  • Hat unerklärliche, nicht deterministische fails 

Testautomatisierung beinhaltet ein eigenesParadoxon: Wenn automatisierte Tests laufen, werden eigentlich zwei Dinge getestet:

  1. Das getestete System, oder auf Englisch “System Under Test (SUT)”
  2. Der Testautomatisierungs Code an sich

Wie kann man unter dieser Voraussetzung feststellen, wie zuverlässig Testautomatisierung Lösungen sind? Ganz einfach: indem man sie viele Male durch SUT laufen lässt.  

“Flaky Tests sind besser als nichts… oder?”

Allgemein gilt die Annahme, dass Flaky Tests besser sind als gar keine Tests. Wenn ein Test zu 99% erfolgreich verläuft, kann das falsche Schlussfolgerungen in den meisten Fällen verhindern. Diese Annahme scheint plausible – bis wir genauer nachrechnen:

Szenario 1

  • Testsuite mit 300 Tests 
  • Jeder Test hat eine Durchfallquote von 0,5 % → Erfolgsquote = 99,5 %
  • Welche globalen Auswirkungen hat das auf die gesamte Testreihe?

Test Suite Pass Rate = (99.5%)300 = 22.2%

Szenario 2

  • mmer noch eine Testsuite mit 300 Tests
  • Jeder Test hat eine fail-Quote von 0,2 % → pass-Quote = 99,8 %.
  • Welche globalen Auswirkungen hat das auf die gesamte Testreihe?

Test Suite Pass Rate = (99,8%)300 = 54,8%

Im ersten Szenario bedeutet dies, dass die Testsuite in mehr als ¾ der Fälle ohne offensichtlichen Grund scheitern wird! Dies ist nicht ideal und es muss bedacht werden, dass die globale Erfolgsquote niedriger sein wird je mehr Tests in der Testsuite sind.

Das zweite Szenario belegt, dass durch eine Verringerung der Fehlerquote eines Tests das unvorhersehbare Verhalten mehr als halbiert werden kann! 

Nun stellt sich die Frage, ob die anfängliche Einschätzung, dass ein unzuverlässiger Test besser ist als gar kein Test, zutreffend ist (Spoiler-Alarm: Das ist sie nicht!), und dafür müssen wir uns die Auswirkungen unzuverlässiger Tests genauer ansehen:

Artikel Freigabe (5)

Die Auswirkungen sind massiv und werden letztlich (und unweigerlich) zur Schlussfolgerung führen, dass automatisiertes UI Testing nutzlos ist.

Die vorher gestellte Frage können wir somit mit Sicherheit dahingehend beantworten, dass ein Flaky Test SCHLECHTER ist als gar kein Test!

Ist die Flakinesswirklich zufällig? Oder gibt es einen Grund?

In fast allen Fällen hat das, was man als „unzuverlässigen Test“ bezeichnet, eine konkrete Ursache: Geht der Sache auf den Grund, findet die Ursache und behebt das Problem!

Die häufigsten Ursachen für das, was als “flakiness” aufgefasst wird, sind die folgenden:

  1. Testdesign: Einer der häufigsten Gründe für fehlerhafte Tests ist tatsächlich schlechtes Testdesign! Flaky Tests können aufgrund von Problemen im Zusammenhang mit falschen Locator-Strategien (z. B. Identifizierung einer Schaltfläche anhand ihres – sich dynamisch ändernden - inneren Textes) oder bei fehlenden “Assertions” auftreten.
  2. Timing- und Synchronisationsprobleme: Fehlerhafte Tests treten häufig auf, wenn eine korrekte Synchronisation zwischen den Testphasen erforderlich ist (die Webseite ist noch nicht vollständig geladen, wenn der Test ausgeführt wird) oder wenn zeitliche Abhängigkeiten bestehen (der Test schlägt fehl, weil der Ladevorgang des SUT länger dauert als erwartet)
  3. Umgebungsfaktoren: Es gibt zahlreiche Umgebungsfaktoren, die dazu führen können, dass ein Test fehlschlägt, obwohl dies eigentlich nicht der Fall sein sollte, wie beispielsweise Probleme mit der Netzwerkverbindung, Schwankungen bei den Systemressourcen (Arbeitsspeicher, CPU), Abhängigkeiten von APIs oder Diensten von Drittanbietern usw.
  4. Instabile Testumgebung: Wenn die Testumgebung instabil ist, dann sind es auch die Tests... Im folgenden sind einige mögliche Ursachen für eine instabilen Testumgebung aufgeführt:
    Uneinheitliche Testumgebung (z. B. verschiedene Browserversionen oder Betriebssysteme etc.)
    Unzureichende oder unvollständige Konfiguration (z. B. falsche Pfadeinstellungen oder fehlende Abhängigkeiten/Bibliotheken etc.)
    Unzuverlässige Testinfrastruktur oder teilweise Abweichung der Testkonfiguration in der Testumgebung 
  5. Asynchrone Wartezeiten: Eine unsachgemäße Handhabung asynchroner Wartezeiten und Vorgänge – wie Netzwerkabfragen oder UI-Aktualisierungen – kann zu Race Conditions und Timing-Problemen führen.
  6. Gleichzeitigkeit: eine unangemessene Aussage über die Reihenfolge, in der die verschiedenen Threads Operationen durchführen, kann ebenfalls eine Ursache für Inkonsistenzen sein

Flakiness in Tests verhindern

Wenn es einen Grund dafür gibt, dass ein Test fehlschlägt, obwohl er eigentlich erfolgreich sein sollte, lässt sich die sogenannte „Flakiness“ vermeiden. Hier finden Sie eine Reihe von Tipps und Punkten, die Sie beachten sollten, um „Flakiness“ von vornherein zu begrenzen, sowie Hinweise zum Umgang damit:

  • Durch die Feinabstimmung der Ausführungsreihenfolge lassen sich Parallelität und Abhängigkeiten verringern (atomare Tests). Durch die sorgfältige Reihenfolge der Testaktionen kann man die Wahrscheinlichkeit von Bedingungen oder Konflikten steuern, die zu unvorhersehbaren Ergebnissen führen können.
  • Aufbau einer stabilen und konsistenten Testumgebung durch die sichergestellt wird, dass externe Faktoren (wie Systemressourcen oder Netzwerkkonnektivität) kontrolliert, Abhängigkeiten verwaltet und der Zugriff auf für die Testdurchführung wesentliche Ressourcen garantiert wird
  • Nehmen Sie sich die Zeit, vor der Implementierung über die Teststrategie nachzudenken, denn wie bereits erwähnt, sind schlecht geschriebene Tests, eine schlechte Teststrategie und ein schlechtes Testdesign die Hauptursachen für die Flakiness von Tests. Es ist wichtig, mit einem fundierten Verständnis des SUT zu beginnen und danach Namenskonventionen sowie “Best Practices” für das Schreiben von Tests einzuführen
  • Fördern Sie die Feedback-Kultur: Führen Sie eine kontinuierliche Überwachung der Testergebnisse ein und holen Sie regelmäßig Feedback vom QA-Team ein: Ermutigen Sie die Tester, alle potenziell auftretende Schwachstellen zu melden und zu protokollieren. Überprüfen Sie diese regelmäßig und ergreifen Sie proaktive Maßnahmen zu deren Beseitigung
  • Verwenden Sie geeignete Synchronisationstechniken im Testcode oder innerhalb des Testwerkzeugs, um eine angemessene Synchronisation zwischen dem SUT und der Testphase sicherzustellen. Verwenden Sie explizite Wartezeiten, Wartebedingungen oder Synchronisationsmethoden
  • Optimierung des Testzeitplans durch Planung der Testläufe unter Berücksichtigung von Faktoren wie Netzüberlastung, Systemlast usw., die die Zuverlässigkeit der Tests beeinflussen können 
  • Einführung geeigneter Verfahren zur Verwaltung von Testdaten, um Zuverlässigkeit und Konsistenz zu gewährleisten und die Verwendung veränderlicher oder gemeinsam genutzter Testdaten zu vermeiden, die zu flakiness führen können
  • Isolierung der Tests durch Reduzierung der Abhängigkeiten und Verringerung der Wahrscheinlichkeit von Interferenzen zwischen den Tests

Wichtigste Erkenntnisse

  • Tappen Sie NICHT in die Falle, sich an ohne ersichtlichen Grund fehlschlagende Tests zu gewöhnen!
  • Lernen Sie aus Fehlern: Engineering ist eine Hypothese; ein Fehler sollte immer ein Ausgangspunkt für eine verbesserte Hypothese sein. 
  • Verstecken Sie Fehler nicht, sondern untersuchen und verbessern Sie diese
  • In fast allen Fällen hat die so genannte „flakiness“ eine konkrete Ursache: Sie müssen die entsprechenden Fehler untersuchen, deren Ursache finden und schließlich das ursprüngliche Problem lösen!
  • Wenn Sie die Ursache des Fehlers nicht finden können, ist die beste Option, weitere Hinweise und Anhaltspunkte zur möglichen Ursache des Fehlers zu sammeln
  • Fehlerhafte Tests sind eine Chance, das SUT und Ihr Testframework besser zu verstehen!
Unzuverlässige automatisierte UI-Tests – Bild 3

Referenzen

​​Graham, Dorothy. 2024. „Test Automation Community Survey“. AutomationSTAR. https://automation.eurostarsoftwaretesting.com/wp-content/uploads/2024/10/AS-Test-Automation-Community-Survey-Results-Rev02.pdf?utm_source=testguild&utm_campaign=promo&utm_medium=post.