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: installatie

pip install pytest

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

  1. Schrijf eerst de test
  2. Controlleer dat de test faalt
  3. Schrijf dan code zodat de test lukt
  4. 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.

Voorbeeld 2: BMI

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.

// reveal.js plugins