ما هو Testify ولماذا هو مطلوب؟
\n\nTestify هي واحدة من أشهر المكتبات للاختبار في لغة Go. إنها توسع إمكانيات الحزمة القياسية testing، وتوفر للمطورين أدوات قوية لكتابة اختبارات نظيفة وقابلة للقراءة والصيانة. يحل Testify العديد من المشكلات الرئيسية التي يواجهها مطورو Go:
- \n
- تبسيط التأكيدات (assertions): بدلاً من الإنشاءات المعقدة مع
ifوt.Errorf، يقدم Testify طرقًا موجزة مثلassert.Equal. \n - وضوح الأخطاء: عند فشل الاختبار، يعرض Testify رسائل مفصلة توضح القيم المتوقعة والفعلية. \n
- إنشاء الكائنات الوهمية (mocks): الدعم المدمج للكائنات الوهمية يسمح بعزل الكود المختبر بسهولة عن التبعيات الخارجية (قواعد البيانات، عملاء HTTP، أنظمة الملفات). \n
- تجميع الاختبارات (suite): يسمح بتجميع الاختبارات في مجموعات منطقية مع إعدادات مشتركة (Setup/Teardown). \n
Testify مثالية للمشاريع من أي حجم - من الأدوات المساعدة الصغيرة إلى البنى التحتية الكبيرة للخدمات المصغرة. إنها المعيار الفعلي للاختبار في مجتمع Go.
\n\nالتثبيت
\n\nيتم تثبيت Testify كتبعية Go عادية. تأكد من أن لديك Go مثبتًا (الإصدار 1.16 أو أعلى) وتم تهيئة الوحدة النمطية (go mod init).
go get github.com/stretchr/testify\n\nبعد تنفيذ الأمر، ستتم إضافة Testify إلى ملف go.mod الخاص بك. يمكنك الآن استيرادها في ملفات الاختبار.
بداية سريعة
\n\nلنكتب اختبارًا بسيطًا لدالة تجمع رقمين. لننشئ ملف math.go:
package main\n\nfunc Add(a, b int) int {\n return a + b\n}\n\nالآن لننشئ ملف الاختبار math_test.go:
package main\n\nimport (\n "testing"\n "github.com/stretchr/testify/assert"\n)\n\nfunc TestAdd(t *testing.T) {\n result := Add(2, 3)\n expected := 5\n assert.Equal(t, expected, result, "2 + 3 يجب أن يساوي 5")\n}\n\nقم بتشغيل الاختبار:
\n\ngo test -v\n\nسترى نتيجة خضراء. إذا قمت بتغيير القيمة المتوقعة إلى 6، سيفشل الاختبار مع رسالة خطأ مفصلة.
\n\nالطرق والوظائف الأساسية
\n\n1. assert.Equal
\nالوصف: يتحقق من أن قيمتين متساويتان. يستخدم reflect.DeepEqual لمقارنة الأنواع المعقدة (المصفوفات، الهياكل، الخرائط).
المعلمات:
\n- \n
t— كائن *testing.T \n expected— القيمة المتوقعة \n actual— القيمة الفعلية \n msg(اختياري) — رسالة الخطأ \n
مثال:
\nfunc TestEqual(t *testing.T) {\n assert.Equal(t, 10, 5+5, "5+5 يجب أن يكون 10")\n assert.Equal(t, []int{1, 2, 3}, []int{1, 2, 3})\n}\n\n2. assert.NotEqual
\nالوصف: عكس Equal. يتحقق من أن القيمتين غير متساويتين.
المعلمات: مشابهة لـ Equal.
مثال:
\nfunc TestNotEqual(t *testing.T) {\n assert.NotEqual(t, 10, 5+4, "5+4 لا يساوي 10")\n}\n\n3. assert.True / assert.False
\nالوصف: يتحقق من أن التعبير صحيح (True) أو خاطئ (False).
المعلمات:
\n- \n
t— كائن *testing.T \n condition— تعبير منطقي \n msg(اختياري) — رسالة الخطأ \n
مثال:
\nfunc TestTrueFalse(t *testing.T) {\n assert.True(t, 5 > 3, "5