اختبار في 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(