Unit Testing
T. Issaris
19 April 2021
Soorten tests
- unit tests
- integration tests
- functional tests
- end to end tests
- …
Unit tests
- Test je functies en classes
- Dienen snel te zijn
- Worden zeer vaak uitgevoerd
Intermezzo: assert
assert True # slaagt, en code gaat verder
assert False # mislukt, en code stopt hier met foutmelding
Intermezzo: assert
naam = "Odie"
assert naam == "Odie" # slaagt, code gaat verder
assert naam == "Max" # mislukt, en code stopt hier met foutmelding
Intermezzo: assert
leeftijd = 23
assert leeftijd > 18 # slaagt, code gaat verder
assert leeftijd < 60 # slaagt, code gaat verder
assert leeftijd < 20 # mislukt, en code stopt hier met foutmelding
Intermezzo: assert
leeftijd = 23
assert leeftijd > 18 # slaagt, code gaat verder
assert leeftijd < 60 # slaagt, code gaat verder
assert leeftijd < 20 # mislukt, en code stopt hier met foutmelding
Pytest
Software voor het uitvoeren van testen
Pytest: gebruik
In bestand som.py:
def som(a, b):
return a + b
Pytest: gebruik
In bestand test_som.py:
def test_som_twee_getallen():
resultaat = som(4,3)
assert resultaat == 7
pytest test_som.py
Pytest: gebruik
def som(a, b):
return a + b
def test_som_twee_getallen():
resultaat = som(4,3)
assert resultaat == 7
def test_som_0():
resultaat = som(-1,1)
assert resultaat == 0
Test Driven Development
- Schrijf eerst de test
- Controlleer dat de test faalt
- Schrijf dan code zodat de test lukt
- Terug naar stap 1 voor nieuwe functionaliteit
Voorbeeld 1: Volume cubus
TDD: Stap 1
Eerste poging: We voorzien een functie volume_cubus().
def volume_cubus():
return 0
def test_volume_cubus():
assert volume_cubus(zijde=2) == 8
TypeError: volume_cubus() takes 0 positional arguments but 1 were given
Oei, we vergaten de parameter…
TDD: Stap 2
Correctie parameters:
def volume_cubus(zijde):
return 0
def test_volume_cubus():
assert volume_cubus(2) == 8
E assert 0 == 8
E + where 0 = volume_cubus(2)
Het resultaat klopt niet.
TDD: Stap 3
We proberen het volume correct te berekenen:
def volume_cubus(zijde):
return zijde * 3
def test_volume_cubus():
assert volume_cubus(zijde=2) == 8
E assert 6 == 8
E + where 6 = volume_cubus(2)
Oei, klopt niet… Hmmm…
TDD: Stap 4
Ah! Correcte implementatie formule volume cubus:
def volume_cubus(zijde):
return zijde ** 3
def test_volume_cubus():
assert volume_cubus(2) == 8
1 passed in 0.00s
De test slaagt! We zijn klaar.
TDD: Stap 1
Eerste poging: We voorzien een functie bmi().
def bmi():
return 0
def test_bmi():
assert bmi(1.84,71) == 21
TypeError: bmi() takes 0 positional arguments but 2 were given
Oei, we vergaten de parameters…
TDD: Stap 2
Correctie parameters:
def bmi(lengte, gewicht):
return 0
def test_bmi():
assert bmi(1.84,71) == 21
E assert 0 == 21
E + where 0 = bmi(1.84,71)
Het resultaat klopt niet.
TDD: Stap 3
We proberen BMI correct te berekenen:
def bmi(lengte, gewicht):
return gewicht/lengte
def test_bmi():
assert bmi(1.84,71) == 21
E assert 38.586956521739125 == 21
E + where 38.586956521739125 = bmi(1.84, 71)
Oei, klopt helemaal niet… Hmmm…
TDD: Stap 4
Ah! Correcte implementatie formule BMI:
def bmi(lengte, gewicht):
return gewicht/lengte**2
def test_bmi():
assert bmi(1.84,71) == 21
E assert 20.97117202268431 == 21
E + where 20.97117202268431 = bmi(1.84, 71)
Hmm… toch faalt de test omdat het getal niet exact gelijk is…
TDD: Stap 5
Test aanpassen zodat de test slaagt als de waarde dicht genoeg bij de juiste waarde ligt:
def bmi(lengte, gewicht):
return gewicht/lengte**2
def test_bmi():
assert abs(bmi(1.84,71) - 21) < 0.5
1 passed in 0.00s
De test slaagt! We zijn klaar.