اختبار التكامل مع Go باستخدام Docker: دليل شامل
\n\nاختبار التكامل هو مرحلة حاسمة في التطوير، خاصة في عالم الميكروسيرفيسات والأنظمة الموزعة. يوفر Go (Golang) مع Docker أدوات قوية وأنيقة لإنشاء اختبارات تكامل موثوقة. في هذه المقالة، سنشرح كيفية إعداد البيئة، وكتابة اختبارات للتفاعل مع قواعد البيانات والخدمات الخارجية، باستخدام Docker، و testcontainers-go، والمكتبة القياسية testing.
1. لماذا Docker لاختبار التكامل؟
\n\nتعزل اختبارات الوحدة التقليدية (unit tests) المنطق، لكنها لا تتحقق من التفاعل مع التبعيات الحقيقية: قواعد البيانات، قوائم الانتظار، واجهات API. يحل Docker هذه المشكلة، مما يسمح بـ:
\n- \n
- عزل البيئة: كل اختبار يشغل حاوية نظيفة، مما يستبعد تعارضات الحالة. \n
- قابلية التكرار: بيئة متطابقة على الجهاز المحلي وفي CI/CD. \n
- نشر سريع: يتم تشغيل الحاويات في ثوانٍ. \n
- سهولة التنظيف: بعد الاختبار، يتم تدمير الحاوية. \n
سنستخدم مكتبة testcontainers-go — فهي توفر واجهة برمجة تطبيقات عالية المستوى لإدارة دورة حياة الحاويات مباشرة من كود الاختبارات.
2. إعداد المشروع وتثبيت التبعيات
\n\nسننشئ خادم HTTP بسيطًا بلغة Go يقوم بحفظ البيانات في PostgreSQL. ثم سنكتب اختبار تكامل يتحقق من نقطة النهاية.
\n\nهيكل المشروع:
\nmyapp/\n├── main.go\n├── go.mod\n├── go.sum\n├── handlers/\n│ └── user.go\n└── integration_test.go\n\nالخطوة 1: تهيئة الوحدة وتثبيت testcontainers:
\ngo 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:
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\n3. كتابة اختبار التكامل مع Docker
\n\nالآن الجزء الممتع — اختبار يقوم بتشغيل PostgreSQL في Docker، وإنشاء جدول، وتشغيل الخادم الخاص بنا، والتحقق من عمله.
\n\nملف integration_test.go:
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.