2010-08-11 9 views
5

ऐसा लगता है कि मुझे लगता है कि प्रत्येक इकाई परीक्षण उदाहरण अविश्वसनीय रूप से स्पष्ट और डिब्बाबंद है। चीजें जैसे कि x + 3 == 8, और क्या नहीं। मुझे बस एक कठिन समय है कि मैं यूनिट की वास्तविक दुनिया की चीजों का परीक्षण कैसे करूं, जैसे SQL क्वेरी, या यदि फॉर्म सत्यापन के लिए उपयोग किया गया regEx वास्तव में ठीक से काम कर रहा है।यूनिट परीक्षण - सिद्धांत से अभ्यास करने के लिए

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

मैं सिर्फ अधिक औपचारिक रूप में परीक्षण और डीबगिंग के अपने ही अनौपचारिक तरीके से बदलने एक कठिन समय हो रही है, पर जोर (एक्स) के परीक्षण की तरह।

उत्तर

2

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

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

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

परीक्षण करने में आसान बनाने के लिए अपने इंटरफेस को बदलकर, आप अपने आप को "तंग संयोजन" और "ढीले युग्मन" के ऑब्जेक्ट उन्मुख सिद्धांतों का बेहतर पालन करेंगे।

यूनिट परीक्षण केवल परीक्षणों के बारे में नहीं है। लेखन इकाई परीक्षण वास्तव में आपके डिजाइन में सुधार करता है। पथ के नीचे थोड़ा और प्राप्त करें, और आप टेस्ट संचालित विकास के साथ खत्म हो जाते हैं।

गुड लक!

6

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

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

जब तक आप आप अपने कोड के बारे में कैसे सोचते हैं के संदर्भ में इस मानसिकता को भली भाँति है, इकाई परीक्षण शायद कोई मतलब नहीं होगा।

+4

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

+0

+1, खासकर 'अपने कोड पर उन सिद्धांतों को मजबूर करने' के लिए। असल में, मैंने एक बार एक लेख पढ़ा जिसने सुझाव दिया कि लेखन कोड ताकि यह आसानी से यूनिट टेस्टेबल वास्तव में परीक्षणों को लागू करने से अधिक बग दरों को कम कर दे! आसानी से टेस्टेबल इकाइयों में आपके कोड को फैक्टर करने का कार्य शुद्धता को और अधिक स्पष्ट बनाता है और बग के अवसर को कम करता है। यह सोचकर कि आप कुछ कोड का परीक्षण कैसे करेंगे, आप इसे अधिक मॉड्यूलर रूप में लिखने का कारण बनते हैं। मैंने निश्चित रूप से देखा है कि मेरे कोड में। अचानक मजाक और निर्भरता इंजेक्शन सभी जगह में गिर जाते हैं। –

2

ठीक है, अगर x + 3 == 8 नहीं एक संकेत के लिए पर्याप्त है, क्या x के बारे में ==y है?

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

1

शायद एक उदाहरण से सीखना आपके लिए सबसे उपयोगी होगा। आप NerdDinner sample app पर एक नज़र डाल सकते हैं और देख सकते हैं कि यह किस तरह का परीक्षण करता है। आप MVC source code को भी देख सकते हैं और देख सकते हैं कि इसका परीक्षण कैसे किया जाता है।

संबंधित मुद्दे