Go में परीक्षण: Unit, Integration, E2E — पूर्ण गाइड
परीक्षण गुणवत्तापूर्ण सॉफ्टवेयर विकास का एक अनिवार्य हिस्सा है। Go (Golang) भाषा में, परीक्षण मानक लाइब्रेरी के स्तर पर ही शामिल है, जो इसे सरल और प्रभावी बनाता है। इस लेख में, हम परीक्षण के तीन मुख्य स्तरों पर चर्चा करेंगे: मॉड्यूलर (unit), एकीकरण (integration) और एंड-टू-एंड (e2e) परीक्षण। आप सीखेंगे कि उन्हें कैसे लिखें, कब उपयोग करें और कौन से उपकरण उपयोग करें।
Go में परीक्षण इतना महत्वपूर्ण क्यों है?
Go को सरलता और विश्वसनीयता पर ध्यान केंद्रित करके बनाया गया था। अंतर्निहित पैकेज testing और उपकरण go test किसी भी प्रोजेक्ट में आसानी से परीक्षण जोड़ने की अनुमति देते हैं। Go टीम का दर्शन है: "यदि कोड का परीक्षण नहीं किया गया है, तो वह काम नहीं करता।" परीक्षण मदद करता है:
- विकास के शुरुआती चरणों में त्रुटियों का पता लगाना
- कोड के रिफैक्टरिंग और रखरखाव को सरल बनाना
- फ़ंक्शन और मॉड्यूल के व्यवहार का दस्तावेज़ीकरण करना
- एप्लिकेशन की स्थिरता में विश्वास बढ़ाना
Go में Unit-परीक्षण
मॉड्यूलर परीक्षण (unit-परीक्षण) बाहरी निर्भरताओं से अलग करके अलग-अलग फ़ंक्शन, विधियों या संरचनाओं के काम की जाँच करते हैं। Go में, ये _test.go प्रत्यय वाली फ़ाइलों में लिखे जाते हैं।
Unit-परीक्षणों की मूल बातें
एक सरल उदाहरण देखें। मान लीजिए हमारे पास एक जोड़ फ़ंक्शन है:
// math.gopackage main
func Add(a, b int) int { return a + b}इस फ़ंक्शन का परीक्षण इस प्रकार दिखेगा:
// math_test.gopackage main
import "testing"
func TestAdd(t *testing.T) { result := Add(2, 3) expected := 5 if result != expected { t.Errorf("Add(2, 3) = %d; want %d", result, expected) }}परीक्षण चलाएँ: go test -v
तालिका-संचालित परीक्षण (Table-driven tests)
Go कई परिदृश्यों की जाँच के लिए तालिका-संचालित परीक्षणों के उपयोग को प्रोत्साहित करता है:
func TestAddTableDriven(t *testing.T) { tests := []struct { name string a, b int want int }{ {"positive numbers", 2, 3, 5}, {"negative numbers", -1, -2, -3}, {"zero", 0, 0, 0}, {"mixed", -5, 10, 5}, }
for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := Add(tt.a, tt.b) if got != tt.want { t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, got, tt.want) } }) }}Mock के साथ परीक्षण
unit-परीक्षणों को अलग करने के लिए अक्सर मॉक की आवश्यकता होती है। Go में, आप इंटरफ़ेस और लाइब्रेरी जैसे gomock या testify/mock का उपयोग कर सकते हैं।
// इंटरफ़ेस परिभाषित करेंtype UserRepository interface { GetUser(id int) (User, error)}
// testify का उपयोग करके परीक्षणfunc TestGetUserName(t *testing.T) { mockRepo := new(MockUserRepository) mockRepo.On("GetUser", 1).Return(User{Name: "Alice"}, nil)
service := NewUserService(mockRepo) name, err := service.GetUserName(1)
assert.NoError(t, err) assert.Equal(t, "Alice", name) mockRepo.AssertExpectations(t)}Go में एकीकरण परीक्षण
एकीकरण परीक्षण सिस्टम के घटकों के बीच बातचीत की जाँच करते हैं: डेटाबेस, API, फ़ाइल सिस्टम और अन्य बाहरी सेवाएँ। Go में, इन्हें अलग-अलग पैकेजों में रखना या build tags का उपयोग करना आम बात है।
डेटाबेस के साथ परीक्षण
DB के साथ काम करने के परीक्षण के लिए, अक्सर testcontainers या अस्थायी डेटाबेस का उपयोग किया जाता है:
// integration_test.go (build tag के साथ)//go:build integration
package integration
import ( "database/sql" "testing" _ "github.com/lib/pq")
func TestUserRepository(t *testing.T) { // परीक्षण DB से कनेक्शन db, err := sql.Open("postgres", "host=localhost port=