Unit Testing (NUnit/xUnit)
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 67 von 70.
Aufgabe
EinfachLassen Sie uns Ihr Bibliothekssystem-Projekt abschließen, indem wir Unit-Tests hinzufügen! Testen ist unerlässlich, um sicherzustellen, dass Ihr Code korrekt funktioniert und auch bei Änderungen weiterhin funktioniert. Sie werden eine dedizierte Testdatei erstellen, die die Kernfunktionalität Ihres Bibliothekssystems überprüft.
Sie werden weiter mit Ihrer bestehenden Projektstruktur arbeiten und eine neue Testdatei hinzufügen:
Book.cs: Behalten Sie Ihre Book-Klasse mitId,Title,Author,IsAvailablesowie den MethodenBorrow()undReturn()bei.User.cs: Behalten Sie Ihre User-Klasse mit der Ausleihverfolgung, der KonstanteMaxBooks,CanBorrow()und den Methoden zur Verwaltung ausgeliehener Bücher bei.Library.cs: Behalten Sie Ihre Library-Klasse mit der Ausleihlogik, den Suchmethoden und den MethodenGetAllBooks()undGetAllUsers()bei.LibraryTests.cs: Dies ist Ihre neue Testdatei! Erstellen Sie eine Testklasse, die überprüft, ob Ihr Bibliothekssystem korrekt funktioniert. Sie werden Testmethoden schreiben, die verschiedene Szenarien prüfen und berichten, ob jeder Test bestanden wurde oder fehlgeschlagen ist.Program.cs: Ihr Einstiegspunkt, der die Tests ausführt und die Ergebnisse anzeigt.
Ihre Testklasse sollte Methoden enthalten, die diese Szenarien testen:
TestBookBorrow- Überprüfen Sie, ob das Ausleihen eines verfügbaren Buches erfolgreich ist und dessen Verfügbarkeit ändertTestBookBorrowUnavailable- Überprüfen Sie, ob das Ausleihen eines bereits ausgeliehenen Buches angemessen fehlschlägtTestUserBorrowingLimit- Überprüfen Sie, ob Benutzer nicht mehr als 3 Bücher ausleihen könnenTestBookReturn- Überprüfen Sie, ob das Zurückgeben eines ausgeliehenen Buches korrekt funktioniertTestSearchByAuthor- Überprüfen Sie, ob die Suche nach Autor die korrekten Bücher zurückgibt
Jede Testmethode sollte einen booleschen Wert zurückgeben, der angibt, ob der Test bestanden wurde. Erstellen Sie einen einfachen Test-Runner, der alle Tests ausführt und die Ergebnisse ausgibt.
Sie erhalten die folgenden Eingaben:
- Anzahl der auszuführenden Testszenarien (1-5, entsprechend der oben aufgeführten Tests)
Geben Sie für jeden ausgeführten Test das Ergebnis im folgenden Format aus:
{TestName}: {PASS|FAIL}Geben Sie nach Abschluss aller Tests eine Zusammenfassung aus:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Wenn die Eingabe zum Beispiel wie folgt lautet:
3Sollte die Ausgabe wie folgt aussehen:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Ein weiteres Beispiel mit allen 5 Tests:
5Sollte die Ausgabe wie folgt aussehen:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5Ihre Tests sollten für jeden Test neue Instanzen von Book, User und Library erstellen, um eine Isolierung zu gewährleisten. Auf diese Weise beeinflusst der Zustand eines Tests nicht den eines anderen. Betrachten Sie jeden Test als eine in sich geschlossene Überprüfung eines bestimmten Verhaltens in Ihrem System!
Probier es selbst
using System;
using Library.Tests;
class Program
{
public static void Main(string[] args)
{
// TODO: Erstelle eine Instanz von BorrowingServiceTests
// TODO: Führe jede Testmethode aus, drucke den Testnamen vor jedem Ergebnis
// Beispiel:
// Console.WriteLine("BorrowBook_WhenBookAvailable_ReturnsTrue");
// tests.BorrowBook_WhenBookAvailable_ReturnsTrue();
}
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten9Variable Argumente
Das 'params'-SchlüsselwortOptionale ParameterBenannte ArgumenteMethodenüberladung12Projekt: Bibliothekssystem
ProjektstrukturBuch- und Benutzermodelle