c# - मुझे यूनिट परीक्षण और वेब परीक्षण(बस वेब परीक्षण के बजाय) दोनों क्यों चाहिए?




asp.net visual-studio (8)

कोड कवरेज यह सुनिश्चित करेगा कि मैं कोड के हर कार्यात्मक टुकड़े को मार रहा हूं

"हिट" का अर्थ "परीक्षण" नहीं है

केवल वेब-परीक्षण करने की समस्या यह है कि यह केवल यह सुनिश्चित करता है कि आप कोड को दबाएं , और यह एक उच्च-स्तर पर सही प्रतीत होता है

सिर्फ इसलिए कि आपने पृष्ठ को लोड किया है, और यह क्रैश नहीं हुआ, इसका यह अर्थ नहीं है कि यह वास्तव में सही तरीके से काम करता है। यहाँ कुछ ऐसी चीजें हैं जिन्हें मैंने सामना किया है जहां 'वेब टेस्ट' कोड का 100% कवर किया गया है, फिर भी पूरी तरह से कुछ बहुत गंभीर बगों को मिट चुका है जो इकाई परीक्षण नहीं होता।

  1. पृष्ठ को कैश से सही ढंग से लोड किया गया था, लेकिन वास्तविक डाटाबेस टूट गया था
  2. पृष्ठ ने प्रत्येक वस्तु को डेटाबेस से लोड किया, लेकिन केवल पहली बार प्रदर्शित किया - यह ठीक दिखता है, हालांकि यह पूरी तरह से उत्पादन में विफल रहा है क्योंकि यह बहुत लंबा समय लगा है
  3. पृष्ठ ने एक वैध दिखने वाला नंबर दिखाया, जो वास्तव में गलत था, लेकिन यह नहीं उठाया गया क्योंकि 1000000 100000 के लिए गलती करने में आसान है
  4. पेज ने संयोग से एक वैध संख्या प्रदर्शित की - 10x50 25x20 के समान है, लेकिन एक गलत है
  5. पृष्ठ को डेटाबेस में एक लॉग प्रविष्टि जोड़ना था, लेकिन वह उपयोगकर्ता के लिए दृश्यमान नहीं है, इसलिए इसे नहीं देखा गया था।
  6. वेब-टेस्ट्स वास्तव में काम करने के लिए प्रमाणीकरण को बाधित किया गया था, इसलिए हम प्रमाणीकरण कोड में स्पष्ट बग को याद किया।

इस तरह से चीजों के सैकड़ों और उदाहरणों के साथ आने के लिए आसान है

यह सुनिश्चित करने के लिए कि आपके कोड वास्तव में कम स्तर पर करते हैं, और उसके बाद कार्यात्मक / एकीकरण (जो आप वेब को बुला रहे हैं) परीक्षाएं उन पर शीर्ष पर परीक्षण करने के लिए, यह साबित करने के लिए आपको वास्तव में काम करता है, यह सुनिश्चित करने के लिए आपको दोनों इकाई परीक्षणों की आवश्यकता है उन सभी छोटे इकाई परीक्षण वाले टुकड़ों को एकजुट किया जाता है।

मेरी वर्तमान स्थिति यह है: यदि मैं अपने एएसपी.नेट अनुप्रयोगों को वेब टेस्ट का उपयोग करके अच्छी तरह से परीक्षण करता हूं (मेरे मामले में वी.एस.नेट '088 परीक्षण उपकरण और वाटीएन, हो सकता है) के साथ कोड कवरेज और डेटा का एक व्यापक स्पेक्ट्रम, मुझे नहीं होना चाहिए व्यक्तिगत इकाई परीक्षण लिखने की जरूरत है, क्योंकि मेरे कोड को सभी परतों के माध्यम से यूआई के साथ संयोजन के रूप में परीक्षण किया जाएगा। कोड कवरेज यह सुनिश्चित करेगा कि मैं कोड के हर कार्यात्मक टुकड़े को मार रहा हूं (या अप्रयुक्त कोड प्रकट करता हूं) और मैं उस डेटा को प्रदान कर सकता हूं जो सभी अपेक्षित स्थितियों को कवर करेगा।

हालांकि, यदि आपके पास अलग राय है, तो मैं जानना चाहूंगा:

  1. इकाई परीक्षण क्या देता है जो एक परियोजना में इसे शामिल करने के प्रयास को उचित बनाता है (ध्यान रखें, मैं वैसे भी वेब परीक्षण कर रहा हूं, इसलिए कई मामलों में, यूनिट परीक्षणों को कवर कोड होगा जो पहले से ही वेब परीक्षणों को कवर किया गया है)।

  2. क्या आप संक्षिप्त कारणों के साथ विस्तार से अपने कारणों की व्याख्या कर सकते हैं? बहुत बार मैं प्रतिक्रियाओं जैसे "यह नहीं है कि इसका क्या मतलब है" या "उच्च गुणवत्ता" को बढ़ावा देता है - जो वास्तव में व्यावहारिक प्रश्न का सामना नहीं करता है, जिसे मैं सामना करना पड़ता हूं, जो कि मैं कैसे औचित्य कर सकता हूं - ठोस परिणामों के साथ-अधिक खर्च करना समय परीक्षण?


अच्छा, ध्यान केंद्रित unittests इसे फसल जब समस्याओं को खोजने और ठीक करने के लिए यह बहुत तेजी से बना। जब एक अच्छी तरह से लिखित एकता टूट जाता है, तो आपको पता है कि असफलता का मतलब क्या है और इसके कारण क्या हुआ।

इसके अलावा, वे आम तौर पर चलने के लिए तेज़ी से चल रहे हैं, जिसका अर्थ है कि आप अपने संपादन-संकलन-परीक्षण चक्र के भाग के रूप में विकास के दौरान उन्हें चलाने की अधिक संभावना रखते हैं (केवल जब आप जांच-पड़ताल करने वाले हैं)


यह इस बात पर निर्भर करता है कि एएसपी.NET अनुप्रयोग वास्तुकला कैसे है। यदि वेब पेज केवल एक अंतर्निहित व्यवसायिक लॉक परत या डेटा एक्सेस परत को हुक कर रहे हैं, तो एएसपी.नेट राज्य मॉडलों से स्वतंत्र रूप से काम करने वाला यूनिट टेस्ट डेवलपर के लिए तेज़ है और समान वेटीएन टेस्ट की तुलना में चलाया जाता है।

मैंने हाल ही में विजुअल स्टूडियो 2003 में एजीपी एफ़.पी.नेट के एक विरासत का क्षेत्र विकसित किया है, जिसमें एनयूआईएनटी के साथ परीक्षण ढांचे के रूप में है। यद्यपि पूर्व परीक्षणों में यूआई परीक्षणों के जरिये काम करना शामिल था, ताकि यह सुनिश्चित हो सके कि कार्यक्षमता सही ढंग से लागू की गई थी, परीक्षण के 90% यूआई इंटरैक्शन की आवश्यकता के कारण हुई।

केवल एकमात्र समस्या थी जो समय का अनुमान था - ट्रैफिक में डेटा का उपयोग / व्यापारिक तर्क के लिए 1 दिन लेने और यूआई निर्माण और परीक्षण के लिए 2 दिनों का कार्य करने की योजना थी। एनयूआईएनटी के साथ डाटा एक्सेस / व्यवसाय तर्क पर चल रहे विकास के उस भाग के लिए समय 1 दिन से 2 दिनों तक चला गया। यूआई विकास एक 1/2 दिन के लिए कम हो गया था।

यह अन्य कार्यों के साथ नए मॉड्यूल के साथ आवेदन में जोड़ा जा रहा है। यूनिट टेस्ट की खोज में बग तेज़ी से, और एक तरह से कम दर्दनाक (मेरे लिए) था और मुझे आशा है कि उम्मीदवार के रूप में आवेदन कार्य में अधिक आत्मविश्वास है। इससे भी बेहतर इकाई परीक्षण बहुत दोहराने योग्य हैं, क्योंकि वे किसी भी UI रीडिज़ाइन पर निर्भर नहीं करते हैं, इसलिए कम नाजुक होते हैं क्योंकि डिजाइन में बदलाव संकलन में विफल होते हैं, रनटाइम पर नहीं।


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

एकता परीक्षण (या इस मामले में "वेब" परीक्षण) भी बहुत महत्वपूर्ण हैं लेकिन यूनिट परीक्षणों की तुलना में रक्षा के बाद की पंक्ति हैं। एक एकल एकीकरण परीक्षण में इस तरह के एक विशाल संहिता को शामिल किया गया है कि जब कोई विफल रहता है, तो दोष (या संभवतः दोषों का समूह) को निर्धारित करने के लिए बहुत कुछ जांच की आवश्यकता होती है जिसके कारण विफलता का कारण होता है। यह महंगा है, विशेषकर जब आप इसे रिलीज़ करने के लिए दरवाज़े को बाहर निकालने के लिए परीक्षण करने का प्रयास कर रहे हैं। यह अधिक महंगा है कि फिक्स के साथ एक बग शुरू करने का मौका औसत पर बहुत अधिक होना और मौका है कि विफलता रिलीज के आगे परीक्षण (जो विकास चक्र के लिए बहुत महंगा है) को अवरुद्ध कर रहा है।

इसके विपरीत, जब एक यूनिट परीक्षण विफल हो जाता है, तो आपको पता है कि दोषपूर्ण कोड कहां है और आप आमतौर पर यह जानते हैं कि कोड गलत क्या कर रहा है। साथ ही, एक इकाई परीक्षण विफलता को केवल एक डेवलपर को एक ही समय पर प्रभावित करना चाहिए और कोड को चेक किए जाने से पहले तय किया जाना चाहिए।

पहले की तुलना में बग को ठीक करना हमेशा अधिक महंगा होता है हमेशा।

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


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

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


यूनिट परीक्षण आपको गति देता है और सबसे ज्यादा, पिन विफलता की सटीकता जहां एक विफलता या बग पेश किया गया है यह प्रत्येक घटक को अलग-अलग परीक्षण करने के लिए सक्षम बनाता है, जो कि हर दूसरे घटक से अलग है और आश्वासन दिया कि यह काम करना चाहिए जितना चाहिए।

उदाहरण के लिए, यदि आपके पास एक वेब टेस्ट है, तो उस सर्वर पर सेवा को वापस अजाक्स अनुरोध भेजा गया जो फिर एक डेटाबेस को मारा, जो फिर विफल हो जाता है। क्या यह जावास्क्रिप्ट, सेवा, व्यापार तर्क या डेटाबेस है जो समस्या का कारण था?

जहां आप अपने प्रत्येक सेवा की अपनी इकाई का परीक्षण करते हैं, डाटाबेस का मजाक उड़ाते / मज़बूत कर रहे हैं, या प्रत्येक व्यापारिक तर्क इकाई के रूप में, आप को पता होना चाहिए कि बग क्या है यूनिट परीक्षण कवरेज (हालांकि महत्वपूर्ण) और अलगाव के बारे में और अधिक के बारे में कम है।


लगभग दिजक्स्ट्रा के रूप में इसे कहते हैं: इकाई परीक्षणों का इस्तेमाल केवल दिखा सकता है कि सॉफ्टवेयर में दोष हैं, यह साबित करने के लिए नहीं कि यह दोष मुक्त है इसलिए, सामान्य रूप से, प्रत्येक कोड पथ को एक बार मारने (और 100% कवरेज प्राप्त करने) का परीक्षण करने के साथ कुछ नहीं करना है - यह बिटरोट को समाप्त करने में मदद करता है

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

यह एक इकाई परीक्षण लिखना बहुत आसान है जो किसी विशेष बग से ट्रिगर करता है, जो अंत-टू-एंड (वेब) परीक्षण लिखता है जो केवल वही करता है और जिस तरह से पूरी तरह से अप्रासंगिक कोड के ढेर को नहीं चलाता (जो भी असफल हो सकता है और गड़बड़ी भी कर सकता है मूल कारण विश्लेषण के साथ)


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

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

इसके अलावा, यूनिट परीक्षणों के साथ निर्भरता को बाहर निकालना बहुत आसान है जब आप पूर्ण मोर्चे के अंत को मारते हैं - जब तक कि मुझे कुछ अच्छा नहीं लगता है। (कुछ साल पहले मैंने देखा कि कैसे मजाक और वेब परीक्षण एकीकृत हो सकता है, और उस समय कोई उचित नहीं था।)





unit-testing