Vad är looptestning? Metodik, exempel

⚡ Smart sammanfattning

Looptestning validerar loopkonstruktionerna inuti ett program och kontrollerar vad som händer när en loop hoppas över, startas en gång, körs vid dess gräns och skickas ett svep bortom det maximalt tillåtna antalet.

  • 🔘 Definition: En vitbox-kontrollstrukturteknik som syftar till loopvaliditet, inte till skärmar.
  • 🔁 Fyra klasser: Enkla, kapslade, sammanfogade och ostrukturerade loopar behöver alla sin egen strategi.
  • 📍 Tre kontrollpunkter: Inträde i loopen, beteende under exekvering och utgångsvillkor.
  • 🧪 Gränspasseringar: Noll, ett, två, ett typiskt antal, sedan b-1, b och b+1 iterationer.
  • 🪜 Kapslad ordning: Börja vid den innersta öglan, håll de yttre minst, arbeta dig sedan utåt.
  • 🐞 Upptäckta fel: Gränser som avviker från ett, oinitierade räknare, oändliga loopar och kapacitetsflaskhalsar.
  • ⚠️ Begränsning: Loopbuggar sitter i lågnivåkod och är sällan subtila när de väl nås.

Looptestningsmetodik, typer av loopar och exempel på testfall

Vad är looptestning?

Slingtestning är en typ av mjukvarutestning som helt fokuserar på giltigheten av loopkonstruktionerna i ett program. Det är en del av testning av kontrollstrukturer, tillsammans med sökvägstestning, datavalideringstestning och tillståndstestning.

Slingtestning är en vit box testning tekniken, så den tillämpas av någon som kan läsa källkoden och se loopens villkor, räknaren och utgångsvägen. Testaren gissar inte beteendet från användargränssnittet; loopen i sig är objektet som testas.

Diagrammet nedan visar var looptestning finns inom testfamiljen för kontrollstrukturer.

Looptestning visas som en gren av kontrollstrukturtestning

Typer av slingor Testade

Innan du väljer en strategi, identifiera vilken av de fyra loopklasserna du tittar på. Exempel på looptyper som testas är:

  • Enkel slinga — en enda slinga med en ingång och en utgång, såsom en slätt för, medan or göra medan konstruera.
  • Kapslad slinga — en slinga placerad inuti en annan, så att den inre slingan löper till fullbordan vid varje pass av den yttre slingan.
  • Sammanfogad slinga — två eller flera loopar som löper efter varandra i sekvens.
  • Ostrukturerad slinga — en oplanerad kombination av kapslade och sammanfogade loopar, vanligtvis resultatet av hopp in i eller ut ur en loopkropp.

Klassen bestämmer ansträngningen. En enkel loop behöver ett fåtal iterationer; en ostrukturerad loop behöver vanligtvis koden omdesignas innan den kan testas överhuvudtaget.

Varför gör looptestning?

Slingtestning görs av följande skäl

  • Testning kan fixa problem med loopupprepning
  • Looptestning kan avslöja flaskhalsar i prestanda och kapacitet
  • Genom att testa loopar kan de oinitierade variablerna i loopen bestämmas
  • Det hjälper till att identifiera problem med loopinitialisering.

Det finns också en kommersiell anledning. En loop som kör en iteration för mycket korrumperar en totalsumma; en loop som aldrig avslutas får en process att låsa sig. Båda defekterna är billiga att hitta medan koden fortfarande finns på en utvecklarmaskin och dyra att hitta i produktion.

Hur man gör looptestning: Komplett metodik

När man testar en loop måste den kontrolleras på tre olika nivåer:

  • När loopen är inmatad
  • Under dess utförande, och
  • När slingan är kvar

Teststrategin för alla dessa loopar är följande.

Enkel slinga

En enkel loop har en enda ingång och en enda utgång, som visas nedan.

Enkelt loopflödesschema med en startpunkt och ett utgångsvillkor

En enkel slinga testas på följande sätt:

  1. Hoppa över hela slingan
  2. Gör 1 pass genom slingan
  3. Gör 2 pass genom öglan
  4. Fabrikat a passerar genom slingan där a < b, det är ett typiskt iterationsantal i mellanintervallet
  5. Fabrikat b, b-1 och b+1 passerar genom slingan där b är det maximala antalet tillåtna passager genom slingan.

De två sista fallen har det största värdet. Hoppa överping Loopen bevisar att utgångsvillkoret utvärderas innan kroppen körs, och b+1-fallet bevisar att loopen vägrar arbete bortom sin deklarerade gräns istället för att överköra en array.

Nestad slinga

En kapslad loop multiplicerar antalet möjliga iterationskombinationer, så den testas inifrån och ut snarare än allt på en gång.

Flödesschema för kapslad loop med en inre loop omsluten av en yttre loop

För en kapslad loop måste du följa följande steg.

  1. Ställ in alla andra loopar på deras minimivärde och börja vid den innersta loopen
  2. För den innersta slingan, utför ett enkelt slingtest och håll de yttre slingorna vid deras lägsta iterationsparametervärde
  3. Utför testet för nästa loop och arbeta utåt
  4. Fortsätt tills den yttersta öglan har testats.

Sammanfogade loopar

Sammanfogade loopar sitter en efter en i samma exekveringsväg, som diagrammet visar.

Flödesschema för sammanlänkade loopar som visar två loopar som körs i sekvens

I sammanfogade loopar, om två loopar är oberoende av varandra, testas de med den enkla loopmetoden, annars testas de som kapslade loopar.

Om däremot loopräknaren för en loop används som initialvärde för den andra, betraktas de två looparna inte som oberoende.

Ostrukturerade loopar

Ostrukturerade loopar är det svåraste fallet, eftersom kontrollen hoppar in och ut ur loopkroppen vid godtyckliga punkter.

Ostrukturerad loopflödesschema med kontrollhoppping in och ut ur loopkroppen

För ostrukturerade loopar måste designen omstruktureras för att återspegla användningen av strukturerade programmeringskonstruktioner. När koden har reducerats till enkla, kapslade eller sammanfogade former gäller matchningsstrategin ovan.

Exempel på looptestning med testfall

Ett fungerande exempel gör iterationsräkningarna konkreta. Betrakta en rutin som multiplicerar ett löpande resultat med varje heltal från 1 till n, en faktorberäkning. Loopräknaren börjar vid 1, utgångsvillkoret är motverka > n, och loopen deklareras att acceptera maximalt 12 passeringar innan resultatet överflödar den deklarerade heltalstypen.

Om man behandlar detta som en enkel loop, översätts de ovan rekommenderade iterationsantalen till följande testfall.

Testfall Värde av n Utförda passningar Vad det bevisar
TC01 0 0 (slinga hoppad över) Avslutningsvillkoret utvärderas innan kroppen körs, och resultatet behåller sitt initialiserade värde på 1.
TC02 1 1 En enda omgång ger rätt resultat och räknaren ökar en gång.
TC03 2 2 Ackumulatorn överför ett värde framåt mellan två på varandra följande omgångar.
TC04 5 5 Ett typiskt mellanregistervärde returnerar det förväntade värdet 120, vilket bekräftar normalt beteende.
TC05 11 11 Ett pass under maximum slutförs fortfarande normalt (b-ett).
TC06 12 12 Det deklarerade maximumet accepteras och loopen avslutas (b).
TC07 13 förkastas Ett pass utöver maximum nekas snarare än att ljudlöst översvämmas (b+ 1).

Observera att TC01 och TC07 är de två fall som utvecklare oftast utelämnar, och det är de två som exponerar misslyckad initialisering och överflödesfel. Ett negativt värde på n hör hemma i samma uppsättning om specifikationen tillåter att den anges, vilket länkar looptestning till negativa tester.

Vanliga defekter som upptäcks vid looptestning

Looptestning hittar hela tiden samma lilla familj av fel, vilket är det som gör de fasta iterationsräkningarna värda att köra varje gång.

  • Avgränsningar — ett villkor skrivet som < var <= var avsett, så loopen körs ett pass för få eller ett för mycket.
  • Oinitierade räknare eller ackumulatorer — en summa som innehåller ett värde kvar från ett tidigare samtal.
  • Oändliga loopar — ett utgångsvillkor som loopkroppen aldrig kan uppfylla eftersom räknaren bara uppdateras på vissa grenar.
  • Antaganden om hoppade loopar — kod efter loopen som läser en variabel som loopkroppen förväntades sätta, vilket misslyckas när loopen körs noll gånger.
  • Kapacitets- och prestandafel — en loop som är korrekt men läser om databasen vid varje pass, så kostnaden växer med antalet iterationer.
  • Kapslad loop-interferens — en inre loop som återanvänder den yttre loopräknaren och tyst ändrar det yttre iterationsräknaren.

Eftersom varje fel mappas till ett specifikt iterationsantal är de fel som uppstår här enkla att reproducera och snabba att åtgärda jämfört med fel som hittas vid högre testnivåer.

Looptestning jämfört med andra testtekniker för kontrollstrukturer

Looptestning är en medlem i kontrollstrukturfamiljen och är lätt att förväxla med angränsande tekniker. Tabellen nedan skiljer dem åt.

Teknik Vad den riktar sig till Typiskt täckningsmål
Slingtestning Loopkonstruktioner: ingång, iterationsantal och utgång Noll-, ett-, typisk- och gräns-iterationsräkningar för varje loop
Tillståndstestning Booleska uttryck i beslut Varje villkor utvärderades både sant och falskt
Dataflödestestning Definition och användning av varje variabel Varje definition-att-använda-par utförs minst en gång
Testning av grundväg Oberoende vägar genom kontrollflödesgrafen Ett antal vägar lika med den cyklomatiska komplexiteten

I praktiken kompletterar dessa tekniker snarare än konkurrerar. Cyklomatisk komplexitet visar hur många oberoende vägar som finns, basvägstestning täcker dem, och looptestning lägger sedan till de iterationsantal som vägtäckning ensam inte skulle tvinga fram. Alla är dynamisk testning aktiviteter, eftersom koden måste köras för att resultaten ska kunna observeras.

Begränsning i looptestning

Tekniken har verkliga gränser, och att känna till dem förhindrar överinvestering.

  • Slingbuggar dyker mest upp i mjukvara på låg nivå
  • De buggar som identifieras under looptestning är inte särskilt subtila
  • Många av buggarna kan upptäckas av operativsystemet, eftersom de orsakar minnesgränsöverträdelser, detekterbara pekarfel och liknande fel.
  • Att identifiera klassen för varje loop och testa den därefter kostar tid, vilket är svårt att rättfärdiga på kodvägar som medför liten risk.

Vanliga frågor

Utvecklare och tekniska testare med tillgång till källkod, vanligtvis under enhetstestning eller kodgranskning. Affärstestare kan inte tillämpa det, eftersom loopvillkoret är osynligt från användargränssnittet.

En modell läser loopvillkoret och föreslår automatiskt noll-, ett-, typisk- och gränsiterationsräkningar, inklusive överflödesfallet. En granskare bekräftar ändå att varje förväntat resultat matchar specifikationen.

Den utarbetar dem snabbt, eftersom iterationsmönstret är formelbaserat. Agentassistenter kan också köra sviten och rapportera vilka antal misslyckade svar, men att bestämma det maximala antalet tillåtna godkännanden förblir ett designbeslut som en människa äger.

Kör fallet under en timeout eller en iterationsskydd så att testet misslyckas snabbt istället för att sviten hänger sig. Säkerställ antalet registrerade godkännanden, inte bara det slutliga utdatavärdet.

Mycket färre än alla kombinationer. Testning inifrån och ut håller antalet ungefär additivt över nivåer snarare än multiplikativt, eftersom de yttre looparna är fästa vid sitt minimivärde medan den inre loopen tränas.

Inget verktyg är dedikerat till det. Team kombinerar ett enhetstestramverk som t.ex. JUnit eller pytest med ett täckningsverktyg som rapporterar grentäckning, och läs sedan rapporten för att bekräfta att noll-iterationsvägen har nåtts.

Nej. Grentäckningen är uppfylld när en loop har gått in i och ut ur en slinga en gång. Looptestning kräver dessutom det hoppade passet och gränsräkningarna, vilket enbart grentäckningen aldrig tvingar fram.

När det är ostrukturerat — kontrollhoppping in i eller ut ur kroppen. Omstrukturering till enkla, kapslade eller sammanfogade former kostar mindre än att utforma tester för varje oregelbunden startpunkt.

Sammanfatta detta inlägg med: