اختبار في Go (Golang): الأطر والأدوات

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

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

ابدأ الدورة

اختبار في Go (Golang): الأطر والأدوات



تم تصميم Go (Golang) منذ البداية مع مراعاة احتياجات التطوير الحديث، لذلك تحتوي المكتبة القياسية بالفعل على حزمة قوية testing. ومع ذلك، غالبًا ما تتطلب المشاريع المعقدة أدوات إضافية: الكائنات الوهمية (mocks)، التأكيدات (assertions)، نمط BDD، والتحقق من تسرب الغوروتينات. في هذه المقالة، سنستعرض الأطر والمكتبات الرئيسية للاختبار في Go، ونعرض أمثلة على الكود، ونشرح متى نستخدم كل منها.



1. الحزمة المدمجة testing



الحزمة القياسية testing هي الأساس لكل شيء. تُكتب الاختبارات في ملفات باللاحقة _test.go، ويجب أن يكون للدوال التوقيع func TestXxx(t *testing.T). مثال:



package main

import ( "testing")

func Sum(a, b int) int { return a + b}

func TestSum(t *testing.T) { result := Sum(2, 3) expected := 5 if result != expected { t.Errorf("Sum(2,3) = %d; want %d", result, expected) }}


تشغيل الاختبارات: go test ./.... لاختبارات الأداء (benchmarks) يُستخدم testing.B، وللأمثلة يُستخدم ExampleXxx.



2. مكتبة testify



Testify هي المكتبة الخارجية الأكثر شيوعًا للاختبار في Go. توفر تأكيدات (assertions) مريحة، وكائنات وهمية (mocks)، ودوال مساعدة.



التثبيت:

go get github.com/stretchr/testify


مثال مع التأكيدات:

package main

import ( "testing" "github.com/stretchr/testify/assert")

func TestSumWithTestify(t *testing.T) { result := Sum(2, 3) assert.Equal(t, 5, result, "Sum should be 5") assert.NotEqual(t, 0, result) assert.True(t, result > 0)}


تتضمن Testify أيضًا حزمة mock لإنشاء الكائنات الوهمية. مثال:

package main

import ( "testing" "github.com/stretchr/testify/mock")

// DataService — واجهة سنقوم بعمل mock لهاtype DataService interface { GetData(id int) string}

// MockDataService — هيكل mocktype MockDataService struct { mock.Mock}

func (m *MockDataService) GetData(id int) string { args := m.Called(id) return args.String(0)}

func TestGetData(t *testing.T) { mockService := new(MockDataService) mockService.On("GetData", 1).Return("result1")

result := mockService.GetData(1) assert.Equal(t, "result1", result) mockService.AssertExpectations(t)}


3. gomock — توليد الكائنات الوهمية



Gomock من Google هو إطار لتوليد الكائنات الوهمية بناءً على الواجهات. يعمل من خلال أداة mockgen.



التثبيت:

go install github.com/golang/mock/mockgen@v1.6.0


مثال على الاستخدام:

//go:generate mockgen -source=service.go -destination=mock_service.go -package=main

type Service interface { Process(data string) error}

// في الاختبار:func TestProcess(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()

mockService := NewMockService(ctrl) mockService.EXPECT().Process("test").Return(nil)

err := mockService.Process("test") assert.NoError(t, err)}


Gomock مناسب للمشاريع الكبيرة التي تحتوي على العديد من الواجهات — توليد الكود يوفر الوقت.



4. ginkgo — نمط BDD



Ginkgo هو إطار لتطوير السلوك (Behaviour-Driven Development - BDD). يسمح بكتابة الاختبارات بأسلوب "وصف" (Describe)، "سياق" (Context)، و"مواصفة" (It).



التثبيت:

go get github.com/onsi/ginkgo/v2go get github.com/onsi/gomega


مثال:

package main

import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "testing")

func TestCalculator(

توصيات