Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الاختبار والتكامل

جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 104 من 107.

challenge icon

التحدي

سهل

لنُكمل دورة نظام إدارة المكتبة بكتابة اختبارات تتحقق من أن كل شيء يعمل بشكل صحيح! ستنشئ ملف اختبار يتحقق من الوظائف الأساسية لمكتبتك: ضمان إمكانية استعارة الكتب وإرجاعها بشكل صحيح، ومعالجة حالات الخطأ بصورة سليمة.

ستنظّم شيفرتك عبر خمسة ملفات:

  • 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، ورقم ISBN 123-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", Title "Go Programming", Author "John Doe", ISBN "123-456"
	// مستخدم: ID "U001", Name "Alice", Email "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")
	}
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت