اختبار التكامل في Go باستخدام Docker: المستوى المتقدم

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

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

ابدأ الدورة

اختبار التكامل في Go باستخدام Docker: المستوى المتقدم



اختبار التكامل هو مرحلة حاسمة في تطوير الخدمات المصغرة الموثوقة بلغة Go. الاختبارات الوحدوية المعزولة لا تضمن أن تطبيقك يتفاعل بشكل صحيح مع التبعيات الخارجية: قواعد البيانات، قوائم انتظار الرسائل، التخزين المؤقت وواجهات برمجة التطبيقات الخارجية. يتيح Docker تشغيل نسخ حقيقية من هذه الخدمات في بيئة الاختبار، مما يوفر أقصى درجات الموثوقية للفحوصات. في هذه المقالة، سنستعرض تقنيات متقدمة لاختبار التكامل لتطبيقات Go باستخدام Docker.



لماذا يعتبر Docker مهمًا لاختبارات التكامل في Go؟

النهج التقليدي باستخدام الكائنات الوهمية (mocks/stubs) يختبر فقط منطق الكود الخاص بك، وليس السلوك عند الاتصال بقاعدة بيانات حقيقية أو وسيط رسائل. يحل Docker هذه المشكلة:

  • قابلية إعادة إنتاج البيئة: يتم تشغيل الاختبارات في ظروف متطابقة محليًا وفي CI/CD.
  • العزل: يمكن أن تحتوي كل مجموعة اختبار على نسختها الخاصة من الخدمة.
  • لا "سحر": تختبر بالضبط برنامج التشغيل/العميل الذي تستخدمه في الإنتاج.

ومع ذلك، فإن الإدارة اليدوية للحاويات عبر os/exec أو نصوص shell تصبح غير مستقرة بسرعة. تأتي المكتبات مثل testcontainers-go للمساعدة.



مكتبة Testcontainers لـ Go: التثبيت ومثال أساسي

testcontainers-go هي غلاف Go يدير برمجيًا دورة حياة حاويات Docker. تقوم تلقائيًا بتنزيل الصور، تشغيلها، انتظار الجاهزية، وتنظيف الحاويات بعد الاختبار.



التثبيت

go get github.com/testcontainers/testcontainers-gogo get github.com/testcontainers/testcontainers-go/modules/postgres


مثال أساسي: اختبار مع PostgreSQL

package integration

import ( "context" "database/sql" "testing" "time"

"github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/modules/postgres" "github.com/testcontainers/testcontainers-go/wait" _ "github.com/lib/pq")

func TestPostgresConnection(t *testing.T) { ctx := context.Background()

// 1. تشغيل حاوية PostgreSQL pgContainer, err := postgres.RunContainer(ctx, testcontainers.WithImage("postgres:15"), postgres.WithDatabase("testdb"), postgres.WithUsername("user"), postgres.WithPassword("password"), testcontainers.WithWaitStrategy( wait.ForLog("database system is ready to accept connections"). WithOccurrence(2). WithStartupTimeout(30*time.Second)), ) if err != nil { t.Fatal(err) } defer pgContainer.Terminate(ctx) // التنظيف التلقائي

// 2. الحصول على سلسلة الاتصال connStr, err := pgContainer.ConnectionString(ctx, "sslmode=disable") if err != nil { t.Fatal(err) }

// 3. الاتصال وتنفيذ الاستعلام db, err := sql.Open("postgres", connStr) if err != nil { t.Fatal(err) } defer db.Close()

if err := db.Ping(); err != nil { t.Fatal("فشل الاتصال بقاعدة البيانات:", err) }

// التحقق من إمكانية إنشاء جدول وإدراج بيانات _, err = db.Exec(`CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name TEXT)`) if err != nil { t.Fatal(err) } t.Log("تم اجتياز اختبار التكامل مع PostgreSQL بنجاح!")


تقنيات متقدمة: التنفيذ المتوازي والانتظار المخصص

عندما يكون هناك العديد من الاختبارات، فإن التشغيل المتسلسل للحاويات لكل اختبار يبطئ التنفيذ. نستخدم التوازي في Go والحاويات المشتركة.



اختبارات متوازية مع حاوية مشتركة

إنشاء حاوية واحدة للحزمة بأكملها عبر TestMain:

package integrat                

المدونات

توصيات الكتب