Unit Tests mit AI – Machinet Testfallerstellung
Werden Tester bald durch KIs ersetzt? Spoiler: Nein
In diesem Blogbeitrag möchte ich auf ein paar Grundlagen der KI eingehen und prüfen, ob sich Tests damit automatisch erstellen lassen. Ist die Maschine in der Lage Software automatisch selbst zu testen und Fehler zu erkennen? Welche Probleme treten dabei auf? Dies teste ich mit dem Machinet Plugin für Intellij.
AI – Nicht mehr wegzudenken aus dem Alltag?
Spätestens durch ChatGPT ist das Thema künstliche Intelligenz nicht mehr wegzudenken. Auch davor gab es zahlreiche Projekte, Beispielsweise Google Alpha GO, die 2017 den chinesischen GO Master besiegte. Auch mit unseren Smartphones führen wir künstliche Assistenten wie Siri, Alexa und Co täglich mit uns. Dennoch sind die KIs trotz ihrer Lernfähigkeit noch immer stark eingegrenzt.
AI Kategorisierung und derzeitiger Stand
Künstliche Intelligenz lässt sich in drei Kategorien eingruppieren:
Narrow – KI Tut genau eine Sache und diese sehr, sehr gut, Beispielsweise Wettervorhersage
General – KI lernt dazu, kann Probleme lösen
Super Intelligence – KI verarbeitet Informationen um ein vielfaches schneller als wir Menschen, Kann Zusammenhänge schneller erkennen und ist damit deutlich schlauer als wir Menschen.
Stand heute liegt die KI etwas über Narrow, weit weg von Super Intelligence.
Selbstlernende AIs und die damit verbundenen Schwachstellen
Wie bereits erwähnt gewann 2017 eine KI gegen den damaligen GO Champion und zwar sehr eindeutig. Dennoch haben KI System ihre Schwachstellen die sich von jedem ausnutzen lassen. Anfang 2023 erschien ein Artikel in der Financial Times wie besagte Schwachstelle ausgenutzt wurde und somit ein Amateuer über die Maschine gewann.
Einfach ausgedrückt wissen KIs nichts über den eigentlichen Kontext ihrer Aufgabe, und genau dieses Problem spiegelt sich in zahlreichen Anwendungsfällen wieder, aber dazu später mehr.
Wie kann also die AI beim Testen genutzt werden?
Codegenerierung ist nicht neu und modellgetriebene Softwartests existieren schon länger, jedoch mussten hier immer bestimmte Vorraussetzungen erfüllt sein. Durch KI soll es nun möglich sein anhand von vorhandenem Code die passenden Tests automatisch zu erstellen. Eines dieser Plugins ist Maschinet.
Installation von Maschinet
Die Installation erfolgt komfortable und einfach über den IntelliJ Marketplace, mit wenigen Klicks ist das Plugin eingebunden. Anschließend ist noch eine Registrierung mit Emailadresse nötig. Die Basisversion ist konstenlos und lässt einen 10 Testfälle im Monat generieren.
Funktion und Ablauf von Maschinet
Die Bedienung des Plugins ist recht simpel und einfach. Über die blauen Pfeile am Rand lassen sich Testfälle zu den vorhandenen Funktionen generieren. Dabei erzeugt die KI entsprechende Unittests und entscheidet dabei auch, ob Funktionen gemockt werden müssen oder sogar private Methoden über Reflection aufruft.
In der konkreten Class geht es darum, den Stand der Sonne zu berechnen, dabei kommen verschiedene mathematische Formeln zum Einsatz. Die meisten Funktionen sind dabei entsprechend private gesetzt.
Maschinet versucht diese privaten Methoden entsprechend über Reflection aufzurufen.
Über den blauen Kreis lassen sich bei Veränderungen des Ursprungscodes auch Anpassungen am Testfall direkt generieren.
Dependencies werden vom Tool nicht automatisch gesetzt und müssen manuell hinzugefügt werden. Bei meinem aktuellen Test musste ich die zugehörigen Mavenanpassungen selbst durchführen.
Erste Ergebnisse
Allgemein liefert die KI einige Testfälle und augenscheinlich auch vollständig. Der Code ist recht übersichtlich und gut lesbar. Rein technisch gesehen also korrekt, allerdings spielt hier nun der Kontext und die Fachlichkeit die entscheidende Rolle. Genau dieser Punkt spiegelt das eingangs erwähnte Know How wieder und begründet auch, warum Tester in Zukunft nicht ersetzt werden können. Betrachtet man nur den obigen Testfall calcSunYReturnsDifferentValuesForDifferentLocations, so fällt direkt auf, dass zwei exakt gleiche Variablen miteinander verglichen werden. Es wird zweimal die gleiche Methode aufgerufen, die logischerweise das gleiche Ergebnis liefern wird. Ein Testfall der also wenig Mehrwert bringt.
Tesfall 2
Betrachten wir also einen weiteren Fall. Bei dem wird der Stand der Sonne getestet und sollte zwischen bestimmten Werten liegen. Augenscheinlich sieht dieser Test auch korrekt aus, allerdings spielt hier nun wieder der Faktor Kontext die ausschlaggebende Rolle. Geht die Sonne nämlich bei den angegebenen Koordinaten unter und steht somit auf der anderen Seite der Erde, wird der Azimuth im negativen angegeben. Somit wird der Test beim ausführen zur falschen Uhrzeit fehlschlagen. Um dies korrekt zu testen, müsste die Methode gemockt werden und eine Uhrzeit sowie Datum mitgegeben werden.
Fazit
Wird die KI uns Tester ersetzten? Ganz klar nein. Ohne das Wissen des Kontextes und konkreter Erfahrungswerte sind die Testfälle unvollständig. Bei dem bisherigen Code müssen immer mindestens die Assert-Statements überarbeitet oder ganze Teile in den Methoden ergänzt werden. Einige Testflälle sind auch schlich unsinnig. Zusammengefasst sehe ich Chancen bei der KI ein Grundgerüst zu erstellen und geg. auf Tests hinzuweisen, die vielleicht noch nicht existieren. Ein rein KI gesteuerter Test halte ich zum aktuellen Stand noch für weit entfernt. Dazu müssten die System noch mehr Erfahrungen mitbringen, die vielleicht durch neuronale Netze erfolgen könnten.