Ein echtes Projekt testen · Übung
Eine Regel parametrisieren
Die inklusive Regel hat drei wichtige Positionen: unter dem Grenzwert, genau darauf und darüber. Einen vollständigen Test dreimal zu kopieren würde verdecken, dass alle drei Beispiele dieselbe Frage stellen.
Importiere pytest und ersetze den einzelnen Gleichheitstest durch ein klar begrenztes Muster mit einem 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
Die Zeile mit @ wendet den von pytest bereitgestellten Marker parametrize auf diese Testfunktion an. Diese Lektion verwendet dieses eine Muster. Sie erklärt weder, wie man eigene Decorators schreibt, noch setzt sie das Thema Funktionen als Werte aus Fundamentals II voraus.
Führe die Testsuite aus:
python -m pytest -q
Pytest sollte aus dieser Funktion drei Testfälle erkennen. In jeder Zeile haben die Parameter dieselbe Bedeutung, und es gilt dieselbe Assertion. Eine Tabelle, die Grenzwertverhalten, CSV-Fehler und Ausgabeformatierung vermischt, würde Zeilen sparen, aber die Regel verdecken, die sie erklären soll.
Halte eine andere Zusage getrennt
Füge einen gewöhnlichen Test für den Erhalt von Reihenfolge und Duplikaten hinzu:
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]
Das ist keine weitere Wertezeile für die Grenzwertregel eines einzelnen Werts. Dieser Test schützt eine andere Zusage für die gesamte Sammlung. Ein eigener Name macht einen Fehlschlag deshalb aussagekräftig.
Benenne die Tests und ordne die Assertions so an, wie es für dich am besten lesbar ist. Entscheidend ist, dass die Parametertabelle tatsächlich unterschiedliche Fälle enthält. Eine Tabelle mit drei Zeilen, die alle dasselbe aussagen, wird als drei Tests erkannt und entdeckt genau so viel wie einer.
Aufgabe
Verwende in tests/test_catalog.py eine Tabelle mit pytest.mark.parametrize, die mindestens die Fälle unter, auf und über dem Grenzwert für die inklusive Mindestmengenregel enthält. Prüfe den Erhalt von Reihenfolge und Duplikaten in einem separaten gewöhnlichen Test. Die erkannten Parameterfälle müssen beim korrekten Katalog bestehen und bei realistischen Veränderungen der Grenzwertlogik fehlschlagen.