Go में परीक्षण: यूनिट, इंटीग्रेशन, E2E उन्नत स्तर पर

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

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

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

परिचय: उन्नत परीक्षण Go में क्यों आवश्यक है

\n\n

Go (Golang) अपनी सरलता और अंतर्निहित परीक्षण उपकरणों के लिए प्रसिद्ध है। हालांकि, जब प्रोजेक्ट "Hello, World" से आगे बढ़ता है, तो मानक go test पर्याप्त नहीं रह जाता। उन्नत स्तर पर, डेवलपर्स को सवालों का सामना करना पड़ता है: परीक्षणों को ठीक से कैसे अलग करें, डेटाबेस के साथ काम करने का परीक्षण कैसे करें, बाहरी सेवाओं का अनुकरण कैसे करें, और पूरे एप्लिकेशन का एंड-टू-एंड सत्यापन कैसे व्यवस्थित करें।

\n\n

इस लेख में, हम परीक्षण के तीन स्तरों — यूनिट, इंटीग्रेशन और E2E — को वास्तविक अभ्यास के उदाहरणों के साथ समझेंगे। आप सीखेंगे कि मॉक, इंटीग्रेशन परीक्षणों के लिए कंटेनर और CI/CD के लिए एक विश्वसनीय पाइपलाइन कैसे बनाएं। यह सामग्री उन डेवलपर्स के लिए है जो Go की मूल बातों से पहले से परिचित हैं और अपने कोड की गुणवत्ता को एक नए स्तर पर ले जाना चाहते हैं।

\n\n

1. यूनिट-टेस्ट: अलगाव, मॉक और टेबल-ड्रिवन टेस्ट पैटर्न

\n\n

यूनिट-टेस्ट बाहरी निर्भरताओं से पूर्ण अलगाव में एक मॉड्यूल (फ़ंक्शन, मेथड) के काम की जाँच करते हैं। Go में, इसके लिए अक्सर इंटरफ़ेस और मॉकिंग लाइब्रेरीज़ जैसे testify/mock या gomock का उपयोग किया जाता है।

\n\n

1.1. परीक्षण के आधार के रूप में इंटरफ़ेस

\n\n

वास्तविक सेवा को मॉक से बदलने के लिए, कोड को किसी विशिष्ट कार्यान्वयन पर नहीं, बल्कि इंटरफ़ेस पर निर्भर होना चाहिए। आइए अधिसूचना भेजने वाली सेवा का एक उदाहरण देखें।

\n\n
// notifier.go\ntype Notifier interface {\n    Send(to string, message string) error\n}\n\ntype UserService struct {\n    Notifier Notifier\n}\n\nfunc (s *UserService) NotifyUser(userID string) error {\n    // उपयोगकर्ता का ईमेल प्राप्त करने का तर्क\n    email := userID + "@example.com"\n    return s.Notifier.Send(email, "Welcome!")\n}
\n\n

1.2. testify/mock के साथ मॉक बनाना

\n\n

लाइब्रेरी स्थापित करें: go get github.com/stretchr/testify।

\n\n
// notifier_mock.go (पैकेज user_test में)\ntype NotifierMock struct {\n    mock.Mock\n}\n\nfunc (m *NotifierMock) Send(to string, message string) error {\n    args := m.Called(to, message)\n    return args.Error(0)\n}
\n\n

1.3. टेबल-ड्रिवन टेस्ट

\n\n

यह Go में कई मामलों के परीक्षण के लिए एक मानक पैटर्न है। यह पठनीयता में सुधार करता है और नए परीक्षण जोड़ना आसान बनाता है।

\n\n
// user_service_test.go\nfunc TestNotifyUser(t *testing.T) {\n    tests := []struct {\n        name      string\n        userID    string\n        mockError error\n        expectErr bool\n    }{\n        {"success", "user1", nil, false},\n        {"fail_send", "user2", errors.New("send error"), true},\n    }\n\n    for _, tt := range tests {\n        t.Run(tt.name, func(t *testing.T) {\n            mockNotifier := new(NotifierMock)\n            service := &UserService{Notifier: mockNotifier}\n\n            mockNotifier.On("Send", tt.userID+"@example.com", "Welcome!").Return(tt.mockError)\n\n            err := service.NotifyUser(tt.userID)\n            if tt.expectErr {\n                assert.Error(t, err)\n            } else {\n                assert.NoError(t, err)\n            }\n            mockNotifier.AssertExpectations(t)\n        })\n    }\n}
\n\n

Best practice: उप-परीक्षणों के लिए t.Run का उपयोग करें — यह प्रत्येक मामले को अलग-अलग चलाने और यह देखने की अनुमति देता है कि वास्तव में कौन सा विफल हुआ।

\n\n

2. इंटीग्रेशन टेस्ट: डेटाबेस और बाहरी सेवाओं के साथ काम करना

\n\n

इंटीग्रेशन टेस्ट कई घटकों के बीच बातचीत की जाँच करते हैं: Go-कोड का डेटाबेस के साथ, API-सर्वर का कैश के साथ, आदि। मुख्य चुनौती वातावरण की स्थिति का प्रबंधन करना है। यहाँ Testcontainers मदद करते हैं।

\n\n

2.1. Go के लिए Testcontainers

\n\n

Testcontainers आपको सीधे परीक्षणों से Docker-कंटेनर शुरू करने की अनुमति देते हैं। यह प्रत्येक रन के लिए एक स्वच्छ, पृथक वातावरण प्रदान करता है।

\n\n

स्थापना: go get github.com/testcontainers/testcontainers-go

\n\n

2.2. उदाहरण: परीक्षण

ब्लॉग

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