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

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

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

ابدأ الدورة

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



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



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



الحزمة testing — أساس كل الاختبارات في Go. تُكتب الاختبارات في ملفات ذات اللاحقة _test.go. يجب أن يكون توقيع دوال الاختبار func TestXxx(t *testing.T). التشغيل — باستخدام الأمر go test.



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) }}


للاختبارات الجدولية، يُستخدم شريحة من الهياكل:



func TestSumTable(t *testing.T) {    tests := []struct {        a, b, expected int    }{        {1, 2, 3},        {0, 0, 0},        {-1, 1, 0},    }    for _, tt := range tests {        result := Sum(tt.a, tt.b)        if result != tt.expected {            t.Errorf("Sum(%d,%d) = %d; want %d", tt.a, tt.b, result, tt.expected)        }    }}


كما يتم دعم:

  • اختبارات الأداء — دوال func BenchmarkXxx(b *testing.B)، تُشغّل عبر go test -bench=.
  • الأمثلة — دوال func ExampleXxx() لتوليد التوثيق والتحقق من المخرجات.
  • الاختبارات الفرعية — t.Run("name", func(t *testing.T) {...}) للتجميع والتنفيذ المتوازي.


Testify — توسيع الإمكانيات



Testify — الإطار الأكثر شيوعًا للاختبار في Go. يضيف تأكيدات مريحة، وكائنات وهمية، ومجموعة من الأدوات المساعدة.



الحزم الرئيسية لـ Testify:

  • assert — تحقق مع رسائل خطأ مفهومة.
  • require — مثل assert، لكنه يوقف الاختبار عند الفشل.
  • mock — إنشاء والتحقق من الكائنات الوهمية.
  • suite — تجميع الاختبارات في فئات (نمط TDD).


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

// مثال على استخدام assertfunc TestSumWithTestify(t *testing.T) { assert.Equal(t, 5, Sum(2, 3)) assert.NotEqual(t, 0, Sum(-1, 1))}

// مثال على كائن وهمي مع testify/mocktype Calculator interface { Add(a, b int) int}

type MockCalculator struct { mock.Mock}

func (m *MockCalculator) Add(a, b int) int { args := m.Called(a, b) return args.Int(0)}

func TestWithMock(t *testing.T) { mockCalc := new(MockCalculator) mockCalc.On("Add", 2, 3).Return(5)

result := mockCalc.Add(2, 3) assert.Equal(t, 5, result) mockCalc.AssertExpectations(t)}


Gomock — توليد الكائنات الوهمية من الواجهات



Gomock (فرع من الأصل من Google) — أداة للتوليد التلقائي للكائنات الوهمية بناءً على الواجهات. يُستخدم مع الأداة المساعدة mockgen.



التثبيت ومثال أساسي:



// التثبيتgo install go.uber.org/mock/mockgen@latest

// توليد كائن وهمي لواجهة// mockgen -source=calculator.go -destination=mock_calculator.go -package=main

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

mockCalc := NewMockCalculator(ctrl) mock

توصيات