Docker के साथ Go का एकीकरण परीक्षण: उन्नत स्तर
\n\nएकीकरण परीक्षण Go में विश्वसनीय माइक्रोसर्विसेज विकसित करने का एक महत्वपूर्ण चरण है। पृथक इकाई परीक्षण यह गारंटी नहीं देते कि आपका एप्लिकेशन बाहरी निर्भरताओं: डेटाबेस, संदेश कतारों, कैश और तृतीय-पक्ष API के साथ सही ढंग से इंटरैक्ट करता है। Docker आपको परीक्षण वातावरण में इन सेवाओं के वास्तविक उदाहरणों को चलाने की अनुमति देता है, जिससे जाँच की अधिकतम सटीकता सुनिश्चित होती है। इस लेख में, हम Docker का उपयोग करके Go अनुप्रयोगों के एकीकरण परीक्षण की उन्नत तकनीकों पर चर्चा करेंगे।
\n\nGo में एकीकरण परीक्षणों के लिए Docker क्यों महत्वपूर्ण है?
\nमॉक और स्टब (mocks/stubs) वाला पारंपरिक दृष्टिकोण केवल आपके कोड के तर्क की जाँच करता है, न कि वास्तविक DBMS या ब्रोकर के साथ संयोजन में व्यवहार की। Docker इस समस्या का समाधान करता है:
\n- \n
- पर्यावरण की पुनरुत्पादकता: परीक्षण स्थानीय और CI/CD में समान परिस्थितियों में चलते हैं। \n
- पृथक्करण: प्रत्येक परीक्षण सेट की अपनी सेवा का उदाहरण हो सकता है। \n
- कोई "जादू" नहीं: आप ठीक उसी ड्राइवर/क्लाइंट का परीक्षण कर रहे हैं जिसका उपयोग आप production में करते हैं। \n
हालाँकि, os/exec या शेल स्क्रिप्ट के माध्यम से कंटेनरों का मैन्युअल प्रबंधन जल्दी ही अस्थिर हो जाता है। testcontainers-go जैसी लाइब्रेरीज़ बचाव में आती हैं।
Go के लिए Testcontainers लाइब्रेरी: स्थापना और बुनियादी उदाहरण
\ntestcontainers-go एक Go रैपर है जो प्रोग्रामेटिक रूप से Docker कंटेनरों के जीवनचक्र का प्रबंधन करता है। यह स्वचालित रूप से इमेज डाउनलोड करता है, चलाता है, तैयार होने की प्रतीक्षा करता है और परीक्षण के बाद कंटेनरों को साफ करता है।
स्थापना
\ngo get github.com/testcontainers/testcontainers-go\ngo get github.com/testcontainers/testcontainers-go/modules/postgres\n\nबुनियादी उदाहरण: PostgreSQL के साथ परीक्षण
\npackage integration\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 TestPostgresConnection(t *testing.T) {\n ctx := context.Background()\n\n // 1. PostgreSQL कंटेनर चलाएँ\n pgContainer, err := postgres.RunContainer(ctx,\n testcontainers.WithImage("postgres:15"),\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 if err != nil {\n t.Fatal(err)\n }\n defer pgContainer.Terminate(ctx) // स्वचालित सफाई\n\n // 2. कनेक्शन स्ट्रिंग प्राप्त करें\n connStr, err := pgContainer.ConnectionString(ctx, "sslmode=disable")\n if err != nil {\n t.Fatal(err)\n }\n\n // 3. कनेक्ट करें और क्वेरी निष्पादित करें\n db, err := sql.Open("postgres", connStr)\n if err != nil {\n t.Fatal(err)\n }\n defer db.Close()\n\n if err := db.Ping(); err != nil {\n t.Fatal("डेटाबेस से कनेक्ट करने में विफल:", err)\n }\n\n // जाँचें कि हम एक तालिका बना सकते हैं और डेटा सम्मिलित कर सकते हैं\n _, err = db.Exec(`CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name TEXT)`)\n if err != nil {\n t.Fatal(err)\n }\n t.Log("PostgreSQL के साथ एकीकरण परीक्षण सफलतापूर्वक पूर्ण हुआ!")\n}\n\nउन्नत तकनीकें: समानांतर निष्पादन और कस्टम प्रतीक्षाएँ
\nजब कई परीक्षण होते हैं, तो प्रत्येक परीक्षण के लिए कंटेनरों का क्रमिक रन चलाना धीमा हो जाता है। हम Go की समानांतरता और साझा कंटेनरों का उपयोग करते हैं।
\n\nसाझा कंटेनर के साथ समानांतर परीक्षण
\nTestMain के माध्यम से पूरे पैकेज के लिए एक कंटेनर बनाएँ:
package integrat