Testy jednostkowe (NUnit/xUnit)
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 67 z 70.
Wyzwanie
ŁatwyDokończmy projekt systemu bibliotecznego, dodając testy jednostkowe! Testowanie jest niezbędne, aby upewnić się, że kod działa poprawnie i nadal działa po wprowadzaniu zmian. Utworzysz osobny plik testowy, który sprawdzi podstawowe funkcje systemu bibliotecznego.
Kontynuuj pracę z istniejącą strukturą projektu, dodając nowy plik testowy:
Book.cs: Zachowaj klasę Book z właściwościamiId,Title,Author,IsAvailableoraz metodamiBorrow()iReturn().User.cs: Zachowaj klasę User ze śledzeniem wypożyczeń, stałąMaxBooks, metodąCanBorrow()oraz metodami do zarządzania wypożyczonymi książkami.Library.cs: Zachowaj klasę Library z logiką wypożyczania, metodami wyszukiwania oraz metodamiGetAllBooks()iGetAllUsers().LibraryTests.cs: To Twój nowy plik testowy! Utwórz klasę testową, która sprawdzi, czy system biblioteczny działa poprawnie. Napiszesz metody testowe sprawdzające różne scenariusze i informujące, czy każdy test zakończył się powodzeniem, czy niepowodzeniem.Program.cs: Punkt wejścia, który uruchamia testy i wyświetla wyniki.
Twoja klasa testowa powinna zawierać metody sprawdzające następujące scenariusze:
TestBookBorrow— sprawdź, czy wypożyczenie dostępnej książki się powiedzie i zmieni jej dostępnośćTestBookBorrowUnavailable— sprawdź, czy próba wypożyczenia już wypożyczonej książki kończy się odpowiednim niepowodzeniemTestUserBorrowingLimit— sprawdź, czy użytkownicy nie mogą wypożyczyć więcej niż 3 książekTestBookReturn— sprawdź, czy zwrot wypożyczonej książki działa poprawnieTestSearchByAuthor— sprawdź, czy wyszukiwanie według autora zwraca właściwe książki
Każda metoda testowa powinna zwracać wartość logiczną informującą, czy test zakończył się powodzeniem. Utwórz prosty moduł uruchamiający testy, który wykona wszystkie testy i wyświetli wyniki.
Otrzymasz następujące dane wejściowe:
- Liczba scenariuszy testowych do uruchomienia (1-5, odpowiadająca testom wymienionym powyżej)
Dla każdego uruchomionego testu wyświetl wynik w formacie:
{TestName}: {PASS|FAIL}Po zakończeniu wszystkich testów wyświetl podsumowanie:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Na przykład, jeśli dane wejściowe to:
3Wynik powinien być następujący:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Kolejny przykład, obejmujący wszystkie 5 testów:
5Wynik powinien być następujący:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5Każdy test powinien tworzyć nowe instancje klas Book, User i Library, aby zapewnić izolację. Dzięki temu stan jednego testu nie wpłynie na inny. Potraktuj każdy test jako samodzielną weryfikację określonego działania systemu!
Spróbuj swoich sił
using System;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Odczytaj liczbę testów do uruchomienia
int numTests = Convert.ToInt32(Console.ReadLine());
// TODO: Utwórz obiekt LibraryTests i uruchom pierwsze numTests testów
}
}
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metod12Projekt: System biblioteczny
Struktura projektuModele książki i użytkownikaLogika systemu wypożyczeńWyszukiwanie za pomocą LINQInterfejs konsolowy / interfejs administratoraTesty jednostkowe (NUnit/xUnit)Poćwicz samodzielnie: Kompilator C# online