Testning i Python
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:
| Metod | Beskrivning |
|---|---|
assert | Snabbt och enkelt sätt att testa uttryck |
unittest | Inbyggd 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 * bDetta ä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 testaSteg 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 medtest_för att testet ska hittas automatisktself.assertEqual(x, y)testar attx == 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.pyUtdata:
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK.betyder att ett test gick igenom- Du får ett felmeddelande om någon
assertmisslyckas
Sammanfattning
| Kodrad | Förklaring |
|---|---|
import unittest | Importerar testmodulen |
from x import y | Importerar 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 |