Testen und Integration
Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 60 von 64.
Aufgabe
MittelIn dieser Challenge implementierst du ein Bibliothekssystem bestehend aus mehreren Dateien mit umfassender Testabdeckung. Du arbeitest mit drei schreibgeschützten Dateien und einer bearbeitbaren Datei, die detaillierte TODO-Kommentare enthält, die dich bei der Implementierung unterstützen:
- book.py - Enthält die Definition der Klasse Book
- user.py - Enthält die Klasse User, die du implementieren musst
- library.py - Enthält die Definition der Klasse Library
Spickzettel
Diese Herausforderung beinhaltet die Implementierung eines Bibliothekssystems aus mehreren Dateien mit drei Hauptkomponenten:
- book.py - Definition der Klasse Book
- user.py - Implementierung der Klasse User
- library.py - Definition der Klasse Library
Die Implementierung sollte eine umfassende Testabdeckung beinhalten und den TODO-Kommentaren in jeder Datei folgen.
Probier es selbst
from book import Book
from user import User
from library import Library
# Testfall-Handler
test_case = input()
if test_case == "create_user":
user_id = "1"
name = "Name"
user = User(user_id, name)
print(user)
print(f"Books borrowed: {len(user.books_borrowed)}")
elif test_case == "borrow_and_return_all":
library = Library("Community Library")
# Bücher und Benutzer hinzufügen
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
library.add_book(Book("1984", "George Orwell", "345678"))
user = User("U001", "Alice")
library.add_user(user)
# Bücher ausleihen
library.borrow_book("123456", "U001")
library.borrow_book("789012", "U001")
library.borrow_book("345678", "U001")
print(f"Books borrowed before: {len(user.books_borrowed)}")
# Alle Bücher zurückgeben
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
print(f"Books borrowed after: {len(user.books_borrowed)}")
# Überprüfen, ob alle Bücher verfügbar sind
for book in library.books:
print(f"Book {book.isbn} available: {book.available}")
elif test_case == "return_some_books":
library = Library("Community Library")
# Bücher und Benutzer hinzufügen
book1 = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
book2 = Book("To Kill a Mockingbird", "Harper Lee", "789012")
library.add_book(book1)
library.add_book(book2)
user = User("U001", "Alice")
library.add_user(user)
# Nur ein Buch ausleihen
library.borrow_book("123456", "U001")
print(f"Books borrowed before: {len(user.books_borrowed)}")
# Alle Bücher zurückgeben
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
print(f"Books borrowed after: {len(user.books_borrowed)}")
elif test_case == "empty_return":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
print(f"Books borrowed: {len(user.books_borrowed)}")
# Alle Bücher zurückgeben (sollte 0 sein)
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
elif test_case == "multiple_users":
library = Library("Community Library")
# Bücher hinzufügen
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
# Benutzer hinzufügen
user1 = User("U001", "Alice")
user2 = User("U002", "Bob")
library.add_user(user1)
library.add_user(user2)
# Bücher ausleihen
library.borrow_book("123456", "U001")
library.borrow_book("789012", "U002")
print(user1)
print(user2)
# Alle Bücher für user1 zurückgeben
num_returned = user1.return_all_books(library)
print(f"Books returned by {user1.name}: {num_returned}")
print(user1)
print(user2)
elif test_case == "error_handling":
library = Library("Community Library")
# Buch und Benutzer hinzufügen
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
user = User("U001", "Alice")
library.add_user(user)
# Versuchen, ein nicht existierendes Buch auszuleihen
result = library.borrow_book("999999", "U001")
print(result)
# Versuchen, für einen nicht existierenden Benutzer auszuleihen
result = library.borrow_book("123456", "U999")
print(result)
# Existierendes Buch ausleihen
result = library.borrow_book("123456", "U001")
print(result)
# Versuchen, dasselbe Buch erneut auszuleihen
result = library.borrow_book("123456", "U001")
print(result)
# Versuchen, ein Buch zurückzugeben, das nicht ausgeliehen wurde
result = library.return_book("789012", "U001")
print(result)
elif test_case == "stress_test":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
# 100 Bücher hinzufügen
for i in range(1, 101):
isbn = f"{i:03d}" # Formatierung als 001, 002, etc.
library.add_book(Book(f"Book {i}", f"Author {i}", isbn))
library.borrow_book(isbn, "U001")
print(f"Books borrowed: {len(user.books_borrowed)}")
# Alle Bücher zurückgeben
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
print(f"Books borrowed after: {len(user.books_borrowed)}")Alle Lektionen in Object Oriented Programming
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktor-Methode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDie super()-FunktionMethoden überschreibenMehrfachvererbungMethod Resolution OrderZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden
Einführung in Magic MethodsOperator-ÜberladungMagic Methods für ContainerRückblick - Eigene Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung2Dekoratoren
Einführung in DekoratorenProperty-DekoratorStatischer Methoden-DekoratorKlassenmethoden-Dekorator5Polymorphismus
Methoden-Überschreiben vertieftDuck TypingAbstrakte Klassen und MethodenInterface-DesignZusammenfassung – Formen-Rechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische und KlassenmethodenKlassendekoratorenContext Manager3Klasseneigenschaften
Instanz- vs. KlassenvariablenProperty-DekoratorenPrivate AttributeZusammenfassung – Bankkonto-Manager6Kapselung
Public, Protected, Private MemberZugriffsmodifikatorenInformation HidingProperty-Decorators für FortgeschritteneZusammenfassung - Studentenverwaltungssystem12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen