Testify للغة Go: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو Testify ولماذا هو مطلوب؟

\n\n

Testify هي واحدة من أشهر المكتبات للاختبار في لغة Go. إنها توسع إمكانيات الحزمة القياسية testing، وتوفر للمطورين أدوات قوية لكتابة اختبارات نظيفة وقابلة للقراءة والصيانة. يحل Testify العديد من المشكلات الرئيسية التي يواجهها مطورو Go:

\n\n
    \n
  • تبسيط التأكيدات (assertions): بدلاً من الإنشاءات المعقدة مع if و t.Errorf، يقدم Testify طرقًا موجزة مثل assert.Equal.
  • \n
  • وضوح الأخطاء: عند فشل الاختبار، يعرض Testify رسائل مفصلة توضح القيم المتوقعة والفعلية.
  • \n
  • إنشاء الكائنات الوهمية (mocks): الدعم المدمج للكائنات الوهمية يسمح بعزل الكود المختبر بسهولة عن التبعيات الخارجية (قواعد البيانات، عملاء HTTP، أنظمة الملفات).
  • \n
  • تجميع الاختبارات (suite): يسمح بتجميع الاختبارات في مجموعات منطقية مع إعدادات مشتركة (Setup/Teardown).
  • \n
\n\n

Testify مثالية للمشاريع من أي حجم - من الأدوات المساعدة الصغيرة إلى البنى التحتية الكبيرة للخدمات المصغرة. إنها المعيار الفعلي للاختبار في مجتمع Go.

\n\n

التثبيت

\n\n

يتم تثبيت Testify كتبعية Go عادية. تأكد من أن لديك Go مثبتًا (الإصدار 1.16 أو أعلى) وتم تهيئة الوحدة النمطية (go mod init).

\n\n
go get github.com/stretchr/testify
\n\n

بعد تنفيذ الأمر، ستتم إضافة Testify إلى ملف go.mod الخاص بك. يمكنك الآن استيرادها في ملفات الاختبار.

\n\n

بداية سريعة

\n\n

لنكتب اختبارًا بسيطًا لدالة تجمع رقمين. لننشئ ملف math.go:

\n\n
package main\n\nfunc Add(a, b int) int {\n    return a + b\n}
\n\n

الآن لننشئ ملف الاختبار math_test.go:

\n\n
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\n
go test -v
\n\n

سترى نتيجة خضراء. إذا قمت بتغيير القيمة المتوقعة إلى 6، سيفشل الاختبار مع رسالة خطأ مفصلة.

\n\n

الطرق والوظائف الأساسية

\n\n

1. assert.Equal

\n

الوصف: يتحقق من أن قيمتين متساويتان. يستخدم reflect.DeepEqual لمقارنة الأنواع المعقدة (المصفوفات، الهياكل، الخرائط).

\n

المعلمات:

\n
    \n
  • t — كائن *testing.T
  • \n
  • expected — القيمة المتوقعة
  • \n
  • actual — القيمة الفعلية
  • \n
  • msg (اختياري) — رسالة الخطأ
  • \n
\n

مثال:

\n
func 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\n

2. assert.NotEqual

\n

الوصف: عكس Equal. يتحقق من أن القيمتين غير متساويتين.

\n

المعلمات: مشابهة لـ Equal.

\n

مثال:

\n
func TestNotEqual(t *testing.T) {\n    assert.NotEqual(t, 10, 5+4, "5+4 لا يساوي 10")\n}
\n\n

3. assert.True / assert.False

\n

الوصف: يتحقق من أن التعبير صحيح (True) أو خاطئ (False).

\n

المعلمات:

\n
    \n
  • t — كائن *testing.T
  • \n
  • condition — تعبير منطقي
  • \n
  • msg (اختياري) — رسالة الخطأ
  • \n
\n

مثال:

\n
func TestTrueFalse(t *testing.T) {\n    assert.True(t, 5 > 3, "5                    

توصيات