Go के साथ Docker में इंटीग्रेशन टेस्टिंग: एडवांस्ड लेवल

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go के साथ Docker में इंटीग्रेशन टेस्टिंग: थ्योरी से एडवांस्ड प्रैक्टिस तक

\n\n

इंटीग्रेशन टेस्टिंग Go में माइक्रोसर्विसेज डेवलपमेंट का एक बेहद ज़रूरी हिस्सा है। डेटाबेस, मैसेज क्यू और बाहरी API के साथ इंटरैक्शन की जाँच किए बिना, आप "मेरी मशीन पर तो काम करता है" वाली समस्या का सामना कर सकते हैं। Docker हर टेस्ट के लिए साफ और अलग-थलग एनवायरनमेंट बनाने में मदद करता है, और एडवांस्ड तकनीकें इसे तेज़, समानांतर और बिना किसी परेशानी के करती हैं। इस आर्टिकल में हम उन रियल अप्रोचेज को समझेंगे जो सीनियर इंजीनियर इस्तेमाल करते हैं।

\n\n

1. Go में इंटीग्रेशन टेस्ट के लिए Docker क्यों है बेस्ट?

\n\n

Go एक स्टैटिक बाइनरी में कंपाइल होता है, जो इसे कंटेनरीकरण के लिए परफेक्ट बनाता है। इंटीग्रेशन टेस्टिंग में Docker तीन मुख्य समस्याओं को हल करता है:

\n
    \n
  • आइसोलेशन: हर टेस्ट को एक नया डेटाबेस या Redis मिलता है, बिना पिछले टेस्ट के "कचरे" के।
  • \n
  • रिप्रोड्यूसिबिलिटी: टेस्ट डेवलपर की मशीन, CI/CD और प्रोडक्शन पर एक जैसे ही चलते हैं।
  • \n
  • स्पीड: सही तरीके से कॉन्फ़िगर किए गए कंटेनर सेकंडों में स्टार्ट हो जाते हैं, मिनटों में नहीं।
  • \n
\n\n

शुरुआती लोगों की सबसे बड़ी गलती सभी टेस्ट के लिए एक ही कंटेनर चलाना है। इससे रेस कंडीशन और "फ्लोटिंग" बग्स होते हैं। एडवांस्ड तरीका: हर टेस्ट पैकेज या हर टेस्ट के लिए एक अलग कंटेनर।

\n\n

2. Go के लिए Testcontainers: कोड से कंटेनर मैनेज करें

\n\n

testcontainers-go लाइब्रेरी आपको Go टेस्ट से सीधे Docker कंटेनर मैनेज करने की सुविधा देती है। यह bash स्क्रिप्ट लिखने या पहले से चल रहे Docker Compose पर निर्भर रहने से कहीं बेहतर है।

\n\n

इंस्टॉलेशन:

\n
go get github.com/testcontainers/testcontainers-go\ngo get github.com/testcontainers/testcontainers-go/modules/postgres
\n\n

उदाहरण: PostgreSQL के साथ माइग्रेशन टेस्टिंग:

\n
package integration_test\n\nimport (\n    "context"\n    "database/sql"\n    "testing"\n    "time"\n\n    "github.com/testcontainers/testcontainers-go"\n    "github.com/testcontainers/testcontainers-go/modules/postgres"\n    "github.com/testcontainers/testcontainers-go/wait"\n    _ "github.com/lib/pq"\n)\n\nfunc TestUserRepository(t *testing.T) {\n    ctx := context.Background()\n\n    pgContainer, err := postgres.RunContainer(ctx,\n        testcontainers.WithImage("postgres:16-alpine"),\n        postgres.WithDatabase("testdb"),\n        postgres.WithUsername("user"),\n        postgres.WithPassword("password"),\n        testcontainers.WithWaitStrategy(\n            wait.ForLog("database system is ready to accept connections").\n                WithOccurrence(2).\n                WithStartupTimeout(30*time.Second),\n        ),\n    )\n    if err != nil {\n        t.Fatal(err)\n    }\n    defer pgContainer.Terminate(ctx)\n\n    connStr, err := pgContainer.ConnectionString(ctx, "sslmode=disable")\n    if err != nil {\n        t.Fatal(err)\n    }\n\n    db, err := sql.Open("postgres", connStr)\n    if err != nil {\n        t.Fatal(err)\n    }\n    defer db.Close()\n\n    // यहाँ माइग्रेशन और टेस्ट चलाएँ\n    _, err = db.Exec(`CREATE TABLE IF NOT EXISTS users (\n        id SERIAL PRIMARY KEY,\n        name TEXT NOT NULL\n    )`)\n    if err != nil {\n        t.Fatal(err)\n    }\n\n    // रिपॉजिटरी टेस्ट करें\n    repo := NewUserRepository(db)\n    user, err := repo.Create(ctx, "Alice")\n    if err != nil {\n        t.Fatal(err)\n    }\n    if user.Name != "Alice" {\n        t.Errorf("expected Alice, got %s", user.Name)\n    }\n}
\n\n

मुख्य बिंदु:

\n
    \n
  • WithWaitStrategy — तब तक इंतज़ार करें जब तक PostgreSQL वास्तव में तैयार न हो जाए, सिर्फ कंटेनर स्टार्ट होने का इंतज़ार न करें।
  • \n
  • defer pgContainer.Terminate(ctx) — पैनिक होने पर भी सफाई सुनिश्चित करता है।
  • \n
  • हर टेस्ट को अपना DB इंस्टेंस मिलता है — पूर्ण आइसोलेशन।
  • \n
\n\n

3. पैरेलल टेस्ट और रिसोर्स मैनेजमेंट

\n\n

Go पैरेलल टेस्ट को सपोर्ट करता है

ब्लॉग

पुस्तक अनुशंसाएँ