0%

Kapitel 10 · Übung

Das Datenbankverhalten belegen

Jedem Test eine neue Datenbank geben

Einem Datenbanktest ist schwer zu vertrauen, wenn die Zeilen von gestern in das heutige Ergebnis gelangen können. Deine erste Aufgabe ist, einem Test seine eigene catalog.db zu geben, dort das aktuelle Schema aufzubauen, sie zu schließen und vor der abschließenden Zusicherung erneut zu öffnen.

Der Projektbaum hat vier Aufgabenbereiche. Bearbeite nur tests/test_catalog.py. catalog_setup.py bereitet Schemas vor und prüft sie, catalog_db.py enthält die geprüften Abfrage- und Befehlsfunktionen, und catalog_import.py enthält den geprüften CSV-Import. Lass diese drei Programmmodule unverändert. Die sichtbare Datei run_tests.py ist der Projekteinstieg, der deine Testdatei ausführt.

Pytest liefert diesem Test ein neues Argument tmp_path. Ein Pfad wie tmp_path / "catalog.db" gehört nur zu diesem Testdurchlauf, sodass ein anderer Test dessen Datenbank nicht übernehmen kann. Vervollständige create_fresh_database(tmp_path, filename="catalog.db"): Leite den Pfad von tmp_path ab, rufe catalog_setup.prepare_database(database_path) auf und gib denselben Pfad zurück.

Vervollständige dann test_fresh_database_has_the_current_schema(tmp_path). Verwende create_fresh_database, öffne die resultierende Datei mit sqlite3.connect und lies die Namen der Benutzertabellen sowie die geordneten Spalten aller drei Tabellen. Die exakte Struktur der Version 2 ist:

  • items: id, asset_tag, name, category, loan_days

  • members: id, member_code, name, loan_limit, email

  • loans: id, item_id, member_id, checked_out_on, returned_on

Schließe diese Verbindung in finally. Öffne denselben Pfad erneut, lies PRAGMA user_version und schließe wieder. Die vollständige Struktur zu vergleichen erkennt eine Datenbank, die nur teilweise aktuell ist. Auch das erneute Öffnen ist wichtig: Es belegt, dass du die Datei liest, nicht einen Zustand, der nur auf einer Verbindung existiert.

Klicke auf Run. run_tests.py wechselt in das Projektverzeichnis und ruft genau pytest.main(["-q", "-p", "no:cacheprovider", "tests/test_catalog.py"]) auf. Ein Fehler zeigt den nützlichen pytest-Bericht. Erfolg wird so zusammengefasst:

Database tests passed: 1

Verwende Run für die pytest-Tests dieses Kapitels. Die separate Werkzeugleistenaktion Run project tests verwendet Python Lands kleinen Testrunner, der keine pytest-Fixtures wie tmp_path liefert.

Submit führt deinen Test ebenfalls mit einem neuen temporären Pfad aus und prüft, ob er eine Einrichtungsfunktion bemerkt, die woanders schreibt. Eine eingecheckte Datenbank, ein Ersatz im Arbeitsspeicher oder eine Zusicherung, die nur eine Tabelle prüft, kann diesen Nachweis nicht liefern. Sobald das besteht, folgt jeder spätere Test derselben Isolationsregel.

Aufgabe

Vervollständige create_fresh_database(tmp_path, filename="catalog.db") und test_fresh_database_has_the_current_schema(tmp_path) in tests/test_catalog.py. Baue den Pfad unterhalb von tmp_path, rufe catalog_setup.prepare_database auf, untersuche die exakte Struktur der Version 2 mit drei Tabellen, schließe, öffne erneut und sichere zu, dass user_version gleich 2 ist. Lass die geprüften Programmmodule unverändert.