কম্পিউটার টিউটোরিয়াল

জটিল কোডের জন্য আপনার প্রথম ব্যাপক টেস্ট লিখুন

আপনার কোন কোডটি টেস্ট করা নেই? কি সেটি এমন জটিল পরিস্থিতি নিয়ে কাজ করে যা আপনি নিয়ন্ত্রণ করতে পারেন না? থ্রেড, কমান্ড রান করা, গিট, নেটওয়ার্কিং, অথবা UI?

ঐপগুলো সবচেয়ে আকর্ষণীয় হয় যখন সেগুলো জটিল। সেগুলোSabse खतरनाक भी होते हैं। इसीलिए जो कोड टेस्ट करना मुश्किल है, वही वह कोड है जिसे अच्छी तरह टेस्ट करने की सबसे ज्यादा जरूरत है। लेकिन ऐसा हमेशा नहीं होता।

इसके बजाय, हर बार जब आप उस कोड को छूते हैं, तो आप हल्के से छूते हैं। आप सावधानी से चलते हैं। शायद आप कुछ मैन्युअल टेस्टिंग करते हैं। और जब आप पुल रिक्वेस्ट भेजते हैं, तो आप आशा करते हैं कि आपके साथी यह न जान पाएं कि वे टेस्ट मौजूद ही नहीं हैं।

लेकिन इससे चीजें बेहतर नहीं होंगी। अगली बार—और उसके बाद हर बार—आपको वही समस्याएं, वही बग, वही तनाव झेलना पड़ेगा। आप उन चुनौतीपूर्ण टेस्टों को कैसे अंततः ऐसा बना सकते हैं जिन पर आप भरोसा कर सकें?

अपनी मानसिकता बदलें

इन टेस्टों के बारे में सबसे निराशाजनक बात क्या है? इसे लिखने में उतना समय लगेगा जितना आप सोचते हैं उससे दस गुना ज्यादा। अगर आप टेस्ट द्वारा बचाए गए समय की तुलना टेस्ट लिखने में लगने वाले समय से करें, तो यह बिल्कुल भी किफायती नहीं लगता।

लेकिन यह सिर्फ इस एक टेस्ट के बारे में नहीं है। यह आपके भविष्य के सभी टेस्टों के बारे में है।

सबसे अच्छी तरह टेस्ट किया गया कोड जो मैंने देखा है, उसके पास बहुत सपोर्ट होता है। यह सिर्फ test/models में मौजूद कोड नहीं होता। अत्यधिक टेस्ट किया गया कोड में फेक (fakes), मॉक (mocks), टेस्ट फिक्स्चर का एक अच्छा सेट, और विशेष रूप से टेस्ट के लिए कॉन्फिगरेशन विकल्प होते हैं।

वह सब लिखने और जोड़ने में समय लगता है।

लेकिन एक बार जब यह तैयार हो जाता है, तो यह बहुत अच्छा लगता है। आप एक के बाद एक टेस्ट लिख सकते हैं, अपने कोड को लेकर सहज महसूस कर सकते हैं, और अपने निवेश के बाद कितनी तेजी से आगे बढ़ सकते हैं, इसे लेकर आश्वस्त हो सकते हैं।

आप अपने द्वारा पहले से किए गए काम पर भरोसा कर सकते हैं।

तो यह सिर्फ जटिल कोड में बग रोकने के बारे में नहीं है। यह भविष्य के कोड को टुकड़े-टुकड़े करके टेस्ट करना आसान बनाने के बारे में भी है।

फिलहाल इसे एक इंटीग्रेशन टेस्ट बनाएं

कभी-कभी, हालांकि, यह मूल्य समझने के बारे में नहीं है—मैं समझता हूँ। इसके बजाय, मैं सिर्फ इसलिए अटक जाता हूँ क्योंकि मुझे समझ नहीं आता कि एक छोटा, तेज़ यूनिट टेस्ट कैसे लिखा जाए।

आप कैसे जानेंगे कि आपके डिप्लॉयमेंट टूल में सही गिट कमांड चल रहे हैं, बिना वास्तव में git चलाए? आप कैसे सुनिश्चित करेंगे कि आप एक रिमोट सर्वर को सही हेडर भेज रहे हैं?

पर्याप्त समय दिए जाने पर, आप अपने टेस्टों के लिए एक गुणवत्तापूर्ण फेक बना सकते हैं।

लेकिन जब वह सोचने के लिए बहुत ज्यादा लगता है, तो आप कुछ और आजमा सकते हैं। टेस्टिंग को दो अलग-अलग चरणों में बाँट दें: "कोड टेस्ट करें" और "मॉक लिखें।"

बस उस सर्वर को कॉल करें। बस उस कमांड को चलाएँ। क्यों?

  • शुरू करना बहुत आसान है। आप शायद उन कमांडों को मैन्युअली टेस्ट कर रहे हैं, है ना? कंसोल में चला रहे हैं, या ब्राउज़र में आजमा रहे हैं? बस उसे एक टेस्ट में कॉपी कर दें।
  • जब आप अंततः अपना मॉक या फेक लिखेंगे, तो आप इन टेस्टों का उपयोग यह सुनिश्चित करने के लिए कर सकते हैं कि आपका मॉक काम करता है। अगर आपको वास्तविक दुनिया में वही व्यवहार दिखता है जो आपके फेक से दिखता है, तो आपका फेक शायद अच्छा है!

आप शायद इन टेस्टों को हमेशा के लिए नहीं रखना चाहेंगे, हालांकि:

  • उनमें इंटीग्रेशन टेस्ट की सारी समस्याएं होती हैं। वे धीमे हो सकते हैं। उन्हें लाइव इंटरनेट कनेक्शन की आवश्यकता हो सकती है। वे भंगुर (brittle) हो सकते हैं, क्योंकि वे उस व्यवहार पर निर्भर करते हैं जिसकी आपके ऐप को वास्तव में परवाह नहीं है।
  • आप वास्तविक दुनिया में कुछ चीजों को टेस्ट नहीं कर पाएंगे। उदाहरण के लिए, जब आप दूसरे छोर पर सर्वर को नियंत्रित नहीं करते, तो विशिष्ट एरर कोड को कैसे बाध्य करेंगे?
  • आप जिस सर्वर पर निर्भर हैं, उससे ब्लॉक हो सकते हैं, और वह आपके टेस्ट (और आपके ऐप!) को तोड़ सकता है। यह वास्तव में मेरे साथ हुआ था, और यह एक बड़ी समस्या थी।

इसलिए, अपने टेस्ट को वास्तविक-विश्व इंटीग्रेशन टेस्ट के रूप में लिखना कोई स्थायी समाधान नहीं है, या यहां तक कि दीर्घकालिक भी नहीं। लेकिन उन सभी कमियों के बावजूद, यह अभी भी मददगार है। और इसे बदलने के बाद, आप इंटीग्रेशन टेस्ट को एक अलग सुइट में रख सकते हैं। इस तरह, आप हमेशा अपने कोड को वास्तविकता के विरुद्ध जांच सकते हैं, न कि केवल अपनी धारणाओं के विरुद्ध।

कुछ कोड बस टेस्ट करना कठिन होता है। विश्वसनीय टेस्ट तेजी से लिखने के लिए आवश्यक इन्फ्रास्ट्रक्चर बनाने में समय लगता है। और बहुत बार, यह इसके लायक नहीं लगता।

लेकिन जब आप उस एकल टेस्ट के बारे में सोचना बंद कर देते हैं, और अपने सभी भावी टेस्टों को आसान बनाने के मूल्य के बारे में सोचते हैं, तो जटिल कोड का टेस्ट करना बहुत अधिक प्रेरक बन जाता है। और एक बार पहला टेस्ट लिख जाने के बाद, बाकी टेस्ट जादुई रूप से बहुत आसान लगने लगते हैं।

कभी-कभी, हालांकि, वह भी पर्याप्त नहीं होता। क्या होगा यदि आप जानते हैं कि वास्तविक दुनिया में अपने कोड को कैसे काम कराना है, लेकिन यह नहीं समझ पा रहे कि इसे कैसे टेस्ट किया जाए?

जब ऐसा होता है, तो टेस्ट को ऐसी चीज के रूप में देखना बंद करें जिसे शुद्ध और अलग रखने की जरूरत है। इसके बजाय, इसे उस चीज को स्वचालित करने के तरीके के रूप में देखें जो आप पहले से मैन्युअली कर रहे हैं।

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

  1. C# কোডের জন্য ইউনিট টেস্টিং

  2. C#-এ প্রথম প্রোগ্রাম কীভাবে লিখবেন?

  3. টেস্ট-কমিট-রিভার্ট: লিগ্যাসি রুবি কোড নিরাপদে টেস্ট করার প্র্যাকটিক্যাল ওয়ার্কফ্লো

  4. আপনার টেস্ট কভারেজ কেন কমে যেতে পারে এবং কীভাবে পুনঃস্থাপন করবেন