Nutzung von LLMs für verbesserte Test-Orakel-Generierung
Diese Studie untersucht die Rolle von LLMs bei der Erstellung effektiver Testorakel für Software.
― 7 min Lesedauer
Inhaltsverzeichnis
Softwaretests sind wichtig, um Bugs in Programmen zu finden. Ein zentraler Teil dieses Prozesses ist das Test-Orakel, das hilft zu bestimmen, ob die Software richtig funktioniert. Es gibt zwar automatische Methoden zur Erstellung dieser Test-Orakel, aber viele davon liefern zu viele falsche Ergebnisse. Grosse Sprachmodelle (LLMs) haben in verschiedenen Softwareaufgaben wie Code schreiben, Testfälle erstellen und Bugs beheben vielversprechende Ergebnisse gezeigt, aber es wurde bisher nicht viel Forschung zur Effektivität von LLMs bei der Erzeugung zuverlässiger Test-Orakel betrieben.
In dieser Studie schauen wir uns an, ob LLMs korrekte, vielfältige und starke Test-Orakel erzeugen können, die einzigartige Bugs entdecken. Wir haben sieben verschiedene LLMs mit verschiedenen Eingabeaufforderungen auf einem Datensatz namens SF110 trainiert. Indem wir das effektivste Modell und die beste Eingabeaufforderung identifiziert haben, haben wir eine neue Methode zur Generierung von Test-Orakeln entwickelt. Um zu sehen, wie gut diese Methode funktioniert, haben wir sie an 25 grossen Java-Projekten getestet. Wir haben nicht nur die Korrektheit, sondern auch die Vielfalt und Stärke der erzeugten Orakel betrachtet und unsere Ergebnisse mit anderen Methoden wie EvoSuite und TOGA verglichen.
Bedeutung von Test-Orakeln
Test-Orakel sind entscheidend beim Softwaretesten, da sie das erwartete Verhalten der Software definieren. Eine Testsuite besteht aus Testfällen, wobei jeder Fall einen bestimmten Teil des Programms testet. Das Test-Orakel überprüft, ob das Programm wie erwartet gehandelt hat. Es gibt zwei Haupttypen von Test-Orakeln:
- Assertions-Orakel: Diese prüfen, ob die Ausgabe des Programms korrekt ist.
- Exception-Orakel: Diese überprüfen, ob das Programm Fehler richtig erkennt.
Damit Test-Orakel effektiv sind, müssen sie nicht nur korrekt, sondern auch stark sein. Ein korrektes Orakel bedeutet, dass es dem erwarteten Verhalten entspricht, ohne falsche Alarme auszulösen. Ein starkes Orakel kann erkennen, wenn das Programm etwas falsch macht. Es ist wichtig, beide Eigenschaften zu haben, um eine genaue Fehlersuche zu gewährleisten.
Obwohl das manuelle Erstellen von Test-Orakeln effektiver ist, erfordert es viel Zeit und Aufwand. Um dieses Problem anzugehen, haben Forscher nach Möglichkeiten gesucht, diesen Prozess zu automatisieren.
Methoden zur Generierung von Orakeln
Es gab mehrere Ansätze, um Test-Orakel automatisch zu erstellen, dabei wurden Techniken aus der Verarbeitung natürlicher Sprache und Mustererkennung verwendet. Einige Methoden generieren Orakel basierend auf Kommentaren und Dokumentationen. Diese können sowohl Assertions- als auch Exception-Orakel erzeugen.
Kürzlich wurden neuronale Netzwerke für die Orakel-Generierung eingesetzt. Die TOGA-Methode hat eine bessere Leistung als frühere Methoden gezeigt. Trotzdem hat sie noch Einschränkungen, da sie korrekte Assertions-Orakel nur in 38% der Fälle erzeugt, mit einer hohen Rate an falsch positiven Ergebnissen für sowohl Assertions- als auch Exception-Orakel. Das verdeutlicht den Bedarf an weiteren Fortschritten bei der Erstellung zuverlässiger automatischer Test-Orakel.
LLMs zur Generierung von Test-Orakeln
LLMs gewinnen zunehmend an Aufmerksamkeit für verschiedene Software-Engineering-Aufgaben, einschliesslich Testing. Frühere Versuche, LLMs zur Generierung von Testfällen zu verwenden, hatten Schwierigkeiten, eine gute Testabdeckung zu erreichen. Einige Studien zeigten begrenzten Erfolg bei der Generierung von Test-Präfixen für grosse Java-Programme. Andere haben versucht, LLMs sowohl für die Erstellung von Test-Präfixen als auch von Test-Orakeln zu nutzen, aber die Qualität der erzeugten Orakel zur Fehlersuche wurde nicht bewertet.
In unserer Forschung haben wir die Aufgabe aufgeteilt. Wir haben bewährte Methoden wie EvoSuite verwendet, um Test-Präfixe zu erstellen, und uns ausschliesslich auf die Verwendung von LLMs zur Generierung von Test-Orakeln konzentriert. Wir haben sieben verschiedene Code-LLMs mit verschiedenen Eingabeaufforderungen feinjustiert, die unterschiedliche Mengen an Kontext über die getestete Software bereitstellten.
Die verwendeten Modelle
Wir haben mehrere vortrainierte LLMs untersucht, die sich in Grösse und Fähigkeiten unterscheiden. Die Modelle, die wir betrachtet haben, sind:
- CodeGPT: Ein kleineres Modell, das gute Ergebnisse in Java gezeigt hat.
- CodeParrot: Dieses Modell funktioniert gut, obwohl es leichtgewichtig ist.
- CodeGen: In verschiedenen Grössen erhältlich, sind diese Modelle gut darin, Code zu verstehen.
- PolyCoder: Eine weitere Modellfamilie, die auf einer breiten Palette von Programmiersprachen trainiert wurde.
- Phi-1: Obwohl hauptsächlich auf Python trainiert, hat dieses Modell in unseren Bewertungen für Java gut abgeschnitten.
Vorbereitung der Trainingsdaten
Um unsere Modelle zu trainieren, haben wir den SF110-Datensatz verwendet, der zahlreiche Java-Projekte mit von EvoSuite generierten Testfällen enthält. Wir haben diese Daten verarbeitet, um Tupel zu erstellen, die den Test-Präfix, die getestete Methode und das entsprechende Orakel enthielten. Dieser Datensatz wurde dann in Trainings-, Test- und Validierungssätze aufgeteilt, um eine faire Bewertung unserer Methoden sicherzustellen.
Gestaltung effektiver Eingabeaufforderungen
Wir haben sechs verschiedene Eingabeaufforderungen erstellt, um die LLMs feinzujustieren und schrittweise mehr Kontext hinzuzufügen:
- P1: Nur der Test-Präfix.
- P2: Test-Präfix und Methoden-Dokumentation.
- P3: Test-Präfix und Methodensignatur.
- P4: Test-Präfix, Dokumentation und Methodensignatur.
- P5: Test-Präfix und der gesamte Methodencode.
- P6: Test-Präfix, Dokumentation und der gesamte Methodencode.
Wir haben festgestellt, dass mehr Hintergrundinformationen die Genauigkeit verbesserten, aber manchmal schnitten grössere Modelle nicht besser ab als kleinere, wenn sie richtig feinjustiert wurden.
Bewertung der Modelle
Nachdem wir die Modelle feinjustiert hatten, haben wir ihre Leistung an 25 neuen Java-Projekten getestet. Wir haben für jedes Projekt Test-Orakel generiert und sie validiert, indem wir die Tests ausgeführt haben. Die Genauigkeit wurde anhand der Anzahl der generierten Orakel gemessen, die die Tests bestanden haben.
Vergleich mit anderen Methoden
Wir haben unsere von LLMs generierten Orakel mit denen verglichen, die von TOGA und EvoSuite erzeugt wurden. Das Ziel war zu sehen, wie viele korrekte Orakel jede Methode generieren konnte und wie gut sie Bugs erkennen konnte.
Ergebnisse und Erkenntnisse
Effektivität von LLMs
Unsere Ergebnisse deuten darauf hin, dass LLMs tatsächlich starke und korrekte Test-Orakel erzeugen können. Tatsächlich generierte das am besten abschneidende LLM deutlich mehr korrekte Assertions- und Exception-Orakel im Vergleich zu TOGA. Das bedeutet, dass die Verwendung von LLMs den Prozess der Generierung zuverlässiger Test-Orakel verbessert.
Vielfalt der generierten Orakel
Ein weiterer wichtiger Aspekt, den wir betrachtet haben, war die Diversität. Die von LLMs generierten Orakel zeigten eine breite Palette von Assertions-Stilen, was sie geeignet macht, um traditionelle von Entwicklern geschriebene Orakel zu ergänzen. Diese Vielfalt ist entscheidend, um Bugs zu erkennen, die von einheitlicheren Ansätzen möglicherweise übersehen werden.
Stärke der Orakel bei der Fehlersuche
Die Stärke der von LLMs erstellten Orakel wurde durch Mutationstests bewertet. Dieser Prozess beinhaltet, kleine Änderungen am Code vorzunehmen, um "Mutanten" zu erstellen, und zu sehen, ob die Test-Orakel diese Änderungen erkennen können. Unsere Ergebnisse wiesen darauf hin, dass die von LLMs generierten Orakel in der Lage waren, viele einzigartige Bugs zu identifizieren, die andere nicht fanden.
Herausforderungen und Einschränkungen
Trotz der vielversprechenden Ergebnisse bleiben einige Herausforderungen bestehen. Zum Beispiel scheiterten etwa 5% der generierten Assertionen an der Kompilierung aufgrund kleiner Syntaxfehler. Auch ein kleiner Teil der generierten Ausgaben waren falsch positive Ergebnisse – Assertionen, die ein Problem anzeigten, als es keines gab.
Zukünftige Richtungen
In Zukunft wird es prioritär sein, die Modelle zu verfeinern, um Kompilierungsfehler und falsch positive Ergebnisse zu reduzieren. Ein weiterer Schwerpunkt liegt darauf, bessere Qualität von Dokumentationen zu finden, die die generierten Orakel verbessern könnte.
Fazit
LLMs haben grosses Potenzial, die Generierung von Test-Orakeln im Softwaretesting zu verbessern. Unsere Forschung zeigt, dass sie mehr korrekte, vielfältige und starke Test-Orakel erzeugen können als frühere Methoden. Indem wir bestehende Herausforderungen angehen und diese Techniken weiterhin verfeinern, können wir bedeutende Fortschritte in Richtung zuverlässigerer Softwaretestprozesse erzielen. Diese Arbeit legt den Grundstein für zukünftige Fortschritte in der automatisierten Test-Orakel-Generierung.
Titel: TOGLL: Correct and Strong Test Oracle Generation with LLMs
Zusammenfassung: Test oracles play a crucial role in software testing, enabling effective bug detection. Despite initial promise, neural-based methods for automated test oracle generation often result in a large number of false positives and weaker test oracles. While LLMs have demonstrated impressive effectiveness in various software engineering tasks, including code generation, test case creation, and bug fixing, there remains a notable absence of large-scale studies exploring their effectiveness in test oracle generation. The question of whether LLMs can address the challenges in effective oracle generation is both compelling and requires thorough investigation. In this research, we present the first comprehensive study to investigate the capabilities of LLMs in generating correct, diverse, and strong test oracles capable of effectively identifying a large number of unique bugs. To this end, we fine-tuned seven code LLMs using six distinct prompts on the SF110 dataset. Utilizing the most effective fine-tuned LLM and prompt pair, we introduce TOGLL, a novel LLM-based method for test oracle generation. To investigate the generalizability of TOGLL, we conduct studies on 25 large-scale Java projects. Besides assessing the correctness, we also assess the diversity and strength of the generated oracles. We compare the results against EvoSuite and the state-of-the-art neural method, TOGA. Our findings reveal that TOGLL can produce 3.8 times more correct assertion oracles and 4.9 times more exception oracles. Moreover, our findings demonstrate that TOGLL is capable of generating significantly diverse test oracles. It can detect 1,023 unique bugs that EvoSuite cannot, which is ten times more than what the previous SOTA neural-based method, TOGA, can detect.
Autoren: Soneya Binta Hossain, Matthew Dwyer
Letzte Aktualisierung: 2024-12-09 00:00:00
Sprache: English
Quell-URL: https://arxiv.org/abs/2405.03786
Quell-PDF: https://arxiv.org/pdf/2405.03786
Lizenz: https://creativecommons.org/licenses/by/4.0/
Änderungen: Diese Zusammenfassung wurde mit Unterstützung von AI erstellt und kann Ungenauigkeiten enthalten. Genaue Informationen entnehmen Sie bitte den hier verlinkten Originaldokumenten.
Vielen Dank an arxiv für die Nutzung seiner Open-Access-Interoperabilität.