Unzuverlässige Tests sind ein Problem
Ich bin durchaus ein Freund von Tests in der Softwareentwicklung, auch wenn ich sie ehrlicherweise zu selten nutze. Für mich persönlich ist wichtig wie und wofür man Tests einsetzt, denn einige Arten sind meiner Meinung nach nicht unbedingt das Gelbe vom Ei. Doch über das generelle für und wieder von verschiedenen Testarten möchte ich an dieser Stelle nicht sprechen, denn dafür bräuchte man eine komplette News-Sammlungen und würde vermutlich trotzdem die Hälfte nicht ausreichend betrachten.
Heute möchte ich auf einen Punkt eingehen der alle Arten von Tests mitunter extrem weniger relevant machen kann. Das Thema ist die Unzuverlässigkeit von Testergebnissen. Also Tests die manchmal funktionieren und dann doch wieder nicht und insofern bei der Auswertung unklare Ergebnisse generieren. Diese False Positives und False Negatives sorgen im Laufe der Zeit dafür, dass die Ergebnisse immer weniger ernst genommen werden und somit das Risiko besteht valide Probleme nicht zu erkennen.
Das Risiko derartiger Probleme ist sehr unterschiedlich und stark abhängig von der Art der Tests. Bei Unit Tests dürften solche Probleme eher selten auftreten, da man hier ja in sich geschlossene und lokale Funktionen testen soll. So umfangreicher der Test Flow, so problematischer wird das Ganze allerdings. Auch die Menge an externen Tools und involvierter Software und Hardware beeinflusst die Häufigkeit dieser Problematik maßgeblich. Wenn also Unit Tests eher selten Probleme in diesem Bereich haben, sind End to End Tests oder UI Tests eher anfällig für selbige.
Ich selber beschäftige mich aktuell sowohl privat, wie auch im professionellen Umfeld mit UI Tests und merke hier leider das stabile Tests, wie ich sie zuvor kannte, nicht immer selbstverständlich sind. Die UI Tests werden bei mir auf verschiedenen Android Geräten, bzw. im Emulator ausgeführt, wodurch es natürlich unterschiedliche Hardware und auch Software Versionen gibt. Darauf setzen dann verschiedene Tools aus dem Android SDK auf und dann eine Reihe von weiteren Komponenten, um die eigentlichen Tests umzusetzen. Hier hat man sowohl Flutter Frameworks, wie auch native Android Frameworks oder komplett externe Tools, z.B. auf Javascript Basis, zur Verfügung, um seine Ziele zu erreichen. Alle haben ihr positiven und negativen Aspekte, aber vor allem im Kontext der externen Frameworks bemerke ich eine durchaus große Menge an Instabilitäten.
Aufgrund der Komplexität der verschiedenen interagierenden Komponenten kann es einfach dazu kommen, dass Tests nicht stabil laufen können. In diesem Fall sollte man überdenken ob die spezifischen Tests für eine derartige Testart geeignet sind. Falls der gesamte Ansatz instabil ist, sollte man das Test Framework überdenken, denn selbiges muss einfach grundlegend stabil sein, um später zuverlässige Ergebnisse zu liefern. Die initiale Auswahl des Frameworks spielt also eine sehr große Rolle und auch die Einordnung eines zu testenden Features, ob selbiges überhaupt via UI Tests getestet werden sollte. Ebenfalls wichtig ist die korrekte Einstellung des Frameworks. Oft gibt es die Möglichkeit etwaige Wartezeiten, bis z.B. ein UI Element als nicht gefunden markiert wird, einzustellen. Auch die Anzahl an erneuten Versuchen für einen fehlerhaften Test kann oft definiert werden, aber von derartigen Dingen bin ich kein Fan. Als Softwareentwickler vertraue ich nur deterministischen Abläufen und Wahrscheinlichkeiten sollten eher keine große Rolle spielen.
Ich möchte hier weder konkrete Framework Empfehlungen geben, noch möchte ich mich im allgemeinen für oder gegen UI Tests aussprechen. Es hängt einfach viel zu sehr vom Projekt, der Plattform und diversen weiteren Faktoren ab, ob UI Tests im jeweiligen Kontext sinnvoll sind. Was ich aber sagen möchte ist, dass das Evaluieren des Test Frameworks extrem wichtig ist und das es absolut in Ordnung sein sollte Funktionen nicht zwangsweise auf eine bestimmte Art zu testen. Im Bereich der Tests gilt wie überall, nutzt die passenden Tools für die passenden Aufgaben. Natürlich ist es gut wenn man schon Erfahrungen in etwas hat und deswegen auf eine Software setzt. Auch völlig natürlich ist der Wunsch alles mit einem Tool erledigen zu wollen. Manchmal ist dies aber einfach nicht sinnvoll möglich und statt sich zu verrennen, sollte man lieber verschiedenen passende Ansätze und Lösungen für unterschiedliche Probleme nutzen. Gerade im professionellen Umfeld hat man hier leider oft nicht die Freiheit die man gerne hätte, trotz dessen kann ich aber nur dazu raten das Ganze anzusprechen und es zumindest zu versuchen. Denn an Ende ist niemand mit unzuverlässigen Lösungen zufrieden, egal ob bei Tests oder dem finalen Produkt.