Unit-Tests (NUnit/xUnit)
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 67 von 70.
Aufgabe
EinfachVervollständige dein Library System-Projekt, indem du Unit-Tests hinzufügst! Tests sind entscheidend, um sicherzustellen, dass dein Code korrekt funktioniert und auch bei Änderungen weiterhin funktioniert. Du wirst eine eigene Testdatei erstellen, die die Kernfunktionalität deines Bibliothekssystems überprüft.
Du arbeitest weiterhin mit deiner bestehenden Projektstruktur und fügst eine neue Testdatei hinzu:
Book.cs: Behalte deine Book-Klasse mitId,Title,Author,IsAvailablesowie den MethodenBorrow()undReturn().User.cs: Behalte deine User-Klasse mit der Nachverfolgung ausgeliehener Bücher, der KonstanteMaxBooks,CanBorrow()und Methoden zur Verwaltung ausgeliehener Bücher.Library.cs: Behalte deine Library-Klasse mit der Ausleihlogik, Suchmethoden sowie den MethodenGetAllBooks()undGetAllUsers().LibraryTests.cs: Das ist deine neue Testdatei! Erstelle eine Testklasse, die überprüft, ob dein Bibliothekssystem korrekt funktioniert. Du wirst Testmethoden schreiben, die verschiedene Szenarien prüfen und angeben, ob jeder Test bestanden wurde oder fehlgeschlagen ist.Program.cs: Dein Einstiegspunkt, der die Tests ausführt und die Ergebnisse anzeigt.
Deine Testklasse sollte Methoden enthalten, die diese Szenarien testen:
TestBookBorrow- Überprüfe, dass das Ausleihen eines verfügbaren Buches erfolgreich ist und seine Verfügbarkeit ändertTestBookBorrowUnavailable- Überprüfe, dass das Ausleihen eines bereits ausgeliehenen Buches ordnungsgemäß fehlschlägtTestUserBorrowingLimit- Überprüfe, dass Benutzer nicht mehr als 3 Bücher ausleihen könnenTestBookReturn- Überprüfe, dass die Rückgabe eines ausgeliehenen Buches korrekt funktioniertTestSearchByAuthor- Überprüfe, dass die Suche nach einem Autor die richtigen Bücher zurückgibt
Jede Testmethode sollte einen booleschen Wert zurückgeben, der angibt, ob der Test bestanden wurde. Erstelle einen einfachen Test-Runner, der alle Tests ausführt und die Ergebnisse ausgibt.
Du erhältst die folgenden Eingaben:
- Anzahl der auszuführenden Testszenarien (1-5, entsprechend den oben aufgeführten Tests)
Gib für jeden ausgeführten Test das Ergebnis in folgendem Format aus:
{TestName}: {PASS|FAIL}Gib nach Abschluss aller Tests eine Zusammenfassung aus:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Wenn die Eingabe beispielsweise lautet:
3Die Ausgabe sollte folgendermaßen aussehen:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Ein weiteres Beispiel mit allen 5 Tests:
5Die Ausgabe sollte folgendermaßen aussehen:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5Deine Tests sollten für jeden Test neue Instanzen von Book, User und Library erstellen, um eine Isolation sicherzustellen. Auf diese Weise beeinflusst der Zustand eines Tests keinen anderen. Betrachte jeden Test als eine eigenständige Überprüfung eines bestimmten Verhaltens in deinem 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. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – Schülerdaten9Variable Argumente
Das Schlüsselwort 'params'Optionale ParameterBenannte ArgumenteMethodenüberladung12Projekt: Bibliothekssystem
ProjektstrukturBuch- und BenutzermodelleLogik des AusleihsystemsLINQ für die SucheKonsolen-UI / AdministrationsoberflächeUnit-Tests (NUnit/xUnit)Übe selbstständig: Online-C#-Compiler