בדיקות ואינטגרציה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 104 מתוך 107.
אתגר
קלבואו נסגור מעגל במערכת ניהול הספרייה שלנו על ידי כתיבת בדיקות שיוודאו שהכול עובד כראוי! תיצרו קובץ בדיקות שיאמת את פונקציונליות הליבה של הספרייה שלכם: יוודא שאפשר לשאול ולהחזיר ספרים כראוי, ושמצבי שגיאה מטופלים כראוי.
תארגנו את הקוד שלכם בחמישה קבצים:
book.go: המבנהBookשלכם, עם השדותID,Title,Author,ISBNו-Available. כללו את הבנאיNewBook, שמאתחל ספרים כזמינים.user.go: המבנהUserשלכם, עם השדותID,Name,Emailו-BorrowedBooks. כללו את הבנאיNewUser.library.go: המבנהLibraryשלכם, עם מפות לספרים ולמשתמשים, וכן המתודותNewLibrary,AddBook,AddUser,Borrowו-Return. המתודהBorrowצריכה להחזיר שגיאות עבור משתמש לא תקף, ספר לא תקף או ספר שאינו זמין. המתודהReturnצריכה להחזיר שגיאות עבור משתמש לא תקף, ספר לא תקף או ספר שלא הושאל.library_test.go: כאן תכתבו את פונקציות הבדיקה שלכם! צרו בדיקות שיוודאו:TestBorrowSuccess: ודאו שהשאלת ספר זמין מצליחה (לא מוחזרת שגיאה), הספר הופך ללא זמין ומזהה הספר מתווסף לרשימת הספרים שהמשתמש שאלTestBorrowUnavailable: ודאו שניסיון לשאול ספר שכבר הושאל מחזיר שגיאהTestBorrowInvalidUser: ודאו שניסיון לשאול ספר עם מזהה משתמש שאינו קיים מחזיר שגיאהTestReturnSuccess: ודאו שהחזרת ספר שהושאל מצליחה, הספר הופך שוב לזמין ומזהה הספר מוסר מרשימת הספרים שהמשתמש שאל
כל בדיקה צריכה להגדיר ספרייה משלה עם הספרים והמשתמשים הדרושים, לבצע את הפעולה ולבדוק את התוצאות באמצעות
t.Errorאוt.Errorfכשהבדיקות נכשלות.main.go: הריצו את הבדיקות שלכם באופן ידני ודווחו על התוצאות. קראו את שם הבדיקה להרצה (borrow_success,borrow_unavailable,borrow_invalid_userאוreturn_success). בהתאם לשם הבדיקה, הגדירו את התרחיש המתאים והדפיסוPASSאם כל הבדיקות עוברות, אוFAIL: [reason]אם בדיקה כלשהי נכשלת.
הקלט הבא יסופק:
- שם בדיקה:
borrow_success,borrow_unavailable,borrow_invalid_userאוreturn_success
עבור כל בדיקה, השתמשו בנתוני הבדיקה הסטנדרטיים האלה:
- ספר: מזהה
B001, כותרתGo Programming, מחברJohn Doe, ISBN123-456 - משתמש: מזהה
U001, שםAlice, כתובת אימיילalice@test.com
לדוגמה, עבור הקלט:
borrow_successהפלט שלכם צריך להיות:
PASSועבור הקלט:
borrow_unavailableהפלט שלכם צריך להיות:
PASSועבור הקלט:
borrow_invalid_userהפלט שלכם צריך להיות:
PASSועבור הקלט:
return_successהפלט שלכם צריך להיות:
PASSעבור borrow_success: צרו ספרייה, הוסיפו ספר ומשתמש, השאילו את הספר, ודאו שלא התקבלה שגיאה, ודאו שהספר אינו זמין, וודאו שהספר מופיע ברשימת הספרים שהמשתמש שאל.
עבור borrow_unavailable: צרו ספרייה, הוסיפו ספר ומשתמש, הגדירו את Available של הספר כ-false, נסו להשאיל אותו וודאו שמוחזרת שגיאה.
עבור borrow_invalid_user: צרו ספרייה, הוסיפו רק את הספר (ללא משתמש), נסו להשאיל אותו עם מזהה המשתמש U001 וודאו שמוחזרת שגיאה.
עבור return_success: צרו ספרייה, הוסיפו ספר ומשתמש, השאילו את הספר תחילה ואז החזירו אותו, ודאו שלא התקבלה שגיאה, ודאו שהספר שוב זמין, וודאו שרשימת הספרים שהמשתמש שאל ריקה.
כתיבת בדיקות מבטיחה שמערכת הספרייה שלכם מתנהגת כראוי ומעניקה לכם ביטחון לבצע שינויים בלי לפגוע בפונקציונליות הקיימת!
נסו בעצמכם
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
testName, _ := reader.ReadString('\n')
testName = strings.TrimSpace(testName)
// נתוני בדיקה סטנדרטיים
// ספר: ID "B001", כותרת "Go Programming", מחבר "John Doe", ISBN "123-456"
// משתמש: ID "U001", שם "Alice", דוא״ל "alice@test.com"
switch testName {
case "borrow_success":
// TODO: בדוק שהשאלת ספר זמין מצליחה
// 1. צור ספרייה, הוסף ספר ומשתמש
// 2. השאל את הספר
// 3. ודא: אין שגיאה, הספר אינו זמין, והספר מופיע ברשימת המשתמש
// הדפס "PASS" אם כל הבדיקות עברו, או "FAIL: [reason]" אם אחת מהן נכשלה
fmt.Println("FAIL: not implemented")
case "borrow_unavailable":
// TODO: בדוק שהשאלת ספר שאינו זמין מחזירה שגיאה
// 1. צור ספרייה, הוסף ספר ומשתמש
// 2. הגדר את Available של הספר ל־false
// 3. נסה לשאול את הספר
// 4. ודא שמוחזרת שגיאה
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: בדקו שהשאלת ספר עם משתמש לא תקין מחזירה שגיאה
// 1. צרו ספרייה והוסיפו רק את הספר (ללא משתמש)
// 2. נסו לשאול את הספר עם מזהה המשתמש "U001"
// 3. ודאו שמוחזרת שגיאה
fmt.Println("FAIL: not implemented")
case "return_success":
// TODO: בדקו שהחזרת ספר שהושאל מצליחה
// 1. צור ספרייה, הוסף ספר ומשתמש
// 2. שאלו תחילה את הספר
// 3. החזירו את הספר
// 4. ודאו: אין שגיאה, הספר זמין, רשימת הספרים של המשתמש ריקה
fmt.Println("FAIL: not implemented")
default:
fmt.Println("FAIL: unknown test")
}
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP ב-Go
קבצים חיצונייםסביבת העבודה והמודולים של Goחבילות וייבואשמות מיוצאים לעומת שמות לא מיוצאיםמבוא ל-OOP ב-GoStructs כמחלקותהגדרת מתודות עבור Structsמקבלי Pointer לעומת Valueאתחול Structפונקציות Constructorחזרה – מחשבון פשוט4ממשקים
מבוא לממשקיםמימוש משתמעממשק כחוזהממשק ריק (any)אימות טיפוסמתג טיפוסיםהרכבת ממשקיםממשקי Stringer ו-Errorסיכום – מחשבון צורות7כימוס
שדות מיוצאים לעומת שדות לא מיוצאיםכימוס ברמת החבילהמתודות Getter ו-Setterהסתרת מידע ב-Goסיכום – רשומות תלמידים10Generics (Go 1.18 ומעלה)
מבוא ל־Genericsפרמטרים של טיפוסיםאילוצי טיפוסיםמבנים גנרייםפתרון עוקף למתודות גנריותסיכום – אוסף גנרי2העמקה בסוגים וב-Structs
סוגים בסיסיים ומורכביםהגדרות של סוגים מותאמים אישיתתגיות StructStructs אנונימייםStructs מקונניםערכי אפס וברירות מחדלסיכום – ספר אנשי קשר5קומפוזיציה במקום ירושה
למה ב-Go אין ירושהיסודות הטמעת Structקידום מתודותהטמעת כמה Structsהטמעה לעומת אגרגציההסתרת מתודות מוטמעותסיכום – היררכיית עובדים8טיפול בשגיאות ו-OOP
ממשק errorסוגי שגיאות מותאמים אישיתעטיפת שגיאות (fmt.Errorf)שגיאות Sentinelerrors.Is() ו-errors.As()Panic, Defer ו-Recoverסיכום – מנתח קבצים11ספרייה סטנדרטית ותכנות מונחה עצמים
io.Reader ו-io.Writersort.Interfaceהממשק fmt.Stringerencoding/json עם מבניםהממשק http.Handlerסיכום – מודלים של REST API3מצביעים וזיכרון
יסודות המצביעים ב-Goמצביעים למבניםהעברה לפי ערך לעומת לפי הפניההפונקציה new()איסוף אשפה ב-Goסיכום - בונה רשימה מקושרת6פולימורפיזם ב-Go
פולימורפיזם באמצעות ממשקיםטיפוס ברווז ב-Goכללי התאמה לממשקאוספים פולימורפייםהזרקת תלויותסיכום - מעבד תשלומים9מקביליות ו-OOP
יסודות GoroutinesChannels ותקשורתChannel עם חוצץ לעומת ללא חוצץפקודת Selectsync.Mutex ו-sync.RWMutexsync.WaitGroupתכנון Struct בטוח לשימוש במקבילסיכום - מאגר עובדים12מושגים מתקדמים בתכנות מונחה עצמים
דפוס האפשרויות הפונקציונליותדפוס Builder ב-Goשרשור מתודותכינויי טיפוסים לעומת הגדרותיסודות Reflectionסקירה כללית של יצירת קוד15פרויקט: ניהול ספרייה
סקירה כללית ומבנה הפרויקטמבני נתונים של ספרים ומשתמשיםתרגלו בעצמכם: קומפיילר Go אונליין