In diesem Beitrag wird aufgezeigt, welchen Nutzen der Einsatz von künstlicher Intelligenz, insbesondere von GitHub Copilot, im Unit Testing hat. Auch werden die Gefahren und Herausforderungen der Nutzung im Testing behandelt.
GitHub Copilot
Github Copilot ist ein KI-Tool, welches sich in diverser Entwicklungsumgebung einbinden lässt und Code-Vorschläge in Echtzeit bietet. Trainiert auf öffentlichen GitHub Repositories und weiteren öffentlichen Quellcode, analysiert das Tool vorhandenen Code und schlägt automatisch mögliche Lösungen vor. Github Copilot unterstützt verschiedene Programmiersprachen, unter anderem Python, Java, JavaScript, TypeScript, Ruby und Go.
Anwendung im Testing
Um GitHub Copilot im Testing anzuwenden, benötigten wir zuerst eine Funktion, welche getestet werden soll. Hierfür erstellen wir eine Klasse PalindromeChecker, welche eine Funktion isPalindrome() beinhaltet. Diese Funktion testet einen String darauf, ob es ein Palindrom ist. Je nach dem, ist der Rückgabewert true oder false. Zudem wirft er eine Exception, wenn der Eingabewert null ist. Auch werden beim String alle Leerzeichen entfernt und alles kleingeschrieben, damit die Überprüfung auch klappt.
In der erstellten Testklasse geben wir GitHub Copilot mit dem Kommentar «Write unit tests for the PalindromeChecker class» die Aufgabe verschiedene Unit Tests zu erstellen. Dabei wurde bewusst die Aufforderung in der Sprache Englisch gegeben, da das Modell in dieser Sprache besser funktioniert. Dabei wurden folgende Testfälle generiert.
GitHub Copilot hat verschiedene Unit Tests generiert und damit möglichst viele verschiedenen Fälle abgedeckt. So wird folgendes getestet:
- Wenn der Input ein Palindrom ist.
- Wenn der Input kein Palindrom ist.
- Wenn der Input ein leerer String ist.
- Wenn der Input null ist.
- Wenn der Input einen String mit Leerzeichen hat.
Auch die Ausführung der Tests sind erfolgreich und laufen durch. Zudem wird mit diesen Tests jede Codezeile durch einen entsprechenden Testfall abgedeckt.
Nutzen
GitHub Copilot kann helfen schnell Testfälle ausfindig zu machen und daraus funktionierende Unit Tests zu generieren. Durch die Analyse des bestehenden Codes, werden auch Randfälle erkannt und so die Testabdeckung verbessert. Der generierte Code ist sehr schmal gehalten und gut verständlich.
Herausforderungen
In diesem Fall wurde eine sehr einfache Funktion verwendet. Bei komplexeren Funktionen wird GitHub Copilot nicht jede Zeile an Code abdecken können. Vor allem wird das Tool dann auch Schwierigkeiten haben, alle Spezialfälle zu erkennen. Zudem ist auch nicht auszuschliessen, dass fehlerhafte oder ungenaue Testfälle generiert werden.
Fazit
Mit dem Einsatz von GitHub Copilot wird das Unit Testing deutlich effizienter. Durch die nahtlose Integration in der Entwicklungsumgebung kann der vorgeschlagene Code in Echtzeit übernommen werden. So muss kein Chat mit einer künstlichen Intelligenz geführt werden, in welchen alles rein- und rauskopiert wird.
Jedoch sehe ich GitHub Copilot eher als Unterstützungstool und nicht als kompletten Ersatz für einen Testentwickler. So sollte jeder generierte Testfall nochmals gründlich überprüft und gegebenenfalls angepasst werden. Nur so kann sichergestellt werden, dass die Tests auch den Anforderungen und Absichten des Codes entsprechen.
Was auch nicht ausser Acht gelassen werden darf, ist die stetige Verbindung zu den GitHub Copilot Servern. Bei privaten Projekten ist dies sicherlich weniger das Problem als für Unternehmen. Für das Trainieren des Datenmodells werden alle Codestücke an die Server gesendet, was man als Unternehmen grösstenteils verhindern möchte. Aus diesem Grund sollte vor jedem Einsatz analysiert werden, ob man den GitHub Copilot wirklich einsetzen möchte.
Zum Abschluss muss auch festgehalten werden, dass das Beispiel mit Java umgesetzt wurde. Da Java eine weit verbreitete Programmiersprache ist, hat der GitHub Copilot keine Probleme, Unit Tests zu generieren. Bei weniger verbreitenden Programmiersprachen wird das Tool an seine Grenzen stossen und im schlimmsten Fall keinen funktionierenden Code generieren. Aber auch in diesem Fall kann das Tool unterstützen, indem es mögliche Testfälle und vor allem Spezialfälle erkennt und vorschlagen kann.