0%

Hoofdstuk 10 · oefening

Een echt project testen

Installeer en verzamel één test

De catalogus heeft controles van de echte commandoregel en de grenzen van foutafhandeling doorstaan. Wat nog ontbreekt, is een manier binnen het project om die verwachtingen na de volgende wijziging opnieuw te controleren. Begin door de testrunner reproduceerbaar te maken, zoals je in hoofdstuk 3 een package reproduceerbaar maakte.

Maak een tijdelijke omgeving en installeer de gecontroleerde vaste versie uit de mirror:

python -m venv .venv
.venv/bin/python -m pip install pytest==9.1.1
nano requirements.txt
.venv/bin/python -m pytest --version

Zet één regel in het bestand, pytest==9.1.1, en sla het op. Het laatste commando hoort pytest 9.1.1 te melden. Het interne netwerk bereikt alleen de packagemirror van Python Land, nooit het openbare PyPI. .venv is afgeleide toestand en wordt niet meegenomen wanneer de werkruimte wordt opgeslagen. requirements.txt is de blijvende projectkeuze waarmee een andere omgeving opnieuw kan worden opgebouwd.

Geef pytest een naam die het verzamelt

Maak de testmap en open de eerste module:

mkdir -p tests
nano tests/test_catalog.py

Schrijf één test:

from catalog import select_items


def test_equal_quantity_is_included():
    item = {"sku": "EQ-4", "quantity": 4}

    assert select_items([item], 4) == [item]

Pytest vindt bestanden met namen als test_*.py en functies met namen als test_*. De functie heeft geen speciale basisklasse nodig. De gewone assertie is dezelfde ontwikkelaarscontrole die je in Python-basis I leerde kennen, nu verzameld en gerapporteerd door een testrunner.

Voer pytest uit met precies deze omgeving:

.venv/bin/python -m pytest -q

Eén punt en 1 passed betekenen dat één test is verzameld en dat de assertie klopte. Alleen stilte van een assertie is niet genoeg: het overzicht van pytest bewijst dat de functie is gevonden.

Let op welke van die twee zaken blijvend is. .venv is afgeleide toestand en gaat niet mee naar de volgende les; requirements.txt en tests/test_catalog.py wel. Dat is dezelfde scheiding als in hoofdstuk 3, nu toegepast op de testrunner in plaats van de applicatie.

Pytest drukt “no tests ran” af nadat je het bestand per ongeluk catalog_checks.py hebt genoemd. Welk contract onderzoek je eerst?

Hierna maak je onderscheid tussen correct verzamelde tests en de verschillende manieren waarop een pytest-commando kan stoppen.

Opdracht

Maak het exacte blijvende bestand requirements.txt. Maak daarna tests/test_catalog.py met één vindbare test met een gewone assertie die bewijst dat een item gelijk aan het minimumaantal wordt meegenomen. Voer die vóór het inleveren uit met de Python van de vastgezette venv. De beoordelaar controleert de bestanden en het verzamelde gedrag, niet de terminalgeschiedenis of de uitgesloten omgeving.