परिचय: Go में परीक्षण क्यों आवश्यक है
Go (Golang) को सरलता और विश्वसनीयता को ध्यान में रखकर बनाया गया था। अंतर्निहित पैकेज testing आधुनिक भाषाओं में परीक्षण लिखने के लिए सबसे अच्छे टूल्स में से एक है। यह बुनियादी परिदृश्यों के लिए तृतीय-पक्ष लाइब्रेरी की आवश्यकता नहीं रखता, लेकिन आसानी से विस्तार योग्य है। इस लेख में हम परीक्षण के तीन स्तरों को समझेंगे: यूनिट, इंटीग्रेशन और e2e। आप सीखेंगे कि इन्हें कैसे लिखें, कब उपयोग करें और कौन से टूल्स का उपयोग करें। यह सामग्री शुरुआती और अनुभवी Go-डेवलपर्स दोनों के लिए उपयोगी होगी।
1. Go में यूनिट-टेस्ट: मूलभूत आधार
यूनिट-टेस्ट अलग-अलग फंक्शन या मेथड को अलगाव में जांचते हैं। Go में इसके लिए _test.go प्रत्यय वाली फ़ाइल बनाना और TestXxx(t *testing.T) प्रकार के फंक्शन लिखना पर्याप्त है।
यूनिट-टेस्ट का सबसे सरल उदाहरण
मान लीजिए हमारे पास एक जोड़ फंक्शन है:
// 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) }}टेबल-ड्रिवन टेस्ट (Table-Driven Tests)
Go समुदाय कई मामलों की जांच के लिए टेबल टेस्ट का उपयोग करने की सलाह देता है:
func TestAddTable(t *testing.T) { tests := []struct { name string a, b int want int }{ {"positive", 2, 3, 5}, {"negative", -1, -2, -3}, {"zero", 0, 0, 0}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := Add(tt.a, tt.b); got != tt.want { t.Errorf("Add() = %d, want %d", got, tt.want) } }) }}यूनिट-टेस्ट इस कमांड से चलाए जाते हैं:
go test ./...2. इंटीग्रेशन टेस्ट: इंटरैक्शन की जांच
इंटीग्रेशन टेस्ट जांचते हैं कि सिस्टम के विभिन्न भाग एक साथ कैसे काम करते हैं: डेटाबेस, API, फ़ाइल सिस्टम। Go में इन्हें आमतौर पर बिल्ड टैग वाली अलग फ़ाइलों में या integration पैकेज में रखा जाता है।
build tags का उपयोग
टैग के साथ integration_test.go फ़ाइल बनाएं:
//go:build integration
package integration
import ( "database/sql" "testing" _ "github.com/lib/pq")
func TestDatabaseConnection(t *testing.T) { dsn := "host=localhost port=5432 user=test dbname=test sslmode=disable" db, err := sql.Open("postgres", dsn) if err != nil { t.Fatalf("Failed to open DB: %v", err) } defer db.Close()
err = db.Ping() if err != nil { t.Fatalf("Failed to ping DB: %v", err) }}केवल इंटीग्रेशन टेस्ट चलाना:
go test -tags=integration ./...टेस्ट डेटाबेस के साथ काम करना
इंटीग्रेशन टेस्ट के लिए अक्सर testcontainers-go या in-memory DB (जैसे SQLite) का उपयोग किया जाता है। testcontainers के साथ उदाहरण:
func TestWithPostgresContainer(t *testing.T) { ctx := context.Background() pgContainer, err := postgres.RunContainer(ctx, testcontainers.WithImage("postgres:15"), postgres.WithDatabase("testdb"), ) require.NoError(t, err) defer pgContainer.Terminate(ctx)
dsn, _ := pgContainer.ConnectionString(ctx) // कनेक्शन के लिए dsn का उपयोग करें}3. E2E-टेस्ट: पूरे सिस्टम की जांच
End-to-End टेस्ट उपयोगकर्ता के व्यवहार का अनुकरण करते हैं और पूरे सिस्टम को शुरू से अंत तक जांचते हैं। Go में इन्हें अक्सर net/http/httptest पैकेज का उपयोग करके HTTP-सेवाओं के लिए लिखा जाता है।
REST API के लिए E2E-टेस्ट का उदाहरण
func TestCreateUserE2E(t *testing.T) { // Z