ChatGPT und KI für die Testautomatisierung: KI im Softwaretest

🕒 Lesedauer: 5 Minuten

Als OpenAI sein neues Large Language Model “ChatGPT” veröffentlichte entstand ein regelrechter Hype um das Thema KI. Hatte OpenAI die Grundlagen für eine General Purpose AI gelegt? Kann AI ganze Berufsgruppen überflüssig machen? Wir wollten es wissen und haben versucht, ChatGPT in useren Arbeitsalltag als Test Automation Engineers zu integrieren und haben hierbei interessante Erfahrungen gemacht.

Programmieren mit ChatGPT? Unser Experiment mit ChatGPT in der Testautomatisierung

Als Test Automation Engineers interessierte uns vor allem, ob uns ChatGPT dabei helfen kann, einfache Aufgaben wie das Schreiben von Testcode zu übernehmen. Eine langwierige und nicht unbedingt spannende Aufgabe in der Testautomatisierung einer Applikation besteht zunächst darin, das Softwaregrundgerüst für die Automatisierung zu erstellen. Hierzu muss Code geschrieben werden, welcher mit den UI-Elementen wie etwa Buttons, Formulare, etc. einer Webapplikation interagieren kann. Hier sahen wir das größte Potential einen Testprozess mittels einer KI zu beschleunigen, da diese Aufgabe hauptsächlich Fließarbeit darstellt und der Lösungsweg meist eindeutig ist. Wir wollten nun wissen, ob ChatGPT für gegebenen HTML-Code Java-Code zum ansteuern der HTML-Element schreiben kann und wie zuverlässig die Ergebnisse sind.

→ Ihre Softwaretests sind teuer und dauern zu lange? Wir beraten Sie zur Testautomatisierung in Ihrem Projekt. Melden Sie sich jetzt für ein kostenloses Erstgespräch.

Der Versuchsaufbau

Für unser Experiment entwickelten wir eine kleine Webanwendung mittels des Python-Frameworks Streamlit, in die ein Nutzer HTML-Code in ein Formular einfügen und anschließend sich Selenium-Code generieren lassen konnte. Unser Tool unterstützt hierbei die Sprachen Java, Python und JavaScript. Serverseitig baut unsere Applikation anschließend einen Prompt zusammen, d.h. einen natürlichsprachigen Text, welcher anschließend an die API von ChatGPT geschickt wird. Da der Chatbot neben dem generierten Code meist auch noch eine Erklärung des generierten Skripts sendet, mussten wir den Code noch aus der Antwort von ChatGPT extrahieren. Dies stellte sich jedoch als einfach heraus, da ChatGPT Code üblicherweise mit einer speziellen Annotation versieht, sodass dieser mit einem einfachen regulären Ausdruck extrahiert werden kann.

Die Prompts für die Testautomatisierung

Eine Herausforderung bei der Bedienung eines Chatbots ist die möglichst präzise Formulierung der Aufgabe, die durch einen Chatbot erledigt werden soll. Zunächst experimentierten wir mittels der Weboberfläche von ChatGPT, um möglichst gute Prompts für unsere Probleme zu generieren. So fiel uns beispielsweise schnell auf, dass ChatGPT keine Kommentare im Code erzeugt, sofern es nicht explizit dazu aufgefordert wird. Auch die Art der Kommentierung des Codes mussten wir in unseren Prompts beschreiben, da es beispielsweise für Python mehrere Kommentarstile wie etwa Google Style oder etwa NumpyDoc gibt. Auch generierte ChatGPT einige Male einfache, einzeilige Kommentare statt ausführlichen Docstrings für Funktionen.

Nachdem wir aus unseren Experimenten mit ChatGPT gute Prompts erzeugt hatten bauten wir mittels Python eine Funktion, welche aus einem Template, in dem einige Platzhalter für Variablen eingebaut wurden, Prompts generieren konnte. Da es im Bereich der UI-Automatisierung Konzepte wie etwa Tabellen, Formulare, etc. gibt, welche in nahezu allen Anwendungen zu finden sind, bauten wir für jedes dieser Konzepte einen spezifischen Prompt. So konnten die Nutzer unserer Webapplikation beispielsweise über die Webanwendung auswählen, welches Konzept der übergebene HTML-Code repräsentiert. Unsere Prompts enthielten spezifische Anforderungen zu diesen Konzepten, wie etwa dass für Formulare für jedes Textfeld eine Methode zum Einfügen neuer und zum Auslesen der aktuellen Werte generiert werden sollte. Für Tabellen wollten wir hingegen Methoden generiert bekommen, welche die Anzahl der Spalten und der Zeilen der Tabelle ausgeben sowie die Inhalte von spezifischen Zellen lesen konnten.

Image
Chat
Bild: ChatGPT in der Testautomatisierung [Quelle: Kreiert mit ChatGPT mit dem Prompt “Create a schematic picture of ChatGPT doing test automation”]

 

Die Ergebnisse - Programmieren mit ChatGPT in der Testautomatisierung

Nach der Implementierung des Prototypen begannen wir unser Tool in unseren Arbeitsalltag zu integrieren. Zunächst schien uns ChatGPT sehr viel Arbeit abzunehmen, jedoch merkten wir bald, dass der generierte Code immer noch nachgebessert werden musste. Vor allem folgende Punkte fielen uns bei der Codegenerierung auf:

1. Die randomisierten Antworten

Erhält ein Large Language Model wie ChatGPT mehrfach die gleiche identische Anweisung, so wird das Tool trotzdem jedes mal eine andere Antwort generieren. Dies ist jedoch bei der Codegenerierung ein Problem, da die Lösungen für unser spezifisches Problem meist eindeutig sind und es wenig Interpretationsspielraum bei der Generierung des Codes gibt. Mal generierte ChatGPT Code, bei dem die Selektoren für die UI-Elemente als Strings in den Klassenattributen gespeichert wurden, mal wurden diese direkt in den Methoden hart gecoded, was jedoch keinem guten Stil entspricht. Der generierte Code war in den allermeisten Fällen ausführbar, wesentliche Programmierfehler konnten wir nicht entdecken. Jedoch stellte sich als Problem heraus, dass ChatGPT keinem einheitlichen Codingschema folgt, wie beispielsweise bei den Selektoren. In größeren Projekten ist dies jedoch wichtig, da der Code einem einheitlichen Schema folgt, da sonst die Lesbarkeit und Wartbarkeit darunter leidet. Wir konnten dieses Problem teilweise mit präziseren Prompts lösen, jedoch gelang dies nicht immer. Wobei wir beim nächsten Problem angekommnen sind.

2. Ignorierte Anweisungen

Teilweise wurden Anweisungen unserer Prompts von ChatGPT einfach ignoriert. In unseren Prompts waren beispielsweise immer Informationen darüber enthalten, wie wir uns die Kommentierung des Codes vorstellten, nämlich als ausführliche DocStrings, die den offiziellen Designrichtlinien folgten, trotzdem generierte uns ChatGPT teilweise unkommentierten oder nur spärlich kommentierten Code. Auch wurden andere Anweisungen wie etwa das Generieren von Methoden für alle Eingabefelder eines Formulars ignoriert. Stattdessen generierte ChatGPT Methoden, mit denen sich die Werte eines beliebigen Testfelds auslesen ließen, jedoch musste hierfür ein Selektor explizit übergeben werden. Ein Verdacht unsererseits ist hier, dass die Antwortlänge von ChatGPT begrenzt ist und dass ChatGPT daher versucht, möglichst kurze Antworten zu liefern. Das Problem der ignorierten Anweisungen trat gehäuft bei längeren und komplexeren Eingaben auf. Das führt uns zum Problem der begrenzten Kontextlänge.

3. Die beschränkte Kontextlänge

Ein Chatbot wie ChatGPT kann nicht Eingaben unbegrenzter Länge umgehen. Jedes Large Language Model besitzt eine sogenannte Kontextlänge, die beschreibt, wie viele zurückliegende Zeichen der Eingabesequenz für das aktuelle Zeichen derselben beachtet werden können. Wird eine Anfrage zu lang muss das LLM teile der Eingabe unberücksichtigt lassen. Gleiches gilt auch für die Ausgabe von LLMs. Besitzt ein LLM beispielsweise eine Kontextlänge von 4000 Zeichen, muss aber eine Ausgabe von 5000 Zeichen generieren, dann kann es bei der Generierung der letzten 1000 Zeichen nicht mehr berücksichtigen, was es bei der Generierung der ersten 100 Zeichen getan hat. Dieser Effekt hat vor allem dann Auswirkungen auf die Ergebnisse der Codegenerierung, wenn die Eingabe sehr viel HTML-Code enthält und die Prompts zusätzlich sehr viele Anweisungen enthalten. In diesen Fällen ignoriert ChatGPT teilweise die Anforderungen an den generierten Code. Die Lösung besteht hierbei darin, den HTML-Code in kleinere Fragmente zu zerlegen oder den Prompt in mehrere Anweisungen aufzuteilen.

4. GPT4 ist wesentlich besser als GPT 3.5

In unseren Experimenten setzten wir zunächst auf die Version 3.5 von ChatGPT. Diese bietet jedoch gegenüber der Version 4 den Nachteil, dass die Kontextlänge des Modells auf 4000 Zeichen beschränkt ist. Version 4 hingegen besitzt eine Kontextlänge von 16000 Zeichen. Da uns in unseren Experimenten aufgefallen war, dass sich ChatGPT 3.5 mit längeren Eingaben schwerttat, probierten wir nun dieselben Prompts mit Version 4 aus. Die Ergebnisse waren um einiges besser als die Ergebnisse der Version 3.5. Uns fiel auf, dass ChatGPT 4 teilweise bis zu 400 Zeilen Code für komplexere Anfragen generierte, wohingegen ChatGPT 3.5 meistens weniger als 200 Zeilen Code ausgab. Dies erhöhte auch die Qualität des Codes deutlich.

 

Fazit - Programmieren mit ChatGPT in der Testautomatisierung

ChatGPT hat das Potential, die Arbeit von Test Automation Engineers erheblich zu vereinfachen. Das größte Problem um dieses Ziel zu erreichen ist die hohe Varianz in dem durch ChatGPT generierten Code. Auch die geringe Kontextlänge aktueller Modelle wie etwa GPT-3 ist ein Problem bei der Generierung von Code für die Testautomatisierung, da der HTML-Code die maximale Kontextlänge der Modelle deutlich überschreitet. Dieses Problem wird jedoch mit der Weiterentwicklung der Modelle zukünftig behoben worden sein.

 

Veröffentlicht am 02.Juli 2024

Aktualisiert am 15.Juli 2024

Tilo Flasche

Test Automation Engineer

Ich studiere Informatik an der Goethe Universität Frankfurt und schreibe aktuell meine Masterarbeit bei Qytera über das Thema Featureextraktion aus Bildern mit Neuronalen Netzen. Den Schwerpunkt meines Masterstudiums legte ich u.a. auf die Themen Maschinelles Lernen und Computer Vision. Bei Qytera bin ich seit Oktober 2020 als Werkstudent tätig und habe u.a. das QTAF-Testing-Framework mitentwickelt. Zuvor sammelte ich als Werkstudent und freiberuflicher Entwickler bereits Erfahrungen in der Softwareentwicklung.

Finden Sie weitere interessante Artikel zum Thema: