Docker के साथ Go का एकीकरण परीक्षण: पूर्ण मार्गदर्शिका
एकीकरण परीक्षण विश्वसनीय Go अनुप्रयोगों के विकास में एक महत्वपूर्ण चरण है। यूनिट परीक्षणों के विपरीत, एकीकरण परीक्षण घटकों की परस्पर क्रिया की जाँच करते हैं: डेटाबेस, कैश, बाहरी API। Docker परीक्षण वातावरण को अलग करने की अनुमति देता है, जिससे परीक्षण प्रतिलिपि प्रस्तुत करने योग्य और होस्ट मशीन से स्वतंत्र हो जाते हैं। इस लेख में, हम सीखेंगे कि Docker के साथ Go अनुप्रयोगों का एकीकरण परीक्षण कैसे सेट अप करें - सरल कंटेनरों से लेकर Testcontainers और CI/CD के साथ उन्नत परिदृश्यों तक।
1. Go के एकीकरण परीक्षण के लिए Docker क्यों?
Go अनुप्रयोग अक्सर PostgreSQL, Redis, MongoDB या अन्य सेवाओं के साथ काम करते हैं। प्रत्येक डेवलपर मशीन और CI सर्वर पर इन निर्भरताओं को मैन्युअल रूप से सेट करना त्रुटियों का मार्ग है। Docker इस समस्या को हल करता है:
- प्रतिलिपि प्रस्तुतीकरण — स्थानीय और CI में समान वातावरण।
- अलगाव — परीक्षण होस्ट सिस्टम को दूषित नहीं करते।
- गति — कंटेनर सेकंड में शुरू हो जाते हैं।
- समानांतरता — एक साथ कई पृथक परीक्षण चलाए जा सकते हैं।
एक बुनियादी उदाहरण पर विचार करें: एक फ़ंक्शन का परीक्षण करना जो PostgreSQL में डेटा सहेजता है।
2. Docker Compose के साथ परीक्षण वातावरण सेट करना
परीक्षण डेटाबेस के लिए docker-compose.test.yml बनाएँ:
version: '3.8'services: postgres_test: image: postgres:16-alpine environment: POSTGRES_USER: test POSTGRES_PASSWORD: test POSTGRES_DB: testdb ports: - "5433:5432" # स्थानीय DB में हस्तक्षेप से बचने के लिए गैर-मानक पोर्ट का उपयोग करें tmpfs: /var/lib/postgresql/data # गति के लिए मेमोरी में डेटाGo परीक्षण में, हम os/exec के माध्यम से कंटेनर शुरू करते हैं या testcontainers-go लाइब्रेरी का उपयोग करते हैं। हम दोनों दृष्टिकोण दिखाएंगे।
2.1. परीक्षण से मैन्युअल Docker Compose लॉन्च
// main_test.gopackage main
import ( "context" "fmt" "os/exec" "testing" "time")
func setupTestDB(t *testing.T) string { t.Helper() // कंटेनर शुरू करें cmd := exec.Command("docker-compose", "-f", "docker-compose.test.yml", "up", "-d") if err := cmd.Run(); err != nil { t.Fatalf("docker-compose शुरू करने में विफल: %v", err) } // PostgreSQL के तैयार होने की प्रतीक्षा करें time.Sleep(3 * time.Second) return "postgres://test:test@localhost:5433/testdb?sslmode=disable"}
func TestSaveUser(t *testing.T) { dsn := setupTestDB(t) db, err := sql.Open("postgres", dsn) if err != nil { t.Fatal(err) } defer db.Close() // ... परीक्षण कोड}कमियाँ: मैन्युअल sleep, समानांतर परीक्षणों में जटिलता। Testcontainers का उपयोग करना बेहतर है।
2.2. Go के लिए Testcontainers
लाइब्रेरी स्थापित करें:
go get github.com/testcontainers/testcontainers-goस्वचालित कंटेनर प्रबंधन के साथ उदाहरण:
// repository_test.gopackage repository
import ( "context" "testing" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/wait" "github.com/jackc/pgx/v5/pgxpool")
func TestUserRepository_Save(t *testing.T) { ctx := context.Background()
// PostgreSQL कंटेनर का अनुरोध करें req := testcontainers.ContainerRequest{ Image: "postgres:16-alpine", ExposedPorts: []string{"5432/tcp"}, Env: map[string]string{ "POSTGRES_USER": "test", "POSTGRES_PASSWORD": "test", "POSTGRES_DB": "testdb", }, WaitingFor: wait.ForLog("database system is ready to accept connections"), }
postgres, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ ContainerRequest: req