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.

 

Interne Schulungen in Cucumber & Selenium


In geschützter Umgebung lernt und festigt Ihr Team individuelles Wissen für Ihre aktuellen Anforderungen. Damit Ihr Projekt erfolgreich und wie geplant abgeschlossen wird.

Das könnte Sie auch interessieren

Fünf Tipps für besseren Testcode

Fünf Tipps für besseren Testcode Good Practices In diesem Blogpost zeige ich fünf Good Practices auf, um den eigenen Testcode zu verbessern. Aber wieso nur "Good...

Devops mit Cucumber, Jira und Xray

Devops mit Cucumber, Jira und Xray "Hat auf meiner Maschine funktioniert, ist jetzt Operating Problem“ Diese oder vergleichbare Aussagen sind nicht neu und...

API Testing mit Java und WireMock

API Testing mit Java und WireMock Motivation Ein bekanntes Problem: Öffentliche APIs werden abgefragt und liefern Daten in Form von JSON oder anderen Formaten zurück....

Datenbanktests mit DB Unit

Datenbanktests mit DB Unit Wie lassen sich eigentlich Datenbanken testen? Während meiner täglichen Arbeit spielen auch Testdaten regelmäßig eine Rolle. Diese müssen...

Apple Kalender auslesen mit Java

Apple Kalender mit Java auslesen Motivation Apple Kalender-Einträge sollen synchron auf meinem Java-Dashboard sowie auf sämtlichen anderen Geräten im Haus gepflegt...

Testautomatisierung mit Selenium Schulung

Testautomatisierung mit Selenium Schulung Schulungsbeschreibung Die Selenium Schulung vermittelt Basiswissen und die wichtigsten Aspekte zur Testautomatisierung. Nach...

Sealed Classes mit Java JDK 17

Sealed Classes mit Java JDK 17 Was sind Sealed Classes? Mit dem kommenden Java Release 17 werden sogenannte Sealed Classes eingeführt. Diese waren zuvor bereits seit...

Licht steuern mit Java und Philips Hue

Licht steuern mit Java und Philips Hue Motivation Für meinen selbstprogrammierten Sprachassistenten wollte ich ein Modul für die Lichtsteuerung entwickeln. Ziel war es,...

ReSpeaker 4 LEDs mit Pi4J steuern

ReSpeaker 4 LEDs mit Pi4J steuern Motivation Für ReSpeaker im allgemeinen gibt es bereits zahlreiche Bibliotheken, auch einige die LEDs über die GPIO Pins ansteuern....