בדיקות יחידה (NUnit/xUnit)
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 67 מתוך 70.
אתגר
קלבואו נשלים את פרויקט מערכת הספרייה שלך באמצעות הוספת בדיקות יחידה! בדיקות חיוניות כדי לוודא שהקוד שלך פועל כראוי וממשיך לפעול כשאתה מבצע שינויים. תיצור קובץ בדיקות ייעודי שיוודא את הפונקציונליות המרכזית של מערכת הספרייה שלך.
תמשיך לעבוד עם מבנה הפרויקט הקיים שלך, ותוסיף קובץ בדיקות חדש:
Book.cs: השאר את המחלקה Book שלך עםId,Title,Author,IsAvailable, ועם המתודותBorrow()ו-Return().User.cs: השאר את המחלקה User שלך עם מעקב השאלות, הקבועMaxBooks,CanBorrow(), ומתודות לניהול ספרים שאולים.Library.cs: השאר את המחלקה Library שלך עם לוגיקת השאלה, מתודות חיפוש, והמתודותGetAllBooks()ו-GetAllUsers().LibraryTests.cs: זהו קובץ הבדיקות החדש שלך! צור מחלקת בדיקות שמוודאת שמערכת הספרייה שלך פועלת כראוי. תכתוב מתודות בדיקה שבודקות תרחישים שונים ומדווחות אם כל בדיקה עברה או נכשלה.Program.cs: נקודת הכניסה שלך, שמריצה את הבדיקות ומציגה את התוצאות.
מחלקת הבדיקות שלך צריכה לכלול מתודות שבודקות את התרחישים האלה:
TestBookBorrow- ודא שהשאלת ספר זמין מצליחה ומשנה את זמינותוTestBookBorrowUnavailable- ודא שהשאלת ספר שכבר הושאל נכשלת כראויTestUserBorrowingLimit- ודא שמשתמשים אינם יכולים לשאול יותר מ-3 ספריםTestBookReturn- ודא שהחזרת ספר שאול פועלת כראויTestSearchByAuthor- ודא שחיפוש לפי מחבר מחזיר את הספרים הנכונים
כל מתודת בדיקה צריכה להחזיר ערך בוליאני המציין אם הבדיקה עברה. צור מריץ בדיקות פשוט שמריץ את כל הבדיקות ומדפיס את התוצאות.
תקבל את הקלטים הבאים:
- מספר תרחישי הבדיקה להרצה (1-5, בהתאם לבדיקות המפורטות למעלה)
עבור כל בדיקה שמורצת, הדפס את התוצאה בפורמט:
{TestName}: {PASS|FAIL}לאחר שכל הבדיקות יסתיימו, הדפס סיכום:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}לדוגמה, אם הקלט הוא:
3הפלט צריך להיות:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3דוגמה נוספת עם כל 5 הבדיקות:
5הפלט צריך להיות:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5הבדיקות שלך צריכות ליצור מופעים חדשים של Book, User ו-Library עבור כל בדיקה, כדי להבטיח בידוד. כך המצב מבדיקה אחת לא ישפיע על בדיקה אחרת. חשוב על כל בדיקה כעל אימות עצמאי של התנהגות מסוימת במערכת שלך!
נסו בעצמכם
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Read library name
string libraryName = Console.ReadLine();
// Create a Library instance with the library name
Library library = new Library(libraryName);
// Read number of commands
int numCommands = Convert.ToInt32(Console.ReadLine());
// Process commands
for (int i = 0; i < numCommands; i++)
{
string commandLine = Console.ReadLine();
string[] parts = commandLine.Split('|');
string command = parts[0];
if (command == "ADD_BOOK")
{
string bookId = parts[1];
string bookTitle = parts[2];
string bookAuthor = parts[3];
Book book = new Book(bookId, bookTitle, bookAuthor);
library.AddBook(book);
Console.WriteLine($"Added: {bookTitle}");
}
else if (command == "ADD_USER")
{
string userName = parts[1];
int memberId = Convert.ToInt32(parts[2]);
User user = new User(userName, memberId);
library.RegisterUser(user);
Console.WriteLine($"Registered: {userName}");
}
else if (command == "BORROW")
{
string bookId = parts[1];
int memberId = Convert.ToInt32(parts[2]);
string result = library.BorrowBook(bookId, memberId);
Console.WriteLine(result);
}
else if (command == "RETURN")
{
string bookId = parts[1];
int memberId = Convert.ToInt32(parts[2]);
string result = library.ReturnBook(bookId, memberId);
Console.WriteLine(result);
}
else if (command == "SEARCH")
{
string searchType = parts[1];
List<Book> results = new List<Book>();
if (searchType == "title")
{
string searchValue = parts[2];
results = library.SearchByTitle(searchValue);
}
else if (searchType == "author")
{
string searchValue = parts[2];
results = library.GetBooksByAuthor(searchValue);
}
else if (searchType == "available")
{
results = library.GetAvailableBooks();
}
else if (searchType == "borrowed")
{
results = library.GetBorrowedBooks();
}
if (results.Count == 0)
{
Console.WriteLine("No books found");
}
else
{
foreach (Book book in results)
{
Console.WriteLine($"{book.Title} by {book.Author}");
}
}
}
else if (command == "STATUS")
{
List<Book> allBooks = library.GetAllBooks();
List<Book> availableBooks = library.GetAvailableBooks();
List<User> allUsers = library.GetAllUsers();
List<Book> borrowedBooks = library.GetBorrowedBooks();
Console.WriteLine("--- Library Status ---");
Console.WriteLine($"Total Books: {allBooks.Count}");
Console.WriteLine($"Available: {availableBooks.Count}");
Console.WriteLine($"Total Users: {allUsers.Count}");
Console.WriteLine($"Books Borrowed: {borrowedBooks.Count}");
}
}
}
}
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויות3ארכיטקטורת מחלקות
נתוני מופע לעומת נתונים סטטייםמילות המפתח 'readonly' ו-'const'שדות גיבויסיכום – מנהל חשבונות בנק12פרויקט: מערכת ספרייה
מבנה הפרויקטמודלים של ספרים ומשתמשיםלוגיקת השאלת ספריםחיפוש באמצעות LINQממשק משתמש בקונסולה / ממשק מנהלבדיקות יחידה (NUnit/xUnit)תרגלו בעצמכם: קומפיילר C# אונליין