Testing & Integration
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 104 von 107.
Aufgabe
EinfachLassen Sie uns unser Bibliotheksverwaltungssystem vervollständigen, indem wir Tests schreiben, die überprüfen, ob alles korrekt funktioniert! Sie erstellen eine Testdatei, die die Kernfunktionalität Ihrer Bibliothek validiert – um sicherzustellen, dass Bücher ordnungsgemäß ausgeliehen und zurückgegeben werden können und dass Fehlerbedingungen korrekt gehandhabt werden.
Sie organisieren Ihren Code in fünf Dateien:
book.go: IhreBook-Struktur mit den FeldernID,Title,Author,ISBNundAvailable. Fügen Sie denNewBook-Konstruktor hinzu, der Bücher als verfügbar initialisiert.user.go: IhreUser-Struktur mit den FeldernID,Name,EmailundBorrowedBooks. Fügen Sie denNewUser-Konstruktor hinzu.library.go: IhreLibrary-Struktur mit Maps für Bücher und Benutzer, zusammen mit den MethodenNewLibrary,AddBook,AddUser,BorrowundReturn. Die MethodeBorrowsollte Fehler für ungültige Benutzer, ungültige Bücher oder nicht verfügbare Bücher zurückgeben. Die MethodeReturnsollte Fehler für ungültige Benutzer, ungültige Bücher oder nicht ausgeliehene Bücher zurückgeben.library_test.go: Hier schreiben Sie Ihre Testfunktionen! Erstellen Sie Tests, die Folgendes überprüfen:TestBorrowSuccess— Überprüfen Sie, ob das Ausleihen eines verfügbaren Buches erfolgreich ist (kein Fehler zurückgegeben), das Buch als nicht verfügbar markiert wird und die Buch-ID zur Liste der ausgeliehenen Bücher des Benutzers hinzugefügt wird.TestBorrowUnavailable— Überprüfen Sie, ob das Ausleihen eines bereits ausgeliehenen Buches einen Fehler zurückgibt.TestBorrowInvalidUser— Überprüfen Sie, ob das Ausleihen mit einer nicht existierenden Benutzer-ID einen Fehler zurückgibt.TestReturnSuccess— Überprüfen Sie, ob die Rückgabe eines ausgeliehenen Buches erfolgreich ist, das Buch wieder verfügbar wird und die Buch-ID aus der Liste der ausgeliehenen Bücher des Benutzers entfernt wird.
Jeder Test sollte seine eigene Bibliothek mit den erforderlichen Büchern und Benutzern einrichten, die Operation ausführen und die Ergebnisse mit
t.Errorodert.Errorfprüfen, wenn Assertionen fehlschlagen.main.go: Führen Sie Ihre Tests manuell aus und berichten Sie die Ergebnisse. Lesen Sie den Namen des auszuführenden Tests (borrow_success,borrow_unavailable,borrow_invalid_useroderreturn_success). Richten Sie basierend auf dem Testnamen das entsprechende Szenario ein und geben SiePASSaus, wenn alle Assertionen erfolgreich sind, oderFAIL: [reason], wenn eine Assertion fehlschlägt.
Die folgende Eingabe wird bereitgestellt:
- Ein Testname:
borrow_success,borrow_unavailable,borrow_invalid_useroderreturn_success
Verwenden Sie für jeden Test diese Standard-Testdaten (Fixtures):
- Buch: ID
B001, TitleGo Programming, AuthorJohn Doe, ISBN123-456 - Benutzer: ID
U001, NameAlice, Emailalice@test.com
Zum Beispiel, gegeben:
borrow_successSollte Ihre Ausgabe sein:
PASSUnd gegeben:
borrow_unavailableSollte Ihre Ausgabe sein:
PASSUnd gegeben:
borrow_invalid_userSollte Ihre Ausgabe sein:
PASSUnd gegeben:
return_successSollte Ihre Ausgabe sein:
PASSFür borrow_success: Bibliothek erstellen, Buch und Benutzer hinzufügen, das Buch ausleihen, verifizieren, dass kein Fehler auftritt, verifizieren, dass das Buch nicht verfügbar ist, verifizieren, dass der Benutzer das Buch in seiner Liste der ausgeliehenen Bücher hat.
Für borrow_unavailable: Bibliothek erstellen, Buch und Benutzer hinzufügen, Available des Buches auf false setzen, Ausleihversuch unternehmen, verifizieren, dass ein Fehler zurückgegeben wird.
Für borrow_invalid_user: Bibliothek erstellen, nur das Buch hinzufügen (kein Benutzer), Ausleihversuch mit Benutzer-ID U001 unternehmen, verifizieren, dass ein Fehler zurückgegeben wird.
Für return_success: Bibliothek erstellen, Buch und Benutzer hinzufügen, das Buch zuerst ausleihen, dann zurückgeben, verifizieren, dass kein Fehler auftritt, verifizieren, dass das Buch wieder verfügbar ist, verifizieren, dass die Liste der ausgeliehenen Bücher des Benutzers leer ist.
Das Schreiben von Tests stellt sicher, dass sich Ihr Bibliothekssystem korrekt verhält, und gibt Ihnen die Sicherheit, Änderungen vorzunehmen, ohne bestehende Funktionen zu beeinträchtigen!
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
testName, _ := reader.ReadString('\n')
testName = strings.TrimSpace(testName)
// Standard-Testdaten
// Book: ID "B001", Title "Go Programming", Author "John Doe", ISBN "123-456"
// User: ID "U001", Name "Alice", Email "alice@test.com"
switch testName {
case "borrow_success":
// TODO: Testen, dass das Ausleihen eines verfügbaren Buches erfolgreich ist
// 1. Library erstellen, Buch und User hinzufügen
// 2. Das Buch ausleihen
// 3. Überprüfen: kein Fehler, Buch nicht verfügbar, User hat Buch in der Liste
// Gibt "PASS" aus, wenn alles bestanden ist, oder "FAIL: [Grund]", falls etwas fehlschlägt
fmt.Println("FAIL: not implemented")
case "borrow_unavailable":
// TODO: Testen, dass das Ausleihen eines nicht verfügbaren Buches einen Fehler zurückgibt
// 1. Library erstellen, Buch und User hinzufügen
// 2. Available des Buches auf false setzen
// 3. Versuch, das Buch auszuleihen
// 4. Überprüfen, ob ein Fehler zurückgegeben wird
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: Testen, dass das Ausleihen mit einem ungültigen User einen Fehler zurückgibt
// 1. Library erstellen, nur das Buch hinzufügen (kein User)
// 2. Versuch, mit der User-ID "U001" auszuleihen
// 3. Überprüfen, ob ein Fehler zurückgegeben wird
fmt.Println("FAIL: not implemented")
case "return_success":
// TODO: Testen, dass das Zurückgeben eines ausgeliehenen Buches erfolgreich ist
// 1. Library erstellen, Buch und User hinzufügen
// 2. Zuerst das Buch ausleihen
// 3. Das Buch zurückgeben
// 4. Überprüfen: kein Fehler, Buch verfügbar, Liste des Users ist leer
fmt.Println("FAIL: not implemented")
default:
fmt.Println("FAIL: unknown test")
}
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool12Fortgeschrittene OOP-Konzepte
Functional Options PatternBuilder-Pattern in GoMethodenverkettungTyp-Aliase vs. DefinitionenReflection-GrundlagenÜberblick zur Code-Generierung15Projekt: Bibliotheksverwaltung
Projektübersicht & StrukturBuch- und Benutzer-Structs