Hva er looptesting? Metodikk, eksempel

โšก Smart oppsummering

Loop Testing validerer lรธkkekonstruksjonene i et program, og sjekker hva som skjer nรฅr en lรธkke hoppes over, startes รฉn gang, kjรธres ved grensen og skyves ett pass utover det maksimalt tillatte antallet.

  • ๐Ÿ”˜ Definisjon: En hvitboks-kontrollstrukturteknikk rettet mot lรธkkevaliditet, ikke mot skjermer.
  • ๐Ÿ” Fire klasser: Enkle, nestede, sammenkoblede og ustrukturerte lรธkker trenger hver sin egen strategi.
  • ๐Ÿ“ Tre kontrollpunkter: Inngang i lรธkken, oppfรธrsel under utfรธrelse og utgangsbetingelse.
  • ๐Ÿงช Grensepasseringer: Null, en, to, en typisk telling, deretter b-1, b og b+1 iterasjoner.
  • ๐Ÿชœ Nestet rekkefรธlge: Start ved den innerste lรธkken, hold de ytre minst mulig, og arbeid deg deretter utover.
  • ๐Ÿž Funnede feil: Av-for-รฉn-grenser, uinitialiserte tellere, uendelige lรธkker og kapasitetsflaskehalser.
  • โš ๏ธ Begrensning: Loop-feil sitter i lavnivรฅkode og er sjelden subtile nรฅr de fรธrst er nรฅdd.

Metodikk for lรธkketesting, typer lรธkker og eksempler pรฅ testtilfeller

Hva er looptesting?

Slรธyfetesting er en type programvaretesting som fokuserer utelukkende pรฅ gyldigheten av lรธkkekonstruksjonene i et program. Det er en del av testing av kontrollstrukturer, ved siden av stitesting, datavalideringstesting og tilstandstesting.

Slรธyfetesting er en testing av hvit boks teknikken, slik at den brukes av noen som kan lese kildekoden og se lรธkkebetingelsen, telleren og utgangsveien. Testeren gjetter ikke pรฅ oppfรธrselen fra brukergrensesnittet; selve lรธkken er objektet som testes.

Diagrammet nedenfor viser hvor lรธkketesting befinner seg innenfor testfamilien for kontrollstrukturer.

Looptesting vist som en gren av testing av kontrollstrukturer

Typer slรธyfe Testet

Fรธr du velger en strategi, identifiser hvilken av de fire lรธkkeklassene du ser pรฅ. Eksempler pรฅ lรธkketyper som testes er:

  • Enkel lรธkke โ€” en enkelt slรธyfe med รฉn inngang og รฉn utgang, for eksempel en vanlig forum, mens or gjรธr mens konstruere.
  • Nestet lรธkke โ€” รฉn lรธkke plassert inni en annen, slik at den indre lรธkken fullfรธres for hver passering av den ytre lรธkken.
  • Sammenhengende lรธkke โ€” to eller flere lรธkker som gรฅr etter hverandre i rekkefรธlge.
  • Ustrukturert slรธyfe โ€” en uplanlagt kombinasjon av nestede og sammenkoblede lรธkker, vanligvis et resultat av hopp inn i eller ut av en lรธkkekropp.

Klassen bestemmer innsatsen. En enkel lรธkke trenger en hรฅndfull iterasjonsantall; en ustrukturert lรธkke trenger vanligvis at koden redesignes fรธr den i det hele tatt kan testes.

Hvorfor utfรธre slรธyfetesting?

Slรธyfetesting utfรธres av fรธlgende รฅrsaker

  • Testing kan fikse problemene med loop-repetisjon
  • Looptesting kan avdekke flaskehalser i ytelse og kapasitet
  • Ved รฅ teste lรธkker kan de uinitialiserte variablene i lรธkken bestemmes
  • Det hjelper med รฅ identifisere problemer med lรธkkeinitialisering.

Det finnes ogsรฅ en kommersiell grunn. En lรธkke som kjรธrer รฉn iterasjon for mye, รธdelegger en total; en lรธkke som aldri avsluttes, henger en prosess. Begge feilene er billige รฅ finne mens koden fortsatt er pรฅ en utviklermaskin, og dyre รฅ finne i produksjon.

Slik utfรธrer du slรธyfetesting: Komplett metodikk

Nรฅr man tester en lรธkke, mรฅ den kontrolleres pรฅ tre forskjellige nivรฅer:

  • Nรฅr lรธkken er inngรฅtt
  • Under utfรธrelsen, og
  • Nรฅr lรธkken er igjen

Teststrategien for alle disse lรธkkene er som fรธlger.

Enkel lรธkke

En enkel lรธkke har รฉn inngang og รฉn utgang, som vist nedenfor.

Enkelt lรธkkeflytskjema med ett inngangspunkt og รฉn utgangspunkt

En enkel slรธyfe testes pรฅ fรธlgende mรฅte:

  1. Hopp over hele lรธkken
  2. Gjรธr 1 pass gjennom lรธkken
  3. Gjรธr 2 passeringer gjennom lรธkken
  4. Lage a gรฅr gjennom lรธkken der a < b, det er et typisk iterasjonstall i mellomklassen
  5. Lage b, b-1 og b+1 gรฅr gjennom lรธkken der b er det maksimale antallet tillatte passeringer gjennom lรธkken.

De to siste sakene har mest verdi. Hopp overping lรธkken beviser at utgangsbetingelsen evalueres fรธr kroppen kjรธrer, og b+1 tilfelle beviser at lรธkken nekter arbeid utover den deklarerte grensen i stedet for รฅ overkjรธre en array.

Nestet lรธkke

En nestet lรธkke multipliserer antallet mulige iterasjonskombinasjoner, slik at den testes fra innsiden og ut i stedet for alt pรฅ en gang.

Flytskjema for nestet lรธkke med en indre lรธkke omsluttet av en ytre lรธkke

For en nestet lรธkke mรฅ du fรธlge fรธlgende trinn.

  1. Sett alle de andre lรธkkene til minimumsverdien og start ved den innerste lรธkken
  2. For den innerste slรธyfen, utfรธr en enkel slรธyfetest og hold de ytre lรธkkene ved deres minste iterasjonsparameterverdi
  3. Utfรธr testen for neste lรธkke og arbeid deg utover
  4. Fortsett til den ytterste lรธkken er testet.

Sammenhengte lรธkker

Sammenkoblede lรธkker sitter etter hverandre i samme utfรธrelsesbane, som diagrammet viser.

Flytskjema for sammenkoblede lรธkker som viser to lรธkker som kjรธrer i rekkefรธlge

I sammenkoblede lรธkker, hvis to lรธkker er uavhengige av hverandre, testes de ved hjelp av den enkle lรธkketilnรฆrmingen, ellers testes de som nestede lรธkker.

Men hvis lรธkketelleren for รฉn lรธkke brukes som startverdi for den andre, regnes ikke de to lรธkkene som uavhengige.

Ustrukturerte lรธkker

Ustrukturerte lรธkker er det vanskeligste tilfellet, fordi kontroll hopper inn og ut av lรธkkekroppen pรฅ vilkรฅrlige punkter.

Ustrukturert lรธkkeflytskjema med kontrollhoppping inn og ut av lรธkkekroppen

For ustrukturerte lรธkker mรฅ designet omstruktureres for รฅ gjenspeile bruken av strukturerte programmeringskonstruksjoner. Nรฅr koden er redusert til enkle, nestede eller sammenkoblede former, gjelder matchingstrategien ovenfor.

Eksempel pรฅ lรธkketesting med testtilfeller

Et utarbeidet eksempel gjรธr iterasjonstellingene konkrete. Tenk deg en rutine som multipliserer et lรธpende resultat med hvert heltall fra 1 til n, en faktorberegning. Lรธkketelleren starter pรฅ 1, utgangsbetingelsen er disk > n, og lรธkken er deklarert til รฅ godta maksimalt 12 passeringer fรธr resultatet overflyter den deklarerte heltallstypen.

Hvis vi behandler dette som en enkel lรธkke, oversettes iterasjonstallene som er anbefalt ovenfor til fรธlgende test tilfeller.

Test tilfelle Verdien av n Utfรธrte pasninger Hva det beviser
TC01 0 0 (lรธkke hoppet over) Utgangsbetingelsen evalueres fรธr kroppen kjรธrer, og resultatet forblir pรฅ den initialiserte verdien pรฅ 1.
TC02 1 1 ร‰n enkelt omgang gir riktig resultat, og telleren รธker รฉn gang.
TC03 2 2 Akkumulatoren overfรธrer en verdi fremover mellom to pรฅfรธlgende omganger.
TC04 5 5 En typisk telling i mellomomrรฅdet returnerer forventede 120, noe som bekrefter vanlig oppfรธrsel.
TC05 11 11 ร‰n omgang under maksimumet fullfรธres fortsatt normalt (b-1.).
TC06 12 12 Det deklarerte maksimumet aksepteres, og lรธkken avsluttes (b).
TC07 13 avvist ร‰n passering utover maksimumet blir nektet i stedet for รฅ overlรธpe stille (b+ 1).

Legg merke til at TC01 og TC07 er de to tilfellene utviklere oftest utelater, og det er de to som eksponerer feil ved hoppet initialisering og overlรธp. En negativ verdi pรฅ n hรธrer hjemme i samme sett hvis spesifikasjonen tillater det, som kobler lรธkketesting til negativ testing.

Vanlige feil funnet ved lรธkketesting

Looptesting finner stadig den samme lille familien av feil, og det er det som gjรธr de faste iterasjonstellingene verdt รฅ kjรธre hver gang.

  • Avgrensninger โ€” en betingelse skrevet som < hvor <= var ment, sรฅ lรธkken kjรธrer รฉn omgang for fรฅ eller รฉn for mange.
  • Uinitialiserte tellere eller akkumulatorer โ€” en totalsum som inneholder en verdi som er igjen fra et tidligere anrop.
  • Uendelige lรธkker โ€” en utgangsbetingelse som lรธkkekroppen aldri kan oppfylle fordi telleren bare oppdateres pรฅ noen grener.
  • Forutsetninger om hoppet over slรธyfer โ€” kode etter lรธkken som leser en variabel som lรธkkeinnholdet var forventet รฅ sette, som mislykkes nรฅr lรธkken kjรธres null ganger.
  • Kapasitets- og ytelsesfeil โ€” en lรธkke som er korrekt, men som leser databasen pรฅ nytt ved hver passering, slik at kostnaden vokser med iterasjonsantallet.
  • Nestet slรธyfeinterferens โ€” en indre lรธkke som gjenbruker den ytre lรธkketelleren og stille endrer den ytre iterasjonstelleren.

Fordi hver feil er knyttet til et spesifikt antall iterasjoner, er feilene som dukker opp her enkle รฅ reprodusere og raske รฅ fikse sammenlignet med feil som finnes ved hรธyere testnivรฅer.

Looptesting vs. andre testteknikker for kontrollstrukturer

Looptesting er et medlem av kontrollstrukturfamilien, og det er lett รฅ forveksle med de nรฆrliggende teknikkene. Tabellen nedenfor skiller dem.

Teknikk Hva den retter seg mot Typisk dekningsmรฅl
Slรธyfetesting Loopkonstruksjoner: inngang, iterasjonstelling og utgang Null-, รฉn-, typisk- og grenseiterasjonstellinger for hver lรธkke
Tilstandstesting Boolske uttrykk i beslutninger Hver betingelse evaluerte bรฅde sant og usant
Dataflyttesting Definisjon og bruk av hver variabel Hvert definisjonspar som skal brukes, utรธves minst รฉn gang
Basissti-testing Uavhengige baner gjennom kontrollflytgrafen Et antall stier lik den syklomatiske kompleksiteten

I praksis er disse teknikkene komplementรฆre snarere enn konkurrerende. Syklomatisk kompleksitet forteller deg hvor mange uavhengige stier som finnes, basisstitesting dekker dem, og lรธkketesting legger deretter til iterasjonstallene som stidekning alene ikke ville tvinge frem. Alle er dynamisk testing aktiviteter, siden koden mรฅ kjรธres for at resultatene skal kunne observeres.

Begrensning i slรธyfetesting

Teknikken har reelle grenser, og det รฅ kjenne dem forhindrer overinvestering.

  • Slรธyfefeil vises for det meste i programvare pรฅ lavt nivรฅ
  • Feilene som er identifisert under loop-testing er ikke veldig subtile
  • Mange av feilene kan oppdages av operativsystemet, ettersom de forรฅrsaker brudd pรฅ minnegrenser, oppdagelige pekerfeil og lignende feil.
  • Det koster tid รฅ identifisere klassen til hver lรธkke og teste den deretter, noe som er vanskelig รฅ rettferdiggjรธre pรฅ kodestier som medfรธrer liten risiko.

Spรธrsmรฅl og svar

Utviklere og tekniske testere med tilgang til kildekode, vanligvis under enhetstesting eller kodegjennomgang. Forretningstestere kan ikke bruke den, fordi lรธkkebetingelsen er usynlig fra brukergrensesnittet.

En modell leser lรธkkebetingelsen og foreslรฅr automatisk null-, รฉn-, typisk- og grenseiterasjonstellinger, inkludert overlรธpstilfellet. En anmelder bekrefter likevel at hvert forventede resultat samsvarer med spesifikasjonen.

Den utarbeider dem raskt, siden iterasjonsmรธnsteret er formelbasert. Agentassistenter kan ogsรฅ kjรธre suiten og rapportere hvilke antall feil, men รฅ bestemme maksimalt antall tillatte passeringer er fortsatt en designbeslutning som et menneske eier.

Kjรธr saken under en timeout eller en iterasjonsbeskyttelse slik at testen feiler raskt i stedet for รฅ henge opp pakken. Vรฆr sikker pรฅ antall registrerte passeringer, ikke bare den endelige utdataverdien.

Langt fรฆrre enn alle kombinasjoner. Testing pรฅ vrangen holder tellingen omtrent additiv pรฅ tvers av nivรฅer i stedet for multiplikativ, fordi de ytre lรธkkene er festet til sin minimumsverdi mens den indre lรธkken trenes.

Det finnes ikke noe verktรธy dedikert til det. Team kombinerer et enhetstestrammeverk som f.eks. JUnit eller pytest med et dekningsverktรธy som rapporterer grendekning, og les deretter rapporten for รฅ bekrefte at null-iterasjonsbanen ble nรฅdd.

Nei. Grendekningen er oppfylt nรฅr en lรธkke er inngรฅtt og utgรฅtt รฉn gang. Looptesting krever i tillegg antall overspurte passeringer og grenser, noe grendekningen alene aldri tvinger frem.

Nรฅr det er ustrukturert โ€” kontrollhoppping inn i eller ut av kroppen. Omstrukturering til enkle, nestede eller sammenkoblede former koster mindre enn รฅ designe tester for hvert uregelmessige inngangspunkt.

Oppsummer dette innlegget med: