Grenzen setzen beim Software-Testen mit Erkenntnissen aus dem maschinellen Lernen
Lern, wie Konzepte des maschinellen Lernens dabei helfen, Testgrenzen für Software festzulegen.
― 9 min Lesedauer
Inhaltsverzeichnis
- Was ist Random Testing?
- Der Zusammenhang zwischen maschinellem Lernen und Testing
- Die Bedeutung von Coverage-Zielen
- Angemessenes Testen mit Obergrenzen erreichen
- Der Sättigungseffekt im Testing
- Relevante Coverage und ihre Rolle
- Programmspektren für detaillierte Analysen
- Inferenzangemessenheit im Testing
- Verknüpfung von Testing und Lerntheorie
- Der Ansatz von booleschen Konjunktionen
- Schätzung der benötigten Anzahl an Tests
- Praktisches Beispiel: Dreiecks-Klassifikation
- Bewertung der Zuverlässigkeit unseres Ansatzes
- Studien zu Coverage und Fehlererkennung
- Fazit und zukünftige Richtungen
- Originalquelle
- Referenz Links
Random-Testing ist ein Verfahren, um zu checken, ob Software richtig funktioniert, indem man zufällige Eingaben benutzt. Es hilft, Bugs zu finden, die Entwickler beim Programmieren vielleicht übersehen haben. Aber eine Frage kommt auf: Wann sollten wir mit dem Testen aufhören? Wann können wir sicher sein, dass weitere Tests keine neuen Probleme mehr finden? Diese Frage ähnelt einer im maschinellen Lernen: Wie viele Beispiele brauchen wir, um richtig zu lernen? In diesem Artikel wird diskutiert, wie Ideen aus dem maschinellen Lernen helfen können, Grenzen dafür zu setzen, wie viele Tests wir durchführen müssen, um sicherzustellen, dass unsere Software gut getestet ist.
Was ist Random Testing?
Random Testing ist in der Softwareentwicklung beliebt, weil es den Testern ermöglicht, viele verschiedene Eingaben zu erstellen, um die Software zu testen. Die Idee dahinter ist, dass wir sehen können, wie gut die Software mit verschiedenen Situationen umgeht, indem wir eine Vielfalt von Eingaben nutzen. Ein Random-Testgenerator erstellt Testeingaben aus einem bestimmten Bereich von Optionen, sodass wir viele verschiedene Fälle sampeln können.
Eine grosse Frage beim Random Testing ist jedoch, wann man aufhören sollte. Typischerweise verlassen sich Tester auf ihr Urteil oder haben eine festgelegte Zeit für das Testen. Einige Forscher haben vorgeschlagen, statistische Methoden zu verwenden, um zu bestimmen, wann das Testen aufhören kann, was in diesem Artikel erkundet wird.
Der Zusammenhang zwischen maschinellem Lernen und Testing
Im maschinellen Lernen gibt es eine Theorie, die hilft zu bestimmen, wie viele Datenpunkte nötig sind, um ein genaues Modell zu erstellen. Diese Theorie, die wahrscheinlich ungefähr korrektes Lernen (PAC) genannt wird, gibt uns eine Möglichkeit, herauszufinden, wie viele Beispiele wir brauchen, um effektiv zu lernen. Durch die Verwendung von Konzepten aus PAC-Learning können wir auch Grenzen dafür setzen, wie viele Tests wir für effektives Random Testing durchführen müssen.
Der Zusammenhang zwischen Testing und maschinellem Lernen wurde in den 1980er Jahren erkannt. Forscher schlugen vor, dass wir bewerten könnten, wie gut wir testen, indem wir ein Modell erstellen, das das Verhalten der Software basierend auf den Eingaben und Ausgaben aus Tests vorhersagt. Wenn das Modell genau ist, deutet das darauf hin, dass wir genug Informationen aus unseren Tests haben.
Die Bedeutung von Coverage-Zielen
Beim Software-Testing wollen wir sicherstellen, dass wir alle wichtigen Teile des Codes überprüfen. Coverage ist ein Begriff, der sich darauf bezieht, wie viel des Codes getestet wird. Indem wir die Coverage-Ziele kennen, wie viele Codezeilen es gibt, können wir schätzen, wie viele Tests wir durchführen sollten.
Traditionell verwenden Menschen Coverage-Metriken wie die Anweisungsabdeckung (prüfen, ob jede Codezeile während der Tests ausgeführt wird), um die Qualität der Tests zu bewerten. Allerdings kann sich die ausschliessliche Abhängigkeit von Coverage als irreführend erweisen. Zum Beispiel kann ein Testset 80% Coverage erreichen, aber dennoch kritische Bugs übersehen. Daher ist es wichtig zu bestimmen, ob das Ziel des Testens erreicht ist und wann man aufhören kann.
Angemessenes Testen mit Obergrenzen erreichen
Um Random Testing zu verbessern, können wir Obergrenzen dafür festlegen, wie viele Tests wir durchführen müssen. Das bedeutet, dass wir eine maximale Anzahl von Tests schätzen können, über die hinaus zusätzliche Tests unsere Coverage oder Bugs nicht signifikant erhöhen.
Indem wir verstehen, wie viele Tests wir benötigen, um ein zufriedenstellendes Niveau zu erreichen, können Entwickler Zeit und Ressourcen sparen, anstatt eine übermässige Anzahl von Tests ohne klare Vorteile durchzuführen.
Der Sättigungseffekt im Testing
Eine bekannte Eigenschaft im Random Testing ist der Sättigungseffekt. Je mehr Tests wir durchführen, desto weniger auffällig werden die Verbesserungen in der Coverage. Irgendwann führt das Ausführen zusätzlicher Tests zu kaum spürbaren Gewinnen in der Coverage. Dieser Punkt wird als Sättigungspunkt bezeichnet. Sobald wir diesen Punkt erreichen, lohnt es sich nicht mehr, weitere Tests durchzuführen, da die Chancen, neue Bugs zu entdecken, erheblich sinken.
Wenn wir die Coverage verfolgen, können wir erkennen, wann wir die Sättigung erreicht haben. Das kann jedoch viel Zeit und Aufwand erfordern. Forscher haben Methoden entwickelt, um vorherzusagen, wann die Sättigung eintritt, sodass Tester wissen können, wann sie mit dem Testen aufhören können, ohne jeden möglichen Test durchführen zu müssen.
Relevante Coverage und ihre Rolle
In der Praxis konzentrieren sich Tester auf relevante Coverage, die sich auf die Teile des Codes bezieht, die angesichts der Testeingaben realistisch ausführbar sind. Indem wir nur die Codeanweisungen betrachten, die tatsächlich ausgeführt werden können, können wir besser verstehen, wann die Sättigung erreicht ist.
Wenn wir die relevante Coverage bewerten, können wir vorhersagen, wie viele Tests wir durchführen müssen, um eine angemessene Coverage zu erreichen, was uns hilft zu bestimmen, wann wir mit dem Testen aufhören sollten.
Programmspektren für detaillierte Analysen
Programmspektren bieten einen detaillierten Überblick darüber, wie Software während der Tests funktioniert. Ein Programmspektrum verfolgt, welche Teile des Codes während der Testläufe ausgeführt wurden. Durch die Analyse dieser Daten können wir identifizieren, welche Bereiche gut getestet wurden und welche nicht, was unser Verständnis der Coverage verbessert.
In unserer Coverage-Bewertung können wir Treffer-Spektren verwenden, die zeigen, ob ein bestimmter Teil des Codes während eines Tests ausgeführt wurde. Diese binäre Darstellung hilft zu erkennen, welche Codeelemente getestet wurden und wie sie sich auf unsere Coverage-Ziele beziehen.
Inferenzangemessenheit im Testing
Inferenzangemessenheit bezieht sich darauf, ob ein gegebenes Testset genügend Informationen liefert, um ein Softwaremodell genau widerzuspiegeln. Wenn genügend gute Daten gesammelt werden, können wir ein zuverlässiges Modell erstellen, das das Verhalten der Software genau darstellt. Das ermöglicht uns zu beurteilen, ob unser Testen angemessen ist, ohne umfangreiche Tests durchführen zu müssen.
Durch die Verwendung von Inferenzangemessenheit können wir validieren, dass unsere Testergebnisse ein genaues Modell der Software unterstützen, was eine weitere Sicherheitsebene bietet, dass wir effektiv testen.
Verknüpfung von Testing und Lerntheorie
Die Konzepte aus dem maschinellen Lernen können direkt auf das Testing angewendet werden. Indem wir unseren Testprozess als Lernproblem betrachten, können wir die Grenzen aus dem PAC-Learning nutzen. Das hilft uns, die Grösse der Testsets zu bestimmen, die benötigt werden, um angemessene Coverage und Bugs zu erkennen.
Wenn wir sehen, wie Inferenzangemessenheit und PAC-Learning überschneiden, können wir besser verstehen, welche Zahlen hinter unseren Testmethoden stehen. Wenn wir feststellen, dass Tests als Lernbeispiele betrachtet werden können, können wir die gleichen theoretischen Werkzeuge nutzen, um die Anzahl der durchzuführenden Tests zu begrenzen.
Der Ansatz von booleschen Konjunktionen
In unserer Analyse konzentrieren wir uns auf eine spezifische Lernherausforderung: das Lernen von booleschen Konjunktionen. Das bedeutet, dass wir versuchen, eine spezifische Beziehung zwischen verschiedenen Codeelementen zu erschliessen, basierend darauf, ob sie während des Testens ausgeführt wurden oder nicht.
Jeder Test kann als einfache Liste von booleschen Werten betrachtet werden, wobei wahr anzeigt, dass ein Coverage-Ziel erreicht wurde, und falsch bedeutet, dass es nicht erreicht wurde. Indem wir die Coverage als Lernproblem betrachten, können wir die Anzahl der Tests ableiten, die benötigt wird, um unsere Coverage-Ziele effizient zu erreichen.
Schätzung der benötigten Anzahl an Tests
Um die Anzahl der benötigten Tests zu schätzen, um den Sättigungspunkt zu erreichen, können wir die aus der Lerntheorie abgeleiteten Grenzen anwenden. Das ermöglicht uns zu berechnen, wie viele Tests wir durchführen müssen, um sicherzustellen, dass wir die notwendigen Teile des Codes effektiv abdecken, ohne eine übermässige Anzahl von Tests durchzuführen.
Wenn wir zum Beispiel die Anzahl der ausführbaren Codezeilen kennen, können wir verstehen, wie viele Tests wir durchführen müssen, um sicherzustellen, dass wir die Software gemäss unseren Standards angemessen testen.
Praktisches Beispiel: Dreiecks-Klassifikation
Um unseren Ansatz zu veranschaulichen, schauen wir uns ein einfaches Beispiel an: die Klassifizierung von Dreiecken basierend auf Seitenlängen. Der Code zur Bestimmung der Art des Dreiecks nimmt drei Eingaben: die Längen der Seiten.
Indem wir zufällige Eingaben für diese Längen generieren, können wir sehen, wie gut der Code funktioniert und ob er das Dreieck korrekt klassifiziert oder nicht. Während unseres Tests können wir das Ergebnis jedes Tests in einem einfachen booleschen Format darstellen, sodass wir nachverfolgen können, welche Teile des Codes ausgeführt werden.
Indem wir unsere Grenzen auf dieses Beispiel anwenden, können wir herausfinden, wie viele Testfälle wir benötigen, um sicherzustellen, dass wir den Code angemessen abdecken und unsere Testziele erreichen.
Bewertung der Zuverlässigkeit unseres Ansatzes
Um zu bewerten, wie zuverlässig unsere Obergrenzen und Testmethoden sind, können wir mehrere Studien durchführen. Wir können verschiedene Szenarien betrachten, einschliesslich automatisierter Fahrsysteme und Java-Einheiten, um zu sehen, wie gut unser Ansatz in der Praxis funktioniert.
Durch die Analyse von Coverage-Metriken und Fehlererkennungsraten können wir validieren, ob unsere theoretischen Grenzen in der realen Anwendung zutreffen. Das gibt uns das Vertrauen, dass unsere Methoden solide sind und verwendet werden können, um die Praktiken des Software-Testens zu verbessern.
Studien zu Coverage und Fehlererkennung
In unseren Studien können wir Daten darüber sammeln, wie gut unsere Testmethoden in verschiedenen Softwareumgebungen funktionieren. Zum Beispiel können wir einen automatisierten Fahr-Simulator testen und die erreichte Coverage sowie die Anzahl der während des Tests aufgedeckten Fehler untersuchen.
Ausserdem können wir zufällige Java-Einheitentests studieren, um Coverage- und Mutationswerte zu bewerten. Indem wir Testsets verschiedener Grössen mit unseren festgelegten Grenzen vergleichen, können wir die Effektivität unserer Methoden feststellen und die Grenzen unserer Vorhersagen verstehen.
Fazit und zukünftige Richtungen
Insgesamt haben wir gezeigt, dass wir die Anzahl der Tests schätzen können, die benötigt werden, um einen Sättigungspunkt im Software-Testing zu erreichen. Indem wir die Anzahl der Codeelemente kennen und Lektionen aus dem maschinellen Lernen anwenden, können wir zuverlässige Grenzen für unsere Testanstrengungen festlegen.
Während unser Ansatz erhebliche Einblicke in das Software-Testing bietet, gibt es Bereiche, die weiter erforscht werden müssen. Zukünftige Arbeiten können darin bestehen, unser Verständnis von Eingabeverteilungen zu verfeinern, Methoden für feedback-gesteuertes Testen zu untersuchen und unsere Ergebnisse auf ein breiteres Spektrum von Softwarekontexten anzuwenden.
Durch die weitere Untersuchung dieser Themen können wir unsere Testpraktiken verbessern und zuverlässigere Softwaresysteme schaffen.
Titel: Bounding Random Test Set Size with Computational Learning Theory
Zusammenfassung: Random testing approaches work by generating inputs at random, or by selecting inputs randomly from some pre-defined operational profile. One long-standing question that arises in this and other testing contexts is as follows: When can we stop testing? At what point can we be certain that executing further tests in this manner will not explore previously untested (and potentially buggy) software behaviors? This is analogous to the question in Machine Learning, of how many training examples are required in order to infer an accurate model. In this paper we show how probabilistic approaches to answer this question in Machine Learning (arising from Computational Learning Theory) can be applied in our testing context. This enables us to produce an upper bound on the number of tests that are required to achieve a given level of adequacy. We are the first to enable this from only knowing the number of coverage targets (e.g. lines of code) in the source code, without needing to observe a sample test executions. We validate this bound on a large set of Java units, and an autonomous driving system.
Autoren: Neil Walkinshaw, Michael Foster, Jose Miguel Rojas, Robert M Hierons
Letzte Aktualisierung: 2024-06-24 00:00:00
Sprache: English
Quell-URL: https://arxiv.org/abs/2405.17019
Quell-PDF: https://arxiv.org/pdf/2405.17019
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.
Referenz Links
- https://www.acm.org/publications/taps/whitelist-of-latex-packages
- https://dl.acm.org/ccs.cfm
- https://docs.google.com/spreadsheets/d/e/2PACX-1vRa_xuroS6AJIWNLPFD3gBPxjUZv-5b1FSIW4a6-USILPpJjPZ-RTM5-dbsboFA91YpLxNR4k1ONZWs/pubhtml
- https://anonymous.4open.science/r/RTLT
- https://github.com/carla-simulator/carla
- https://leaderboard.carla.org
- https://www.evosuite.org/experimental-data/sf110
- https://www.ukri.org/councils/epsrc/