0%

Das Datenbankverhalten belegen · Übung

Eine Abfrage anhand ihres öffentlichen Ergebnisses testen

list_available_items(connection) verspricht ein nützliches Python-Ergebnis, keine bestimmte Schreibweise seines SQL. Teste diese Zusage, indem du Zeilen vorbereitest, deren ID-Reihenfolge von ihrer Inventarkennzeichen-Reihenfolge abweicht, und dann den vollständigen Rückgabewert vergleichst.

Arbeite weiter in tests/test_catalog.py. Der erste Schematest und create_fresh_database sind bereits vorhanden. Ergänze den Rumpf von test_available_items_are_plain_ordered_records(tmp_path). Sein Datenbankpfad ist create_fresh_database(tmp_path, "available.db"), und seine konfigurierte Verbindung stammt aus catalog_db.open_database(database_path).

Füge drei unbekannte Gegenstände mit separaten connection.execute(...)-Aufrufen oder einer kleinen Schleife ein, die diesen Aufruf wiederholt. Gib der niedrigsten ID ein spät einsortiertes Kennzeichen wie Z-310, einer höheren ID ein früh einsortiertes wie A-205, und lass den dritten Gegenstand aktiv ausgeliehen sein. Diese Anordnung verhindert, dass eine zufällige ID- oder Einfügereihenfolge korrekt aussieht. Ergänze das erforderliche Mitglied und den aktiven Ausleihvorgang, schreibe die Vorbereitung fest und rufe genau Folgendes auf:

actual = catalog_db.list_available_items(connection)

Schließe die Verbindung in finally. Vergleiche actual mit zwei Dictionaries in Inventarkennzeichen-Reihenfolge. Jedes Dictionary muss genau id, asset_tag, name, category und loan_days enthalten. Prüfe außerdem, dass jedes Ergebnis den einfachen Typ dict statt sqlite3.Row hat. Diese Zusicherungen schützen die Schnittstelle, die ein anderes Python-Modul verwendet, und erlauben der Implementierung zugleich, ihre private Organisation zu ändern.

Kopiere die Verfügbarkeitsabfrage nicht in den Test und untersuche keine SQL-Konstante. Das würde deine doppelte Abfrage testen, nicht die öffentliche Funktion. Das vorbereitende SQL im Test hat einen anderen Zweck: Es erstellt den bekannten Zustand, den der öffentliche Aufruf interpretieren muss.

Klicke auf Run. Der feste Einstieg ruft erneut pytest.main(["-q", "-p", "no:cacheprovider", "tests/test_catalog.py"]) auf und sammelt jetzt beide Tests:

Database tests passed: 2

Submit ändert die Sortierung des Programms und lässt dabei die Testerkennung intakt. Ein Test, der nur len(actual) vergleicht, bereits sortierte Zeilen einfügt, fehlende Schlüssel akzeptiert oder sqlite3.Row-Werte bestehen lässt, übersieht die sichtbare Regression. Ein vollständiger Vergleich des öffentlichen Ergebnisses erkennt sie, ohne einen exakten SQL-String zu verlangen.

Aufgabe

Vervollständige test_available_items_are_plain_ordered_records(tmp_path) in tests/test_catalog.py. Erstelle eine neue Datenbank, füge unbekannte Zeilen mit unterschiedlicher ID- und Inventarkennzeichen-Reihenfolge ein, mache einen Gegenstand aktiv ausgeliehen, rufe catalog_db.list_available_items(connection) auf und vergleiche die sortierten einfachen Dictionaries mit genau den fünf öffentlichen Schlüsseln. Verwende wiederholte execute()-Aufrufe oder eine kleine Schleife mit diesen Aufrufen.