Go सबफ़ोल्डर में टेस्ट: वो समस्या जो ट्यूटोरियल नहीं बताते
\n\nक्या आपने कभी Go में टेस्ट लिखे हैं और देखा है कि वे प्रोजेक्ट की रूट डायरेक्टरी में तो ठीक चलते हैं, लेकिन जैसे ही उन्हें सबफ़ोल्डर में डालते हैं, सब कुछ गड़बड़ हो जाता है? परिचित लग रहा है? अगर हाँ, तो आप अकेले नहीं हैं। Stack Overflow पर "Golang tests in sub-directory" सवाल के हज़ारों व्यूज़ हैं। और यह कोई हैरानी की बात नहीं: Go का डॉक्यूमेंटेशन इस बारे में बहुत सूखा है, और शुरुआती डेवलपर्स अक्सर कंफ्यूज़ हो जाते हैं।
\n\nइस आर्टिकल में हम समझेंगे कि नेस्टेड पैकेज के साथ Go टेस्टिंग को सही तरीके से कैसे ऑर्गनाइज़ किया जाए, इसकी ज़रूरत क्यों है, और गलतियों से कैसे बचा जाए। चलिए शुरू करते हैं!
\n\nसबफ़ोल्डर में टेस्ट की समस्या क्या है?
\n\nमान लीजिए आपके पास एक प्रोजेक्ट है जिसकी संरचना इस तरह है:
\n\nmyapp/\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"। यह एरर परिचित है?
समस्या यह है कि Go पैकेज के साथ काम करता है, फ़ोल्डर के साथ नहीं। जब आप एक सबफ़ोल्डर बनाते हैं, तो आप वास्तव में एक नया पैकेज बना रहे होते हैं। और उसमें टेस्ट को प्रोजेक्ट की मॉड्यूल संरचना को ध्यान में रखकर चलाना होता है। लेकिन चलिए क्रम से समझते हैं।
\n\nबुनियादी बातें: Go टेस्ट को कैसे देखता है
\n\nGo में, टेस्ट सामान्य फ़ाइलें होती हैं जिनके नाम में _test.go सफ़िक्स होता है। ये हो सकती हैं:
- \n
- उसी पैकेज में (व्हाइट टेस्ट) - इनकी नॉन-एक्सपोर्टेड फ़ंक्शन तक पहुँच होती है। \n
- एक अलग पैकेज में जिसमें
_testसफ़िक्स हो (ब्लैक टेस्ट) - ये पैकेज को बाहरी उपयोगकर्ता की तरह टेस्ट करते हैं। \n
जब आप टेस्ट को सबफ़ोल्डर में रखते हैं, तो आप एक नया पैकेज बना रहे होते हैं। उदाहरण के लिए, utils फ़ोल्डर एक utils पैकेज है। और उसमें टेस्ट इसी पैकेज का हिस्सा होना चाहिए।
सही संरचना का उदाहरण
\n\nmyapp/\n├── go.mod\n├── main.go\n└── utils/\n ├── math.go // package utils\n └── math_test.go // package utils\n\nmath.go फ़ाइल में:
package utils\n\nfunc Add(a, b int) int {\n return a + b\n}\n\nmath_test.go फ़ाइल में:
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अब प्रोजेक्ट की रूट से टेस्ट चलाएँ:
\ngo test ./utils/\n\nया utils फ़ोल्डर से:
cd utils\ngo test\n\nसब कुछ काम करता है! लेकिन क्या होगा अगर आपकी संरचना और जटिल हो?
\n\nनेस्टेड सबफ़ोल्डर: जितना लगता है उससे गहरा
\n\nमान लीजिए आपके पास इस संरचना वाला प्रोजेक्ट है:
\n\nmyapp/\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\ngo 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 फ़ाइल मौजूद है।