Unit-Testing mit ChatGPT

Ein wichtiger Bestandteil der Softwareentwicklung sind Unit-Tests. Sie dienen dazu, den Code einer Anwendung auf Fehler zu überprüfen und sicherzustellen, dass dieser wie erwartet funktioniert. Die Schwierigkeit im Schreiben sinnvoller Tests liegt im Finden von geeigneten Testfällen und Randbedingungen, die es zu prüfen gilt. Genau hier soll ChatGTP dich als Entwickler*in unterstützen.

ChatGPT bietet eine gute Unterstützung bei der Erstellung von Unit-Tests. Dabei wird dir das Schreiben der Klassen und Methoden für die Testfälle abgenommen. Deine Arbeit wird dadurch verkürzt und du musst „nur noch“ den generierten Code reviewen und freigeben. Die Schwierigkeit dabei ist, wie meistens beim Erstellen von Unit-Tests, das Abgrenzen der getesteten Methoden/Klassen. Bei zu komplexen Methoden, hat ChatGPT Probleme die nötigen Testfälle zu generieren. Bei einfacherem Code ist dies recht gut und nützlich.

Kann dich ChatGPT wirklich beim Schreiben von Unit-Tests unterstützen? Die Praxis soll es zeigen.

Dazu soll die selbst geschriebene Java Multiplikations-Funktion mittels Unit-Testing auf ihre Richtigkeit geprüft werden.

Programmcode für Multiplikation

Ohne lange nachzugrübeln, denkst du vielleicht an Tests dieser Art:

  • Produkt aus positiven Zahlen (z.B.: 11 * 10 = 110)
  • Produkt mit Nullfaktor(-en): (z.B.: 0 * 5 = 0)
  • Produkt mit Minusfaktor(-en): (z.B.: 5 * -6 = -30)

Kommen dir keine weiteren Testfälle mehr in den Sinn? Frag doch mal ChatGPT um Hilfe.

Wie in einem herkömmlichen Chat mit einem Menschen, kann auch mit ChatGPT eine Konversation geführt werden. Mit der untenstehenden Eingabe an ChatGPT kann ein sinnvoller Unit-Test erzeugt werden:

Eingabe Aufgabe für ChatGPT

ChatGPT liefert als Antwort den Code mit folgenden Testfällen:

Generierter Test-Code von ChatGPT (vereinfacht)
  • Testfall Zeile 14: Produkt aus positiven Faktoren mit erwartetem Resultat 120
    2 * 3 * 4 * 5 = 120
  • Testfall Zeile 17: Produkt aus positiven Faktoren mit einem 0 Faktor
    0 * 1 * 2 * 3 = 0
  • Testfall Zeile 20: Produkt aus negativem Faktor und positivem Faktor mit erwartetem Resultat -6
    -2 * 3 = -6
  • Testfall Zeile 23: Produkt ohne Faktoren mit erwartetem Resultat 0
  • Testfall Zeile 27: Produkt aus der höchsten Ganzzahl (Integer.MAX_VALUE) und 2.
    2’147’483’647 * 2 => ArtithmeticException erwartet

Ist es nicht erstaunlich, wie viele Testfälle ChatGPT in kürzester Zeit gefunden hat? Verblüffend ist auch, wie gut die Frage und der Code verstanden wurde. Der von ChatGPT generierte Test findet bei der Ausführung des letzten Testfalls (Zeile 27-28) sogar noch einen unentdeckten Fehler im Programm:

Ausgabe der Testfallausführung

Diese Rechnung führt zu einem invaliden Resultat, weil ein Overflow durch die Wertebereichüberschreitung auftritt. Das Programm hätte somit mit einem falschen Resultat weitergearbeitet. Dies könnte in einem produktiven System fatale Folgen haben.

Fazit

Wozu eignet sich ChatGPT in Bezug auf Unit-Testing?

  • Schnelle Generierung einer Vielzahl von Testfällen
  • Finden von Spezialfällen (Edge-Cases)
  • Gängige Programmiersprachen werden gut verstanden. Es kann auf eine Vielzahl von Themen antworten, indem es auf eine grosse Menge von Textdaten zurückgreifen kann.

Wo sind die Schwächen?

  • Antworten von ChatGPT sind nicht immer korrekt und müssen immer überprüft werden
  • Teilweise bestehen Schwierigkeiten, die Bedeutung von Wörtern und Sätzen in bestimmten Kontexten zu verstehen
  • Das Trainieren und Betreiben von ChatGPT braucht enorm viel Energie und verursacht hohe Kosten
  • Es kann sich nicht an Umgebungsbedingungen anpassen, die von der Situation abweichen, für die es trainiert wurde.

ChatGPT ist ein grosses Sprachmodell, um natürliche Sprache zu verstehen und zu generieren. Neben den häufigen Anwendungsgebieten wie, Chatbots, automatischen Textgeneratoren und Sprach-zu-Text-Systeme eignet sich ChatGPT auch sehr gut für Unit-Testing.

Beitrag teilen

Severin Bind, Matthias Schneider und Marcel Wismer

Severin Bind, Matthias Schneider und Marcel Wismer sind Software Engineer bei der BSI Business Systems Integration AG und bloggen aus dem Unterricht des CAS Modern Software Engineering & Development.

Alle Beiträge ansehen von Severin Bind, Matthias Schneider und Marcel Wismer →

Schreibe einen Kommentar