Göm menyn

Testning

För att försäkra sig om att koden man har skrivit är korrekt bör man använda sig av tester. Det finns olika sätt att testa program på, men vi kommer främst fokusera på enhetstester.

Olika nivåer

Detta är de vanligaste typerna av tester man genomför:

  1. Enhetstest (eng. unit test): Varje enhet (t.ex. funktion) testas var för sig.
  2. Integrationstest: Testar att flera enheter fungerar tillsammans.
  3. Systemtest: Testar hela systemet, t.ex. säkerhet, prestanda, användbarhet.
  4. Acceptanstest: Kunden testar den slutgiltiga produkten.

Två strategier

  • Black box test: Den som utformar testerna har inte sett koden utan utgår helt ifrån specifikationen.
  • White box test: Testerna baseras på analys av programkoden.

Enhetstestning

Hur gör man?

Enhetstester består av ett antal testfall (indata och förväntad utdata) samlade i en testsvit samt kod som kör testfallen. För att skapa enhetstester systematiskt använder man ofta ett testramverk, men dessa är lite för stora för de funktioner vi jobbar med, därför skriver vi egna enhetstester.

Vad uppnår vi med enhetstestning?

  • Försäkrar oss om att implementationen är korrekt.
  • Lättare att underhålla koden. Passerar alla våra tester så vet vi att vår definierade funktionalitet inte har ändrats (förutsatt att testerna är bra skrivna).
  • Underlättar integrationstestning.
  • Ersätter till viss del dokumentation.

Metod 1: Assertion

I exemplet nedan ser vi hur man kan försäkra sig (eng. assert) om att ett uttryck är sant. Detta kan användas för att försäkra sig om att en funktion ger den förväntade utdatan givet en viss indata.

Genom att använda satsen assert uttryck kommer ett AssertionError kastas om det givna uttrycket har sanningsvärdet False. Om uttrycket har sanningsvärdet True kommer inget att hända.

Dokumentation

Asserts körs automatiskt när filen laddas in. Detta blir dock ganska omständligt om någon annan vill importera vår fil då de måste vänta på att alla tester körs färdigt innan de kan fortsätta. En lösning är att testerna endast körs då filen körs direkt och inte vid importering.

Detta kan åstadkommas med en if-sats som kollar en av Pythons speciella variabler: __name__. Variabeln sätts till den modul som importerade filen och om filen körs direkt (som huvudprogram) så har den värdet "__main__".

Metod 2: Särskild testfunktion

Här har vi skrivit en funktion som använder assertions för att testa koden. Testfallen här består av en tupel med testfall, där varje fall representeras av en tupel som innehåller indata samt förväntad utdata. Testfunktionen säkerställer att om man anropar sort() på indatan ska resultatet se ut som den definierade utdatan, annars misslyckas testet.

Vilka testfall behövs?

Då det är högst opraktiskt att testa för alla indata måste testfall noga väljas ut:

  • Utforma testfall så att alla delar av funktionen körs någon gång, t.ex. alla alternativ i en sammansatt if-sats.
  • Testa extremvärden (eng. edgecases), t.ex. 0, 1, tomma strängen, tomma listan.
  • Testa normalfallet. (Vad är det mest typiska invärdet?)
  • Testa olika typer av indata (om det är tänkt att funktionen ska kunna hantera det).
  • Ha inte flera testfall som testar samma sak.

Tillhörande quiz

Finnes här


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2016-08-15