परिचय: Go में परीक्षण क्यों महत्वपूर्ण है
Go (Golang) एक ऐसी भाषा है जो अपने डिज़ाइन से ही सरलता, प्रदर्शन और विश्वसनीयता पर केंद्रित रही है। बिल्ट-इन testing पैकेज और go test जैसे शक्तिशाली टूल्स परीक्षण लिखने को विकास का एक अभिन्न हिस्सा बनाते हैं। गुणवत्तापूर्ण परीक्षण के बिना, सबसे सुंदर कोड भी अंततः एक "नाजुक" सिस्टम में बदल जाता है जहाँ एक बदलाव सब कुछ तोड़ देता है।
इस लेख में, हम परीक्षण के तीन मुख्य स्तरों को विस्तार से समझेंगे: यूनिट, इंटीग्रेशन, और ई2ई (एंड-टू-एंड)। आप जानेंगे कि वे कैसे भिन्न हैं, उन्हें कब लागू करना है, और Go में प्रभावी परीक्षण कैसे लिखें। यह सामग्री शुरुआती और अनुभवी डेवलपर्स दोनों के लिए उपयोगी होगी जो अपने ज्ञान को व्यवस्थित करना चाहते हैं।
1. यूनिट परीक्षण
यूनिट परीक्षण परीक्षण पिरामिड की नींव हैं। वे बाहरी निर्भरताओं (डेटाबेस, नेटवर्क, फ़ाइल सिस्टम) से अलग करके व्यक्तिगत फ़ंक्शन, विधियों या मॉड्यूल के संचालन की जाँच करते हैं।
Go में यूनिट परीक्षण के मूल सिद्धांत
- अलगाव: परीक्षण किया जा रहा कोड बाहरी सेवाओं पर निर्भर नहीं होना चाहिए।
- गति: यूनिट परीक्षण मिलीसेकंड में निष्पादित होते हैं।
- निर्धारण: परीक्षण का परिणाम एक रन से दूसरे रन में नहीं बदलना चाहिए।
एक सरल यूनिट परीक्षण का उदाहरण
मान लीजिए हमारे पास दो संख्याओं को जोड़ने के लिए एक फ़ंक्शन है:
// math.gopackage math
func Add(a, b int) int { return a + b}इस फ़ंक्शन के लिए परीक्षण इस प्रकार दिखेगा:
// math_test.gopackage math
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 ./...
टेबल-ड्रिवन परीक्षण
Go समुदाय कई मामलों की जाँच के लिए टेबल-ड्रिवन परीक्षण पसंद करता है:
func TestAddTable(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 1, 2}, {0, 0, 0}, {-1, 1, 0}, {100, 200, 300}, }
for _, tt := range tests { result := Add(tt.a, tt.b) if result != tt.expected { t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, result, tt.expected) } }}सुझाव: स्पष्ट नामों के साथ नेस्टेड परीक्षण बनाने के लिए t.Run() का उपयोग करें — इससे रिपोर्ट पठनीयता में सुधार होता है।
2. इंटीग्रेशन परीक्षण
इंटीग्रेशन परीक्षण सिस्टम घटकों: डेटाबेस, API, बाहरी सेवाओं के बीच परस्पर क्रिया की जाँच करते हैं। यूनिट परीक्षणों के विपरीत, यहाँ हम वास्तविक (या लगभग-वास्तविक) निर्भरताएँ लाते हैं।
Go में इंटीग्रेशन परीक्षण की विशेषताएँ
- अक्सर पर्यावरण सेटअप की आवश्यकता होती है (जैसे, एक परीक्षण डेटाबेस)।
- यूनिट और इंटीग्रेशन परीक्षणों को अलग करने के लिए बिल्ड टैग का उपयोग कर सकते हैं।
- धीमे चलते हैं, इसलिए अलग से निष्पादित किए जाते हैं।
उदाहरण: डेटाबेस संचालन का परीक्षण (PostgreSQL)
आइए integration बिल्ड टैग के साथ एक फ़ाइल बनाएँ:
// db_test.go//go:build integration
package db
import ( "database/sql" "testing")
func TestSaveUser(t *testing.T) { // Connect to the test database dsn := "host=localhost user=test password=test dbname=testdb sslmode=disable" db, err := sql.Open("postgres", dsn) if err != nil { t.Fatalf("failed to connect to db: %v", err) } defer db.Close()
// Clean data before the test _, _ = db.Exec("TRUNCATE TABLE users")
// Execute the operation being tested user := User{Name: "Alice", Email: "alice@example.com"}