0%

Bewijs het gedrag van de database · oefening

Test een query via het publieke resultaat

list_available_items(connection) belooft een bruikbaar Python-resultaat, geen specifieke schrijfwijze van de SQL. Test die belofte door rijen klaar te zetten waarvan de ID-volgorde afwijkt van de volgorde van inventariscodes en vergelijk daarna de volledige teruggegeven waarde.

Ga verder in tests/test_catalog.py. De eerste schematest en create_fresh_database staan er al. Vul de body van test_available_items_are_plain_ordered_records(tmp_path) in. Het databasepad is create_fresh_database(tmp_path, "available.db") en de geconfigureerde verbinding komt uit catalog_db.open_database(database_path).

Voeg drie nog niet gebruikte voorwerpen in met afzonderlijke aanroepen van connection.execute(...) of een korte lus die die aanroep herhaalt. Geef het laagste ID een code die achteraan sorteert, zoals Z-310, en een hoger ID een code die vooraan sorteert, zoals A-205. Zorg dat het derde voorwerp actief is uitgeleend. Deze opzet voorkomt dat een toevallige ID- of invoegvolgorde correct lijkt. Voeg het benodigde lid en de actieve uitlening toe, commit de beginsituatie en doe precies deze aanroep:

actual = catalog_db.list_available_items(connection)

Sluit de verbinding in finally. Vergelijk actual met twee dictionaries op volgorde van inventariscode. Elke dictionary moet precies id, asset_tag, name, category en loan_days bevatten. Controleer ook dat elk resultaat het gewone type dict heeft in plaats van sqlite3.Row. Deze assertions beschermen de interface die een andere Python-module gebruikt, terwijl de interne opbouw van de implementatie mag veranderen.

Kopieer de beschikbaarheidsquery niet naar de test en inspecteer geen SQL-constante. Daarmee zou je jouw gekopieerde query testen, niet de publieke functie. De SQL voor de voorbereiding in de test heeft een ander doel: die maakt de bekende toestand aan die de publieke aanroep moet interpreteren.

Druk op Run. Het vaste startpunt roept opnieuw pytest.main(["-q", "-p", "no:cacheprovider", "tests/test_catalog.py"]) aan en vindt nu beide tests:

Database tests passed: 2

Submit verandert de sorteervolgorde van het programma terwijl het verzamelen van tests goed blijft werken. Een test die alleen len(actual) vergelijkt, rijen al gesorteerd invoegt, ontbrekende sleutels accepteert of sqlite3.Row-waarden toestaat, mist de zichtbare regressie. Een vergelijking van het volledige publieke resultaat ontdekt die zonder één exacte SQL-string te vereisen.

Opdracht

Maak test_available_items_are_plain_ordered_records(tmp_path) in tests/test_catalog.py af. Maak een nieuwe database, voeg nog niet gebruikte rijen in waarvan de ID-volgorde en de volgorde van inventariscodes verschillen, maak één voorwerp actief, roep catalog_db.list_available_items(connection) aan en vergelijk de geordende gewone dictionaries met precies de vijf publieke sleutels. Gebruik herhaalde aanroepen van execute() of een korte lus met die aanroepen.