اختبارات Go: الوحدة، التكامل، E2E — دليل شامل

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

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

ابدأ الدورة

مقدمة: لماذا الاختبار في جو أساسي



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



1. اختبارات الوحدة في جو: الأساس



تتحقق اختبارات الوحدة من الوظائف أو الطرق الفردية بشكل منفصل. في جو، تحتاج فقط إلى إنشاء ملف باللاحقة _test.go وكتابة وظائف مثل TestXxx(t *testing.T).



مثال بسيط لاختبار وحدة



لنفترض أن لدينا دالة جمع:



// math.gopackage main

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


الاختبار الخاص بها:



// math_test.gopackage main

import "testing"

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


الاختبارات الجدولية



يوصي مجتمع جو باستخدام الاختبارات الجدولية للتحقق من الحالات المتعددة:



func TestAddTable(t *testing.T) {    tests := []struct {        name string        a, b int        want int    }{        {"positive", 2, 3, 5},        {"negative", -1, -2, -3},        {"zero", 0, 0, 0},    }    for _, tt := range tests {        t.Run(tt.name, func(t *testing.T) {            if got := Add(tt.a, tt.b); got != tt.want {                t.Errorf("Add() = %d, want %d", got, tt.want)            }        })    }}


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



go test ./...


2. اختبارات التكامل: التحقق من التفاعل



تتحقق اختبارات التكامل من كيفية عمل الأجزاء المختلفة من النظام معًا: قاعدة البيانات، واجهة برمجة التطبيقات، نظام الملفات. في جو، عادةً ما يتم وضعها في ملفات منفصلة مع علامة بناء أو في حزمة integration.



استخدام علامات البناء



أنشئ ملفًا integration_test.go مع علامة:



//go:build integration

package integration

import ( "database/sql" "testing" _ "github.com/lib/pq")

func TestDatabaseConnection(t *testing.T) { dsn := "host=localhost port=5432 user=test dbname=test sslmode=disable" db, err := sql.Open("postgres", dsn) if err != nil { t.Fatalf("Failed to open DB: %v", err) } defer db.Close()

err = db.Ping() if err != nil { t.Fatalf("Failed to ping DB: %v", err) }}


تشغيل اختبارات التكامل فقط:



go test -tags=integration ./...


العمل مع قاعدة بيانات اختبار



بالنسبة لاختبارات التكامل، غالبًا ما يتم استخدام testcontainers-go أو قواعد البيانات في الذاكرة (مثل SQLite). مثال مع testcontainers:



func TestWithPostgresContainer(t *testing.T) {    ctx := context.Background()    pgContainer, err := postgres.RunContainer(ctx,        testcontainers.WithImage("postgres:15"),        postgres.WithDatabase("testdb"),    )    require.NoError(t, err)    defer pgContainer.Terminate(ctx)

dsn, _ := pgContainer.ConnectionString(ctx) // use dsn for connection}


3. الاختبارات الشاملة: التحقق من النظام بأكمله



تحاكي الاختبارات الشاملة سلوك المستخدم وتتحقق من النظام بأكمله من البداية إلى النهاية. في جو، غالبًا ما تُكتب لخدمات HTTP باستخدام حزمة net/http/httptest.



مثال لاختبار شامل لواجهة برمجة تطبيقات REST



func TestCreateUserE2E(t *testing.T) {    // S                

المدونات

توصيات الكتب