Go सबफ़ोल्डर में टेस्ट: शुरुआती के लिए पूरी गाइड

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

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

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

Go सबफ़ोल्डर में टेस्ट: वो समस्या जो ट्यूटोरियल नहीं बताते

\n\n

क्या आपने कभी Go में टेस्ट लिखे हैं और देखा है कि वे प्रोजेक्ट की रूट डायरेक्टरी में तो ठीक चलते हैं, लेकिन जैसे ही उन्हें सबफ़ोल्डर में डालते हैं, सब कुछ गड़बड़ हो जाता है? परिचित लग रहा है? अगर हाँ, तो आप अकेले नहीं हैं। Stack Overflow पर "Golang tests in sub-directory" सवाल के हज़ारों व्यूज़ हैं। और यह कोई हैरानी की बात नहीं: Go का डॉक्यूमेंटेशन इस बारे में बहुत सूखा है, और शुरुआती डेवलपर्स अक्सर कंफ्यूज़ हो जाते हैं।

\n\n

इस आर्टिकल में हम समझेंगे कि नेस्टेड पैकेज के साथ Go टेस्टिंग को सही तरीके से कैसे ऑर्गनाइज़ किया जाए, इसकी ज़रूरत क्यों है, और गलतियों से कैसे बचा जाए। चलिए शुरू करते हैं!

\n\n

सबफ़ोल्डर में टेस्ट की समस्या क्या है?

\n\n

मान लीजिए आपके पास एक प्रोजेक्ट है जिसकी संरचना इस तरह है:

\n\n
myapp/\n├── main.go\n├── go.mod\n└── utils/\n    ├── math.go\n    └── math_test.go
\n\n

आप रूट में Go test चलाते हैं - और सब कुछ ठीक काम करता है। लेकिन जब आप utils फ़ोल्डर से टेस्ट चलाने की कोशिश करते हैं, Go एरर देता है: "package myapp/utils is not in GOROOT"। यह एरर परिचित है?

\n\n

समस्या यह है कि Go पैकेज के साथ काम करता है, फ़ोल्डर के साथ नहीं। जब आप एक सबफ़ोल्डर बनाते हैं, तो आप वास्तव में एक नया पैकेज बना रहे होते हैं। और उसमें टेस्ट को प्रोजेक्ट की मॉड्यूल संरचना को ध्यान में रखकर चलाना होता है। लेकिन चलिए क्रम से समझते हैं।

\n\n

बुनियादी बातें: Go टेस्ट को कैसे देखता है

\n\n

Go में, टेस्ट सामान्य फ़ाइलें होती हैं जिनके नाम में _test.go सफ़िक्स होता है। ये हो सकती हैं:

\n
    \n
  • उसी पैकेज में (व्हाइट टेस्ट) - इनकी नॉन-एक्सपोर्टेड फ़ंक्शन तक पहुँच होती है।
  • \n
  • एक अलग पैकेज में जिसमें _test सफ़िक्स हो (ब्लैक टेस्ट) - ये पैकेज को बाहरी उपयोगकर्ता की तरह टेस्ट करते हैं।
  • \n
\n\n

जब आप टेस्ट को सबफ़ोल्डर में रखते हैं, तो आप एक नया पैकेज बना रहे होते हैं। उदाहरण के लिए, utils फ़ोल्डर एक utils पैकेज है। और उसमें टेस्ट इसी पैकेज का हिस्सा होना चाहिए।

\n\n

सही संरचना का उदाहरण

\n\n
myapp/\n├── go.mod\n├── main.go\n└── utils/\n    ├── math.go        // package utils\n    └── math_test.go   // package utils
\n\n

math.go फ़ाइल में:

\n
package utils\n\nfunc Add(a, b int) int {\n    return a + b\n}
\n\n

math_test.go फ़ाइल में:

\n
package utils\n\nimport "testing"\n\nfunc TestAdd(t *testing.T) {\n    result := Add(2, 3)\n    if result != 5 {\n        t.Errorf("Expected 5, got %d", result)\n    }\n}
\n\n

अब प्रोजेक्ट की रूट से टेस्ट चलाएँ:

\n
go test ./utils/
\n\n

या utils फ़ोल्डर से:

\n
cd utils\ngo test
\n\n

सब कुछ काम करता है! लेकिन क्या होगा अगर आपकी संरचना और जटिल हो?

\n\n

नेस्टेड सबफ़ोल्डर: जितना लगता है उससे गहरा

\n\n

मान लीजिए आपके पास इस संरचना वाला प्रोजेक्ट है:

\n\n
myapp/\n├── go.mod\n├── main.go\n└── services/\n    ├── user/\n    │   ├── user.go\n    │   └── user_test.go\n    └── order/\n        ├── order.go\n        └── order_test.go
\n\n

यहाँ हर सबफ़ोल्डर एक अलग पैकेज है। सभी टेस्ट को रिकर्सिवली चलाने के लिए, तीन डॉट का उपयोग करें:

\n\n
go test ./...
\n\n

यह कमांड प्रोजेक्ट के सभी पैकेज ढूँढ़ेगी और उनके टेस्ट चलाएगी। CI/CD के लिए यह बहुत उपयोगी है!

\n\n

अगर टेस्ट कोड के साथ एक ही फ़ोल्डर में हों तो?

\n\n

कभी-कभी डेवलपर्स टेस्ट को मुख्य कोड के साथ एक ही फ़ोल्डर में रखते हैं। छोटे प्रोजेक्ट के लिए यह ठीक है। लेकिन बड़े प्रोजेक्ट के लिए टेस्ट को अलग सबफ़ोल्डर में रखना बेहतर होता है - इससे संरचना साफ़ रहती है।

\n\n

सामान्य गलतियाँ और उनके समाधान

\n\n

आइए उन सबसे आम समस्याओं पर नज़र डालते हैं जो Golang tests in sub-directory के साथ काम करते समय शुरुआती लोगों को होती हैं।

\n\n

गलती 1: "package is not in GOROOT"

\n

कारण: आप बिना मॉड्यूल बताए सबफ़ोल्डर से टेस्ट चलाने की कोशिश कर रहे हैं। Go को नहीं पता कि पैकेज किस मॉड्यूल का हिस्सा है।

\n

समाधान: सुनिश्चित करें कि प्रोजेक्ट की रूट में go.mod फ़ाइल मौजूद है।

ब्लॉग

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