Teste og forbedre en algoritme

Å teste en algoritme betyr å kjøre den med FLERE ulike innganger – spesielt «vanskelige» tilfeller (like tall, negative tall, tomme lister) – for å avdekke feil FØR de dukker opp i en ekte situasjon. Finner du en inngang algoritmen håndterer feil, er det der du må forbedre den.

Tips

  • Test alltid MINST tre typer innganger: et vanlig tilfelle, et «randtilfelle» (f.eks. to like store tall), og et uventet tilfelle (f.eks. negative tall) – algoritmer feiler oftest på randtilfellene.
  • Skriv opp hva algoritmen SKAL gi før du kjører den, så du har noe konkret å sjekke svaret mot – ikke bare stol på at svaret «ser riktig ut».

Eksempel: Teste en størst-av-tre-algoritme

Algoritmen «sammenlign de tre tallene parvis, behold det største» skal finne det største av tre tall. Test den på (5, 5, 3) – to like store tall. Fungerer den?

Spore algoritmen på (5, 5, 3)
StegSammenligningBehold
15 vs 55
25 vs 35
Løsning:
  1. Vi sporer algoritmen: sammenlign 5 og 5
  2. like, behold én av dem (5)
  3. sammenlign 5 og 3
  4. 5 er størst, behold 5. Algoritmen håndterer like tall riktig, siden «behold det største av to like tall» fortsatt gir riktig svar. Svaret er algoritmen fungerer, gir 5.
Alternativ forklaring/metode: Systematisk liste over testtilfeller

Alternativ metode – innenfor pensum, men ikke hovedmetoden her

Lage en test-tabell

I stedet for å teste ett og ett tilfelle tilfeldig, lag en tabell på forhånd med testtilfeller og forventet svar: «vanlig tilfelle → forventet X», «like tall → forventet Y», «negative tall → forventet Z». Kjør algoritmen mot hvert testtilfelle og kryss av – dette er hvordan programmerere faktisk jobber i praksis (kalt «testcases»).

TesttilfelleForventet svar
Vanlig tilfelleforventet X
Like tallforventet Y
Negative tallforventet Z

Oppgaver

Prøv minst én oppgave på hvert nivå.

Lett(3)

L-11Test algoritmen «finn det største av to tall» på (7, 7). Hva bør svaret bli?

Vis fasit
TestResultat
Begge tall7
Konklusjon7
  1. Begge tallene er 7
  2. det største av to like tall er tallet selv
  3. 7

L-12Test algoritmen «finn gjennomsnittet av en liste» på listen [10]. Hva bør svaret bli?

Vis fasit
TestResultat
Sum10
Antall1
Gjennomsnitt10
  1. Listen har kun tallet 10
  2. gjennomsnittet av én verdi er verdien selv
  3. 10

L-13Test algoritmen «finn det minste tallet» på (4, 4, 4). Hva bør svaret bli?

Vis fasit
TestResultat
Alle tall4, 4, 4
Minste4

Alle tallene er like, så det minste er også 4

Middels(3)

M-11En algoritme skal finne gjennomsnittet av en liste. Test den på [6, 6, 6, 6]. Hva bør svaret bli?

Vis fasit
TestResultat
Sum24
Antall4
24 : 46

sum: 6+6+6+6=24, antall: 4, gjennomsnitt: 24 : 4 = 6

M-12En algoritme «finn største tall» testes på (-3, -8, -1). Hva bør svaret bli (husk: -1 er større enn -8)?

Vis fasit
TestResultat
Tallene-3, -8, -1
Størst-1

Av -3, -8, -1 er -1 størst (nærmest null oppover)

M-13En algoritme skal telle partall i en liste. Test den på [2, 4, 6, 8]. Hva bør svaret bli?

Vis fasit
TestResultat
Partall funnet2, 4, 6, 8
Teller4
  1. 2, 4, 6 og 8 er alle partall
  2. 4
Vanskelig(3)

V-11En algoritme «finn største tall» testes på en tom liste (ingen tall). Hva bør skje, og hvorfor er dette et viktig testtilfelle?

Vis fasit
TestResultat
Tall å sammenligne0
Konklusjonbør gi feilmelding, ikke krasje
  1. Uten tall å sammenligne kan ikke algoritmen finne et «størst» tall – tomme lister er et klassisk randtilfelle som ofte glemmes
  2. bør håndteres som en feil, ikke krasje eller gi feil svar

V-12En algoritme skal telle partall i listen [-4, 3, -2, 7]. Hva bør svaret bli (husk: negative partall telles også)?

Vis fasit
TestResultat
Partall funnet-4, -2
Teller2
  1. -4 og -2 er partall (selv om de er negative), 3 og 7 er oddetall
  2. 2 partall

V-13En elev tester bare algoritmen sin med (3, 5, 7) og konkluderer at den fungerer perfekt. Hva mangler i testingen?

Vis fasit
TestResultat
Testetvanlige oddetall (3,5,7)
Manglerrandtilfeller (like/negative tall)
  1. 3, 5 og 7 er tre «vanlige» oddetall uten spesielle egenskaper
  2. et slikt testtilfelle avdekker ikke feil som bare oppstår ved spesielle innganger
  3. mangler testing av randtilfeller