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

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

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

ابدأ الدورة

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



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



1. الحزمة القياسية testing



جوهر الاختبار في Go هو حزمة testing. توفر مجموعة وظائف بسيطة ولكنها فعالة جدًا. تُكتب الاختبارات في ملفات ذات اللاحقة _test.go وتكون دوالًا عادية بتوقيع func TestXxx(t *testing.T).



مثال على اختبار بسيط لدالة الجمع:



package main

import "testing"

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

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


يتم تشغيل الاختبارات باستخدام الأمر:



go test ./...


تدعم حزمة testing أيضًا:

  • الاختبارات الجدولية — للتحقق من مجموعات متعددة من بيانات الإدخال.
  • الاختبارات الفرعية (باستخدام t.Run) — للتجميع والتنفيذ المتوازي.
  • اختبارات الأداء — دوال من النوع func BenchmarkXxx(b *testing.B).
  • الأمثلة — دوال func ExampleXxx() التي تعمل أيضًا كتوثيق.


2. Testify — توسيع إمكانيات الاختبار



Testify هي واحدة من أشهر المكتبات الخارجية للاختبار في Go. توسع الحزمة القياسية testing من خلال توفير:

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


مثال على استخدام assert و suite:



package main

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

type MySuite struct { suite.Suite Value int}

func (s *MySuite) SetupTest() { s.Value = 10}

func (s *MySuite) TestValue() { assert.Equal(s.T(), 10, s.Value, "Value should be 10")}

func TestMySuite(t *testing.T) { suite.Run(t, new(MySuite))}


يجعل Testify كود الاختبار أكثر قابلية للقراءة ويقلل من كمية الكود النمطي.



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



GoMock هو إطار لإنشاء كائنات وهمية بناءً على الواجهات. يتكون من جزأين:

  • mockgen — أداة لتوليد كود الكائنات الوهمية.
  • gomock — حزمة لاستخدام الكائنات الوهمية في الاختبارات.


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



  1. نحدد الواجهة:


package main

type UserService interface { GetUser(id int) (string, error)}


  1. نولد الكائن الوهمي:


mockgen -source=user.go -destination=mock_user.go -package=main


  1. نستخدمه في الاختبار:


func TestGetUserName(t *testing.T) {    ctrl := gomock.NewController(t)    defer ctrl.Finish()

mockService := NewMockUserService(ctrl) mockService.EXPECT().GetUser(1).Return("Alice", nil)

name,

توصيات