Was ist Schleifentest? Methodik, Beispiel

⚡ Intelligente Zusammenfassung

Bei Schleifentests werden die Schleifenkonstrukte innerhalb eines Programms validiert. Dabei wird geprüft, was passiert, wenn eine Schleife übersprungen, einmal betreten, an ihrer Grenze ausgeführt oder einen Durchlauf über die maximal zulässige Anzahl hinaus fortgesetzt wird.

  • 🔘 Definition: Eine White-Box-Kontrollstrukturtechnik, die auf die Gültigkeit von Schleifen und nicht auf Bildschirme abzielt.
  • 🔁 Vier Klassen: Einfache, verschachtelte, verkettete und unstrukturierte Schleifen benötigen jeweils ihre eigene Strategie.
  • 📍 Drei Kontrollpunkte: Eintritt in die Schleife, Verhalten während der Ausführung und Abbruchbedingung.
  • 🧪 Grenzübergänge: Null, eins, zwei, eine typische Anzahl, dann b-1, b und b+1 Iterationen.
  • 🪜 Verschachtelte Reihenfolge: Beginnen Sie bei der innersten Schlaufe, halten Sie die äußeren Schlaufen so kurz wie möglich und arbeiten Sie sich dann nach außen vor.
  • 🐞 Festgestellte Mängel: Off-by-one-Grenzwerte, nicht initialisierte Zähler, Endlosschleifen und Kapazitätsengpässe.
  • ⚠️ Einschränkung: Schleifenfehler befinden sich im Low-Level-Code und sind, sobald sie entdeckt werden, selten unauffällig.

Methodik des Schleifentests, Arten von Schleifen und Beispieltestfälle

Was ist Schleifentest?

Schleifentest ist eine Art von Softwaretest, der sich ausschließlich auf die Gültigkeit der Schleifenkonstrukte in einem Programm konzentriert. Er ist ein Teilbereich des Kontrollstrukturtests, neben Pfadprüfung, Datenvalidierungstests und Zustandstests.

Schleifentests sind ein White-Box-Tests Diese Technik wird von jemandem angewendet, der den Quellcode lesen und die Schleifenbedingung, den Zähler und den Abbruchpfad erkennen kann. Der Tester spekuliert nicht über das Verhalten anhand der Benutzeroberfläche; die Schleife selbst ist das zu testende Objekt.

Das folgende Diagramm zeigt, wo die Schleifenprüfung innerhalb der Kontrollstrukturprüfung angesiedelt ist.

Schleifenprüfung als ein Zweig der Regelungsstrukturprüfung dargestellt

Getestete Schleifentypen

Bevor Sie eine Strategie auswählen, identifizieren Sie die zu untersuchende Schleifenklasse. Beispiele für getestete Schleifentypen sind:

  • Einfache Schleife — eine einzelne Schleife mit einem Eingang und einem Ausgang, wie zum Beispiel eine einfache für , und gleichzeitig die or tun-während konstruieren.
  • Verschachtelte Schleife — eine Schleife innerhalb einer anderen, sodass die innere Schleife bei jedem Durchlauf der äußeren Schleife vollständig durchlaufen wird.
  • Verkettete Schleife — zwei oder mehr Schleifen, die nacheinander ablaufen.
  • Unstrukturierte Schleife — eine ungeplante Kombination aus verschachtelten und verketteten Schleifen, die in der Regel das Ergebnis von Sprüngen in oder aus einem Schleifenkörper ist.

Die Klasse bestimmt den Aufwand. Eine einfache Schleife benötigt nur wenige Iterationsanzahlen; eine unstrukturierte Schleife erfordert in der Regel eine Überarbeitung des Codes, bevor sie überhaupt getestet werden kann.

Warum Schleifentests durchführen?

Schleifentests werden aus folgenden Gründen durchgeführt

  • Durch Tests können die Probleme mit der Schleifenwiederholung behoben werden
  • Durch Schleifentests lassen sich Leistungs- und Kapazitätsengpässe aufdecken.
  • Durch das Testen von Schleifen können die nicht initialisierten Variablen in der Schleife ermittelt werden.
  • Es hilft dabei, Probleme bei der Schleifeninitialisierung zu identifizieren.

Es gibt auch einen wirtschaftlichen Grund. Eine Schleife, die eine Iteration zu viel durchläuft, verfälscht das Ergebnis; eine Schleife, die nie terminiert, führt zum Absturz des Prozesses. Beide Fehler lassen sich auf dem Entwicklerrechner kostengünstig finden, im Produktivbetrieb hingegen teuer.

So führen Sie Schleifentests durch: Vollständige Methodik

Beim Testen einer Schleife muss diese auf drei verschiedenen Ebenen überprüft werden:

  • Wenn die Schleife betreten wird
  • Während der Ausführung und
  • Wenn die Schleife verlassen wird

Die Teststrategie für alle diese Schleifen ist wie folgt.

Einfache Schleife

Eine einfache Schleife hat einen einzigen Eingang und einen einzigen Ausgang, wie unten dargestellt.

Einfacher Schleifenablaufplan mit einem Eintrittspunkt und einer Austrittsbedingung

Eine einfache Schleife wird folgendermaßen getestet:

  1. Überspringen Sie die gesamte Schleife
  2. Führe einen Durchlauf der Schleife durch.
  3. Machen Sie 2 Durchlauf durch die Schleife
  4. Marke a durchläuft die Schleife, wo a < bDas ist eine typische Iterationsanzahl im mittleren Bereich.
  5. Marke b, b-1 und b+1 durchläuft die Schleife, wo b ist die maximale Anzahl zulässiger Durchläufe der Schleife.

Die letzten beiden Fälle enthalten den größten Wert. Überspringenping Die Schleife beweist, dass die Abbruchbedingung ausgewertet wird, bevor der Funktionskörper ausgeführt wird, und die bDer Fall +1 beweist, dass die Schleife die Ausführung über ihr deklariertes Limit hinaus verweigert, anstatt ein Array zu überlaufen.

Verschachtelte Schleife

Eine verschachtelte Schleife vervielfacht die Anzahl der möglichen Iterationskombinationen, daher wird sie von innen nach außen getestet, anstatt alle auf einmal.

Flussdiagramm mit verschachtelten Schleifen, wobei eine innere Schleife von einer äußeren Schleife umschlossen wird.

Für eine verschachtelte Schleife müssen Sie die folgenden Schritte befolgen.

  1. Setze alle anderen Schleifen auf ihren Minimalwert und beginne mit der innersten Schleife.
  2. Führen Sie für die innerste Schleife einen einfachen Schleifentest durch und halten Sie die äußeren Schleifen auf ihrem minimalen Iterationsparameterwert
  3. Führe den Test für die nächste Schleife durch und arbeite dich nach außen vor.
  4. Fahren Sie fort, bis die äußerste Schleife getestet wurde.

Verkettete Schleifen

Wie das Diagramm zeigt, befinden sich die verketteten Schleifen nacheinander im selben Ausführungspfad.

Ablaufdiagramm mit verketteten Schleifen, das zwei nacheinander ausgeführte Schleifen zeigt.

Bei verketteten Schleifen werden zwei Schleifen, sofern sie voneinander unabhängig sind, mit dem einfachen Schleifenverfahren geprüft; andernfalls werden sie wie verschachtelte Schleifen geprüft.

Wird jedoch der Schleifenzähler der einen Schleife als Anfangswert für die andere verwendet, gelten die beiden Schleifen nicht als unabhängig.

Unstrukturierte Schleifen

Unstrukturierte Schleifen stellen den schwierigsten Fall dar, da die Steuerung an beliebigen Stellen in den Schleifenkörper hinein- und wieder herausspringt.

Unstrukturiertes Schleifenflussdiagramm mit Kontrollsprüngenping Ein- und Austritt aus dem Schleifenkörper

Bei unstrukturierten Schleifen muss das Design so umstrukturiert werden, dass es die Verwendung strukturierter Programmierkonstrukte widerspiegelt. Sobald der Code auf einfache, verschachtelte oder verkettete Formen reduziert wurde, kommt die oben beschriebene Matching-Strategie zum Einsatz.

Beispiel für Schleifentests mit Testfällen

Ein durchgerechnetes Beispiel verdeutlicht die Anzahl der Iterationen. Betrachten wir eine Routine, die ein laufendes Ergebnis mit jeder ganzen Zahl von 1 bis n multipliziert. n, eine Fakultätsberechnung. Der Schleifenzähler beginnt bei 1, die Abbruchbedingung ist Zähler > nDie Schleife ist so deklariert, dass sie maximal 12 Durchläufe akzeptiert, bevor das Ergebnis den deklarierten Integer-Typ überschreitet.

Wenn man dies als einfache Schleife betrachtet, ergeben sich die oben empfohlenen Iterationszahlen wie folgt: Testfälle.

Testfall Wert von n Pässe ausgeführt Was es beweist
TC01 0 0 (Schleife übersprungen) Die Abbruchbedingung wird vor der Ausführung des Algorithmus ausgewertet, und das Ergebnis behält seinen initialisierten Wert von 1 bei.
TC02 1 1 Ein einziger Durchlauf liefert das korrekte Ergebnis und der Zähler wird einmal erhöht.
TC03 2 2 Der Akkumulator überträgt einen Wert zwischen zwei aufeinanderfolgenden Durchläufen.
TC04 5 5 Eine typische Zählung im mittleren Bereich liefert den erwarteten Wert von 120 und bestätigt damit das normale Verhalten.
TC05 11 11 Ein Durchlauf unterhalb des Maximums wird dennoch normal abgeschlossen (b-1).
TC06 12 12 Der angegebene Maximalwert wird akzeptiert und die Schleife wird beendet (b).
TC07 13 abgelehnt Ein Durchgang über das Maximum hinaus wird verweigert, anstatt stillschweigend überlaufen zu lassen (b+ 1).

Beachten Sie, dass TC01 und TC07 die beiden Fälle sind, die Entwickler am häufigsten auslassen, und dass genau diese beiden Fehler wie übersprungene Initialisierung und Überlauf aufdecken. Ein negativer Wert von n gehört in dieselbe Menge, wenn die Spezifikation dies zulässt, was Schleifentests mit negative Prüfung.

Häufige Fehler, die durch Schleifentests gefunden wurden

Bei Schleifentests wird immer wieder dieselbe kleine Fehlergruppe gefunden, weshalb es sich lohnt, die festgelegten Iterationszahlen jedes Mal auszuführen.

  • Off-by-one-Grenzen — ein Zustand, der geschrieben wird als < woher <= war beabsichtigt, daher durchläuft die Schleife entweder einen Durchlauf zu wenig oder einen zu viel.
  • Nicht initialisierte Zähler oder Akkumulatoren — ein Gesamtbetrag, der einen Restwert aus einem vorherigen Anruf enthält.
  • Endlosschleifen — eine Abbruchbedingung, die der Schleifenkörper niemals erfüllen kann, da der Zähler nur in einigen Zweigen aktualisiert wird.
  • Annahmen übersprungene Schleifen — Code nach der Schleife, der eine Variable liest, die der Schleifenkörper setzen sollte, was fehlschlägt, wenn die Schleife null Mal durchlaufen wird.
  • Kapazitäts- und Leistungsmängel — eine Schleife, die zwar korrekt ist, aber bei jedem Durchlauf die Datenbank erneut einliest, sodass die Kosten mit der Anzahl der Iterationen steigen.
  • Verschachtelte Schleifeninterferenzen — eine innere Schleife, die den Zähler der äußeren Schleife wiederverwendet und die Anzahl der Iterationen in der äußeren Schleife stillschweigend ändert.

Da jeder Fehler einer bestimmten Iterationsanzahl zugeordnet ist, lassen sich die hier aufgedeckten Defekte im Vergleich zu Defekten, die bei höheren Iterationszahlen gefunden werden, leicht reproduzieren und schnell beheben. Testniveaus.

Schleifenprüfung im Vergleich zu anderen Prüfverfahren für Kontrollstrukturen

Schleifentests gehören zur Familie der Regelungstechnik und können leicht mit benachbarten Verfahren verwechselt werden. Die folgende Tabelle verdeutlicht die Unterschiede.

Technik Was es anvisiert Typisches Deckungsziel
Schleifentest Schleifenkonstrukte: Eintritt, Iterationszähler und Austritt Null-, Eins-, typische und Randiterationsanzahlen für jede Schleife
Zustandsprüfung Boolesche Ausdrücke innerhalb von Entscheidungen Jede Bedingung wurde sowohl auf Wahrheit als auch auf Falschheit geprüft.
Datenflusstests Definition und Verwendung der einzelnen Variablen Jedes Definition-Anwendungs-Paar wurde mindestens einmal ausgeführt.
Basispfadprüfung Unabhängige Pfade durch den Kontrollflussgraphen Eine Anzahl von Pfaden, die der zyklomatischen Komplexität entspricht

In der Praxis ergänzen sich diese Techniken eher, als dass sie miteinander konkurrieren. Zyklomatische Komplexität Es zeigt Ihnen, wie viele unabhängige Pfade existieren, die Basispfadprüfung deckt diese ab, und die Schleifenprüfung fügt dann die Iterationsanzahlen hinzu, die durch die Pfadabdeckung allein nicht erzwungen würden. Alle diese Tests sind dynamisches Testen Aktivitäten, da der Code ausgeführt werden muss, damit Ergebnisse sichtbar werden.

Einschränkung beim Schleifentest

Die Technik hat klare Grenzen, und deren Kenntnis verhindert Überinvestitionen.

  • Schleifenfehler treten meist in Low-Level-Software auf
  • Die beim Schleifentest identifizierten Fehler sind nicht sehr subtil
  • Viele der Fehler könnten vom Betriebssystem erkannt werden, da sie Speichergrenzenverletzungen, erkennbare Zeigerfehler und ähnliche Störungen verursachen.
  • Die Identifizierung der Klasse jeder Schleife und das entsprechende Testen kosten Zeit, was bei Codepfaden mit geringem Risiko schwer zu rechtfertigen ist.

Häufig gestellte Fragen

Entwickler und technische Tester mit Zugriff auf den Quellcode, normalerweise während Unit-Test oder Code-Review. Geschäftstester können dies nicht anwenden, da die Schleifenbedingung für die Benutzeroberfläche nicht sichtbar ist.

Ein Modell liest die Schleifenbedingung und schlägt automatisch die Anzahl der Iterationen bei Null, Eins, im Normalfall und an den Grenzen vor, einschließlich des Überlauffalls. Ein Prüfer bestätigt anschließend, dass jedes erwartete Ergebnis der Spezifikation entspricht.

Es erstellt sie schnell, da das Iterationsmuster formelhaft ist. Agentenassistenten können die Testsuite ebenfalls ausführen und melden, welche Zählungen fehlschlagen, die Festlegung der maximal zulässigen Durchläufe bleibt jedoch eine Designentscheidung, die vom Benutzer getroffen wird.

Führe den Testfall mit einem Timeout oder einer Iterationsabfrage aus, damit der Test schnell fehlschlägt, anstatt die Testsuite zu blockieren. Überprüfe die Anzahl der protokollierten Durchläufe und nicht nur den endgültigen Ausgabewert.

Weitaus weniger als bei jeder anderen Kombination. Durch das Testen von innen nach außen bleibt die Anzahl über die Ebenen hinweg annähernd additiv und nicht multiplikativ, da die äußeren Schleifen auf ihren Minimalwert fixiert sind, während die innere Schleife ausgeführt wird.

Es gibt kein speziell dafür entwickeltes Tool. Teams kombinieren ein Unit-Test-Framework wie beispielsweise JUnit oder pytest mit einem Coverage-Tool, das die Zweigabdeckung meldet, und lesen Sie dann den Bericht, um zu bestätigen, dass der Pfad mit der Null-Iteration erreicht wurde.

Nein. Die Zweigabdeckung ist erfüllt, sobald eine Schleife einmal betreten und verlassen wurde. Schleifentests erfordern zusätzlich die Zählung übersprungener Durchläufe und die Anzahl der Schleifengrenzen, was durch die Zweigabdeckung allein nicht erzwungen wird.

Immer wenn es unstrukturiert ist – Kontrollsprungping in den Körper hinein oder aus ihm heraus. Die Umstrukturierung in einfache, verschachtelte oder verkettete Formen ist kostengünstiger als die Entwicklung von Tests für jeden unregelmäßigen Eintrittspunkt.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: