Varför testa kod?

När vi programmerar är det lätt att göra fel – även om koden körs utan krascher betyder det inte att den gör rätt sak.

Testning innebär att vi:

  • kontrollerar att våra funktioner ger rätt resultat,
  • fångar fel tidigt,
  • försäkrar oss om att ändringar inte förstör något annat.

Testning är en viktig del i riktig programutveckling – i större system testas allt automatiskt.

Två sätt att testa i Python:

MetodBeskrivning
assertSnabbt och enkelt sätt att testa uttryck
unittestInbyggd modul för mer organiserade tester

assert – enkel testkontroll

def add(a, b):
    return a + b

assert add(2, 3) == 5
  • Om påståendet är sant → inget händer
  • Om det är falskt → kastas ett AssertionError

Du kan lägga till ett eget felmeddelande som skrivs ut om funktionen inte fungerar:

assert add(2, 2) == 4, "Funktionen add fungerar inte som den ska"

Detta passar bra när du vill testa små funktioner under utveckling. Ovanstående kommer inte skriva ut felmeddelanden eftersom vår funktion faktiskt fungerar.

unittest – organiserad testning

unittest är en inbyggd modul i Python för att skriva testfall.
Testerna körs automatiskt och visar vad som fungerar och vad som inte gör det.

Målet

Vi vill skriva automatiska tester som:

  • körs automatiskt,
  • kontrollerar att funktioner ger rätt resultat,
  • visar tydligt vad som fungerar och inte.

Steg 1 – skapa en funktion att testa

I en fil som t.ex. heter math_tools.py skriver vi en enkel funktion:

# math_tools.py

def multiply(a, b):
    return a * b

Detta är en vanlig Python-fil. Funktionen är liten och lätt att testa.

Steg 2 – skapa en testfil

Vi skapar en separat testfil:
test_math_tools.py

Här ska vi använda modulen unittest för att testa vår funktion.

import unittest                     # Vi importerar testmodulen
from math_tools import multiply    # Vi importerar funktionen vi vill testa

Steg 3 – skapa en testklass

Alla tester skrivs inuti en klass som ärver från unittest.TestCase.

class TestMathTools(unittest.TestCase):
    def test_multiply(self):
        self.assertEqual(multiply(2, 3), 6)
        self.assertEqual(multiply(0, 5), 0)
        self.assertEqual(multiply(-2, 4), -8)

Förklaring:

  • test_multiply är en testmetod – måste börja med test_ för att testet ska hittas automatiskt
  • self.assertEqual(x, y) testar att x == y. Om det är falskt → testet misslyckas

Steg 4 – kör testen

Lägg till detta i slutet av testfilen:

if __name__ == '__main__':
    unittest.main()

Det betyder: “Om denna fil körs direkt – kör alla testmetoder.”

Exempel på testfil: test_math_tools.py

import unittest
from math_tools import multiply

class TestMathTools(unittest.TestCase):
    def test_multiply(self):
        self.assertEqual(multiply(2, 3), 6)
        self.assertEqual(multiply(0, 10), 0)
        self.assertNotEqual(multiply(4, 2), 10)

if __name__ == '__main__':
    unittest.main()

Resultat i terminalen

python test_math_tools.py

Utdata:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
  • . betyder att ett test gick igenom
  • Du får ett felmeddelande om någon assert misslyckas

Sammanfattning

KodradFörklaring
import unittestImporterar testmodulen
from x import yImporterar din egen funktion
class TestX(unittest.TestCase)Skapar en klass med testfall
def test_...Testmetod som automatiskt körs
assertEqual(a, b)Testar att a == b
assertNotEqual(a, b)Testar att a != b
unittest.main()Startar testerna