0%

Een echt project testen · oefening

Parametriseer één regel

De inclusieve regel heeft drie belangrijke posities: onder de drempelwaarde, precies erop en erboven. Een volledige test drie keer kopiëren zou verbergen dat alle drie de voorbeelden dezelfde vraag stellen.

Importeer pytest en vervang de ene gelijkheidstest door dit afgebakende recept met een marker:

import pytest

from catalog import select_items


@pytest.mark.parametrize(
    ("quantity", "minimum", "kept"),
    [
        (3, 4, False),
        (4, 4, True),
        (5, 4, True),
    ],
)
def test_minimum_quantity_is_inclusive(quantity, minimum, kept):
    item = {"sku": "CASE", "quantity": quantity}

    selected = select_items([item], minimum)

    assert (selected == [item]) is kept

De regel met @ past de door pytest geleverde marker parametrize toe op deze testfunctie. Deze les gebruikt alleen dit markerrecept; je leert hier niet hoe je decorators schrijft en er wordt geen kennis van functies als waarden uit Python-basis II verondersteld.

Voer de tests uit:

python -m pytest -q

Pytest hoort drie testgevallen uit die functie te verzamelen. Elke rij geeft dezelfde betekenis aan de parameters en gebruikt dezelfde assertie. Een tabel die drempelgedrag, CSV-fouten en uitvoeropmaak mengt, zou regels besparen maar de regel verbergen die ze hoort uit te leggen.

Houd een andere belofte apart

Voeg een gewone test toe voor het behoud van volgorde en duplicaten:

def test_selection_preserves_order_and_duplicates():
    first = {"sku": "B", "quantity": 8}
    repeated = {"sku": "A", "quantity": 8}
    items = [first, repeated, repeated]

    selected = select_items(items, 8)

    assert selected == [first, repeated, repeated]

Dit is niet nog een rij met waarden voor de regel over één grenswaarde. Deze test beschermt een andere belofte over de collectie. Met een aparte naam levert een fout daarom bruikbare informatie op.

Geef de tests namen en orden de asserties zoals jij het duidelijkst vindt. Waar het om gaat, is dat de parametertabel echt verschillende gevallen bevat. Een tabel met drie rijen die allemaal hetzelfde zeggen, wordt verzameld als drie tests maar ontdekt precies evenveel als één.

Opdracht

Gebruik in tests/test_catalog.py één tabel met pytest.mark.parametrize met minstens de gevallen onder, gelijk aan en boven de grens voor de inclusieve minimumregel. Houd behoud van volgorde en duplicaten in een aparte gewone test. De verzamelde parametergevallen moeten slagen met de juiste catalogus en falen bij realistische wijzigingen die de drempelregel stukmaken.