اختبار التكامل مع Go باستخدام Docker: من الألف إلى الياء

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

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

ابدأ الدورة

اختبار التكامل مع Go باستخدام Docker: دليل شامل

\n\n

اختبار التكامل هو مرحلة حاسمة في التطوير، خاصة في عالم الميكروسيرفيسات والأنظمة الموزعة. يوفر Go (Golang) مع Docker أدوات قوية وأنيقة لإنشاء اختبارات تكامل موثوقة. في هذه المقالة، سنشرح كيفية إعداد البيئة، وكتابة اختبارات للتفاعل مع قواعد البيانات والخدمات الخارجية، باستخدام Docker، و testcontainers-go، والمكتبة القياسية testing.

\n\n

1. لماذا Docker لاختبار التكامل؟

\n\n

تعزل اختبارات الوحدة التقليدية (unit tests) المنطق، لكنها لا تتحقق من التفاعل مع التبعيات الحقيقية: قواعد البيانات، قوائم الانتظار، واجهات API. يحل Docker هذه المشكلة، مما يسمح بـ:

\n
    \n
  • عزل البيئة: كل اختبار يشغل حاوية نظيفة، مما يستبعد تعارضات الحالة.
  • \n
  • قابلية التكرار: بيئة متطابقة على الجهاز المحلي وفي CI/CD.
  • \n
  • نشر سريع: يتم تشغيل الحاويات في ثوانٍ.
  • \n
  • سهولة التنظيف: بعد الاختبار، يتم تدمير الحاوية.
  • \n
\n\n

سنستخدم مكتبة testcontainers-go — فهي توفر واجهة برمجة تطبيقات عالية المستوى لإدارة دورة حياة الحاويات مباشرة من كود الاختبارات.

\n\n

2. إعداد المشروع وتثبيت التبعيات

\n\n

سننشئ خادم HTTP بسيطًا بلغة Go يقوم بحفظ البيانات في PostgreSQL. ثم سنكتب اختبار تكامل يتحقق من نقطة النهاية.

\n\n

هيكل المشروع:

\n
myapp/\n├── main.go\n├── go.mod\n├── go.sum\n├── handlers/\n│   └── user.go\n└── integration_test.go
\n\n

الخطوة 1: تهيئة الوحدة وتثبيت testcontainers:

\n
go mod init myapp\ngo get github.com/testcontainers/testcontainers-go\ngo get github.com/testcontainers/testcontainers-go/modules/postgres\ngo get github.com/lib/pq\ngo get github.com/stretchr/testify/assert
\n\n

الخطوة 2: كتابة معالج بسيط في handlers/user.go:

\n
package handlers\n\nimport (\n    "database/sql"\n    "encoding/json"\n    "net/http"\n)\n\ntype User struct {\n    Name string `json:"name"`\n    Age  int    `json:"age"`\n}\n\nfunc CreateUser(db *sql.DB) http.HandlerFunc {\n    return func(w http.ResponseWriter, r *http.Request) {\n        var user User\n        if err := json.NewDecoder(r.Body).Decode(&user); err != nil {\n            http.Error(w, err.Error(), http.StatusBadRequest)\n            return\n        }\n        _, err := db.Exec("INSERT INTO users (name, age) VALUES ($1, $2)", user.Name, user.Age)\n        if err != nil {\n            http.Error(w, err.Error(), http.StatusInternalServerError)\n            return\n        }\n        w.WriteHeader(http.StatusCreated)\n        json.NewEncoder(w).Encode(user)\n    }\n}
\n\n

3. كتابة اختبار التكامل مع Docker

\n\n

الآن الجزء الممتع — اختبار يقوم بتشغيل PostgreSQL في Docker، وإنشاء جدول، وتشغيل الخادم الخاص بنا، والتحقق من عمله.

\n\n

ملف integration_test.go:

\n
package myapp\n\nimport (\n    "bytes"\n    "context"\n    "encoding/json"\n    "net/http"\n    "net/http/httptest"\n    "testing"\n\n    "myapp/handlers"\n\n    "github.com/lib/pq"\n    "github.com/stretchr/testify/assert"\n    "github.com/testcontainers/testcontainers-go"\n    "github.com/testcontainers/testcontainers-go/modules/postgres"\n    "github.com/testcontainers/testcontainers-go/wait"\n)\n\nfunc TestCreateUserIntegration(t *testing.T) {\n    ctx := context.Background()\n\n    // 1. تشغيل حاوية PostgreSQL\n    pgContainer, err := postgres.RunContainer(ctx,\n        testcontainers.WithImage("postgres:15-alpine"),\n        postgres.WithDatabase("testdb"),\n        postgres.WithUsername("test"),\n        postgres.                

المدونات

توصيات الكتب