Tests & Integration
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 104 von 107.
Aufgabe
EinfachBringen wir unser Library Management System zum Abschluss, indem wir Tests schreiben, die überprüfen, ob alles korrekt funktioniert! Du erstellst eine Testdatei, die die Kernfunktionalität deiner Bibliothek validiert: Sie stellt sicher, dass books ordnungsgemäß ausgeliehen und zurückgegeben werden können und dass Fehlerbedingungen korrekt behandelt werden.
Du organisierst deinen Code über fünf Dateien:
book.go: DeineBook-Struktur mit den FeldernID,Title,Author,ISBNundAvailable. Füge denNewBook-Konstruktor hinzu, der books als verfügbar initialisiert.user.go: DeineUser-Struktur mit den FeldernID,Name,EmailundBorrowedBooks. Füge denNewUser-Konstruktor hinzu.library.go: DeineLibrary-Struktur mit Maps für books und users sowie den MethodenNewLibrary,AddBook,AddUser,BorrowundReturn. Die MethodeBorrowsollte bei einem ungültigen user, einem ungültigen book oder einem nicht verfügbaren book Fehler zurückgeben. Die MethodeReturnsollte bei einem ungültigen user, einem ungültigen book oder einem nicht ausgeliehenen book Fehler zurückgeben.library_test.go: Hier schreibst du deine Testfunktionen! Erstelle Tests, die Folgendes überprüfen:TestBorrowSuccess: Überprüfe, dass das Ausleihen eines verfügbaren books erfolgreich ist (kein Fehler zurückgegeben wird), das book nicht verfügbar wird und die book-ID zur borrowing-Liste des users hinzugefügt wirdTestBorrowUnavailable: Überprüfe, dass das Ausleihen eines bereits ausgeliehenen books einen Fehler zurückgibtTestBorrowInvalidUser: Überprüfe, dass das Ausleihen mit einer nicht existierenden user-ID einen Fehler zurückgibtTestReturnSuccess: Überprüfe, dass die Rückgabe eines ausgeliehenen books erfolgreich ist, das book wieder verfügbar wird und die book-ID aus der borrowing-Liste des users entfernt wird
Jeder Test sollte seine eigene Library mit den erforderlichen books und users einrichten, die Operation ausführen und die Ergebnisse mit
t.Errorodert.Errorfüberprüfen, wenn Assertions fehlschlagen.main.go: Führe deine Tests manuell aus und gib die Ergebnisse aus. Lies den auszuführenden Testnamen ein (borrow_success,borrow_unavailable,borrow_invalid_useroderreturn_success). Richte abhängig vom Testnamen das passende Szenario ein und gibPASSaus, wenn alle Assertions erfolgreich sind, oderFAIL: [reason], wenn eine Assertion fehlschlägt.
Die folgende Eingabe wird bereitgestellt:
- Ein Testname:
borrow_success,borrow_unavailable,borrow_invalid_useroderreturn_success
Verwende für jeden Test diese standardmäßigen Testdaten:
- Book: ID
B001, TitleGo Programming, AuthorJohn Doe, ISBN123-456 - User: ID
U001, NameAlice, Emailalice@test.com
Zum Beispiel bei:
borrow_successDeine Ausgabe sollte sein:
PASSUnd bei:
borrow_unavailableDeine Ausgabe sollte sein:
PASSUnd bei:
borrow_invalid_userDeine Ausgabe sollte sein:
PASSUnd bei:
return_successDeine Ausgabe sollte sein:
PASSFür borrow_success: Erstelle eine Library, füge book und user hinzu, leihe das book aus, überprüfe, dass kein Fehler aufgetreten ist, überprüfe, dass das book nicht verfügbar ist, und überprüfe, dass der user das book in seiner borrowing-Liste hat.
Für borrow_unavailable: Erstelle eine Library, füge book und user hinzu, setze Available des books auf false, versuche, es auszuleihen, und überprüfe, dass ein Fehler zurückgegeben wird.
Für borrow_invalid_user: Erstelle eine Library, füge nur das book hinzu (keinen user), versuche, es mit der user-ID U001 auszuleihen, und überprüfe, dass ein Fehler zurückgegeben wird.
Für return_success: Erstelle eine Library, füge book und user hinzu, leihe das book zuerst aus, gib es anschließend zurück, überprüfe, dass kein Fehler aufgetreten ist, überprüfe, dass das book wieder verfügbar ist, und überprüfe, dass die borrowing-Liste des users leer ist.
Das Schreiben von Tests stellt sicher, dass sich dein Library-System korrekt verhält, und gibt dir die Zuversicht, Änderungen vorzunehmen, ohne bestehende Funktionalität 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-Test-Fixtures
// Buch: ID "B001", Titel "Go Programming", Autor "John Doe", ISBN "123-456"
// Benutzer: ID "U001", Name "Alice", E-Mail "alice@test.com"
switch testName {
case "borrow_success":
// TODO: Testen, dass das Ausleihen eines verfügbaren Buchs erfolgreich ist
// 1. Bibliothek erstellen, Buch und Benutzer hinzufügen
// 2. Das Buch ausleihen
// 3. Überprüfen: kein Fehler, Buch nicht verfügbar, Benutzer hat Buch in der Liste
// Drucke "PASS", wenn alle bestanden, oder "FAIL: [reason]", wenn einer fehlschlägt
fmt.Println("FAIL: not implemented")
case "borrow_unavailable":
// TODO: Testen, dass das Ausleihen eines nicht verfügbaren Buchs einen Fehler zurückgibt
// 1. Bibliothek erstellen, Buch und Benutzer hinzufügen
// 2. Setze Available des Buchs auf false
// 3. Versuche auszuleihen
// 4. Überprüfe, dass ein Fehler zurückgegeben wird
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: Teste, dass das Ausleihen mit ungültigem Benutzer einen Fehler zurückgibt
// 1. Erstelle Bibliothek, füge nur das Buch hinzu (kein Benutzer)
// 2. Versuche mit Benutzer-ID "U001" auszuleihen
// 3. Überprüfe, dass ein Fehler zurückgegeben wird
fmt.Println("FAIL: not implemented")
case "return_success":
// TODO: Teste, dass das Zurückgeben eines ausgeliehenen Buches erfolgreich ist
// 1. Bibliothek erstellen, Buch und Benutzer hinzufügen
// 2. Leihe das Buch zuerst aus
// 3. Gib das Buch zurück
// 4. Überprüfe: kein Fehler, Buch verfügbar, Liste des Benutzers leer
fmt.Println("FAIL: not implemented")
default:
fmt.Println("FAIL: unknown test")
}
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP in Go
Externe DateienGo-Workspace & ModulePackages & ImportsExportierte vs. nicht exportierte NamenEinführung in OOP mit GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktorfunktionenRückblick – Einfacher Taschenrechner4Schnittstellen
Einführung in SchnittstellenImplizite ImplementierungSchnittstelle als VertragLeere Schnittstelle (any)TypzusicherungTypwechselZusammensetzung von SchnittstellenStringer- und Error-SchnittstellenRückblick – Formenrechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf PaketebeneGetter- und Setter-MethodenInformationsverbergung in GoRückblick – Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterTypbeschränkungenGenerische StrukturenWorkaround für generische MethodenZusammenfassung – Generische Sammlung2Typen & Structs im Detail
Grundlegende & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct-TagsAnonyme StructsVerschachtelte StructsNullwerte & StandardwerteRückblick – Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen der Struct-EinbettungMethoden-PromotionMehrere Structs einbettenEinbettung vs. AggregationVerbergen eingebetteter MethodenRückblick – Mitarbeiterhierarchie8Fehlerbehandlung & OOP
Das Error-InterfaceBenutzerdefinierte FehlertypenError-Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverRückblick – Dateiparser3Zeiger & Speicher
Grundlagen von Zeigern in GoZeiger auf StructsÜbergabe per Wert vs. ReferenzDie Funktion new()Garbage Collection in GoRückblick – Verkettete Liste erstellen6Polymorphismus in Go
Polymorphismus über InterfacesDuck-Typing in GoRegeln zur Interface-ErfüllungPolymorphe SammlungenDependency InjectionZusammenfassung – Zahlungsprozessor9Konkurrenz & OOP
Grundlagen der GoroutinesChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignRückblick – Worker Pool12Fortgeschrittene OOP-Konzepte
Functional-Options-PatternBuilder-Pattern in GoMethod ChainingTyp-Aliase vs. DefinitionenGrundlagen der ReflectionÜberblick über Codegenerierung15Projekt: Bibliotheksverwaltung
Projektübersicht & StrukturBuch- und Benutzer-StructsÜbe selbstständig: Online-Go-Compiler