2009-05-09 13 views
41

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

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

क्या मैं इस गलत तरीके से सोच रहा हूं?

उदाहरण के लिए मिल संपर्क प्रबंधन अनुप्रयोग का एक रन लें। हमारे पास संपर्क हैं, और मान लें कि हम संपर्कों को संदेश भेज सकते हैं। इसलिए हमारे पास दो इकाइयां हैं: Contact और Message, प्रत्येक सामान्य गुणों के साथ (जैसे पहला नाम, अंतिम नाम, संपर्क के लिए ईमेल, और विषय और शरीर और संदेश के लिए तिथि)। यदि इन वस्तुओं में से कोई भी वास्तविक व्यवहार नहीं है या किसी तर्क को करने की आवश्यकता है, तो इस तरह के ऐप को डिज़ाइन करते समय आप टीडीडी कैसे लागू करते हैं? ऐप का एकमात्र उद्देश्य मूल रूप से संपर्कों की सूची खींचना और उन्हें एक पृष्ठ पर प्रदर्शित करना, संदेश भेजने के लिए एक फॉर्म प्रदर्शित करना है, और इसी तरह। मुझे यहां किसी भी तरह के उपयोगी परीक्षण नहीं दिख रहे हैं - मैं कुछ परीक्षणों के बारे में सोच सकता हूं लेकिन वे कहने के लिए बहुत अधिक परीक्षण करेंगे "देखें, मेरे पास परीक्षण हैं!" वास्तव में किसी प्रकार के तर्क का परीक्षण करने के बजाय (रेल पर रूबी इसका अच्छा उपयोग करता है, लेकिन मैं वास्तव में "उपयोगी" परीक्षण होने के लिए परीक्षण सत्यापन पर विचार नहीं करता क्योंकि यह आपके लिए कुछ ढांचा का ख्याल रखना चाहिए)

+14

मुझे बस कहना होगा ... मैं * प्यार * का शीर्षक सवाल। – Shog9

+1

यह एक बहुत अच्छा सवाल है। मेरा मानना ​​है कि ज्यादातर समय जब हमने टीडीडी की लागत-औचित्य पर तर्क सुना, तो वे वास्तव में सीआरयूडी जैसे आवेदन के बारे में बात करते हैं। – Sake

+4

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

उत्तर

14

"ऐप का एकमात्र उद्देश्य मूल रूप से संपर्कों की सूची खींचने के लिए है"

ठीक है। परीक्षण करें कि। "खींच" मतलब क्या है? यह "तर्क" की तरह लगता है।

"उन्हें एक पृष्ठ पर प्रदर्शित करें"

ठीक है। परीक्षण करें कि। सही प्रदर्शित होते हैं? सब कुछ वहाँ है?

"एक रूप को प्रदर्शित संदेश, भेजने के लिए"

ठीक है। परीक्षण करें कि। सही खेतों? इनपुट के सत्यापन सभी काम करते हैं?

"और जैसा।"

ठीक है। परीक्षण करें कि। क्या प्रश्न काम करते हैं? सही डेटा खोजें? सही डेटा प्रदर्शित करें? इनपुट मान्य करें? अमान्य इनपुट के लिए सही त्रुटि संदेश तैयार करें?

+0

@ एसएलओटी टीडीडी के विपरीत एक यूनिट स्तर पर आपका वर्णन यहां अधिक व्यवहार प्रकार परीक्षण है। मैं मानता हूं कि आपके द्वारा उल्लेख किए गए प्रत्येक क्षेत्र में इकाई परीक्षणों के लिए प्रमुख उम्मीदवार हैं। –

+0

यदि वे टेस्टेबल फॉर्म में "पुल" को परिभाषित करते हैं, तो परीक्षण "पुल" के डिज़ाइन को चलाते हैं। यदि वे कुछ टेस्टेबल परिणाम के संदर्भ में "उन्हें किसी पृष्ठ पर प्रदर्शित करते हैं" को परिभाषित करते हैं, तो परीक्षण "प्रदर्शन" के डिज़ाइन को चलाते हैं। यह मुझे टीडीडी की तरह लगता है। –

+0

मैं इस बात से सहमत हूं कि जब तक परीक्षण डिज़ाइन को चलाता है और व्यवहार का परीक्षण नहीं करता है। –

1

मैं देख रहा हूं कि आप क्या कह रहे हैं, लेकिन अंततः आपके मॉडल पर्याप्त रूप से उन्नत हो जाएंगे कि उन्हें स्वचालित परीक्षण (या अत्यधिक बढ़ाया जाना चाहिए) स्वचालित परीक्षण होगा। यदि नहीं, तो आप जो अनिवार्य रूप से विकास कर रहे हैं वह एक स्प्रेडशीट है जिसे किसी ने आपके लिए पहले ही विकसित कर लिया है।

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

+0

मैं रेल का उपयोग नहीं कर रहा हूं, लेकिन मैंने इसे एक उदाहरण के रूप में उपयोग किया क्योंकि इसमें "बेक इन" परीक्षण है और यही ट्यूटोरियल सामान्य रूप से कहता है कि आपको परीक्षण करना चाहिए। हालांकि मैं आपका पॉइंट देखता हूं। –

5

मैं एक शुद्ध CRUD आवेदन पर काम कर रहा हूँ अभी लेकिन मैं यूनिट टेस्ट केस के लाभ के बहुत सारे देखना (नोट- मैं TDD नहीं कहा)

मैं कोड के पहले और तो परीक्षण मामलों लिखना - लेकिन कभी भी अलग नहीं - जल्द ही पर्याप्त

और मैं सीआरयूडी संचालन का परीक्षण करता हूं - डेटाबेस के साथ भी दृढ़ता।

जब मैं दृढ़ता से किया जाता हूं - और यूआई परत पर जाता हूं- मुझे विश्वास होगा कि मेरी सेवा \ दृढ़ता परत अच्छी है- और फिर मैं उस समय केवल यूआई पर ध्यान केंद्रित कर सकता हूं।

तो IMHO- वहाँ हमेशा TDD \ इकाई परीक्षण के लाभ (जो भी आप कैसे चरम आप इसके बारे में लग रहा है पर निर्भर करता है यह कहते हैं) है - भले CRUD आवेदन के लिए तुम सिर्फ अपने आवेदन तक- और सही रणनीति खोजने की जरूरत है

बस सामान्य ज्ञान का उपयोग करें .... और आप ठीक होंगे।

1

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

2

बस एक विचार ...

परीक्षण मामलों बनाने के लिए watij या watir या AutoIt तरह CRUD के लिए आवश्यकताओं, औजारों का उपयोग करता है। परीक्षण मामलों को पारित करने के लिए यूआई बनाने शुरू करें। एक बार जब आपके पास UI हो और पास हो तो केवल एक परीक्षण हो, उस परीक्षण के लिए तर्क परत लिखना शुरू करें, और फिर डीबी परत।

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

दिन के अंत में, संभवतः आप रिग्रैक्टरिंग परीक्षण सेट का एक शक्तिशाली सेट जमा करेंगे, जिससे आपको सुरक्षित रूप से रिफैक्टरिंग करने में कुछ विश्वास मिलेगा।

यह सिर्फ एक विचार है ...

+0

दिलचस्प ... मैं इन उपकरणों को देख लूंगा। धन्यवाद। मेरी व्यक्तिगत पसंद इसके बजाय एप्लिकेशन को नीचे विकसित करना है। मैं एंटरप्राइज़ एप्लिकेशन पृष्ठभूमि से आया हूं- इसलिए सर्विस लेयर और डाटाबेस मॉडल के लिए अधिक सम्मान है- इसलिए पहले इसे निपटाना पसंद है। लेकिन आप जो कहते हैं- –

+0

यह भी आपकी रूचि रख सकता है ... http://fitnesse.org/ फ़िटनासे ग्राहकों, परीक्षकों और प्रोग्रामर को यह जानने के लिए सक्षम बनाता है कि उनके सॉफ़्टवेयर को क्या करना चाहिए, और स्वचालित रूप से तुलना करना यह वास्तव में क्या करता है। यह ग्राहकों की अपेक्षाओं को वास्तविक परिणामों की तुलना करता है। – zeroin23

+0

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

3

यह जाएं। सब ठीक हो जाएगा। मुझे यकीन है कि आपके पास मिलने के लिए समय सीमा है। (/ कटाक्ष)

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

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

इसे खत्म न करें, लेकिन "इसमें कुछ पिन छूएं", ताकि अगर चीजें "घूमने" लगती हैं, तो आपके पास चीजों पर ध्यान देने के लिए कुछ अलार्म हैं।

मेरा अधिकांश परीक्षण जुनीट या बैच "diff" प्रकार परीक्षण, और एक प्राथमिकता स्क्रीन स्क्रैपर प्रकार उपकरण है जिसे मैंने कुछ साल पहले लिखा था (कुछ रेगेक्स + wget/curl प्रकार की सामग्री को पटकथा)। मैंने सुना है कि सेलेनियम वेब ऐप यूआई परीक्षण के लिए एक अच्छा उपकरण माना जाता है, लेकिन कोशिश नहीं की है। स्थानीय जीयूआई ऐप्स के लिए किसी के पास टूल्स उपलब्ध हैं ???

5

मुझे लगता है कि हम यूनिट परीक्षण के साथ टीडीडी को भ्रमित कर रहे हैं।

यूनिट परीक्षण विशिष्ट परीक्षण हैं जो व्यवहार की इकाइयों का परीक्षण करते हैं। इन परीक्षणों को अक्सर एकीकरण निर्माण में शामिल किया जाता है। एसएलॉट ने कुछ उत्कृष्ट उम्मीदवारों को केवल उन प्रकार के परीक्षणों के लिए वर्णित किया।

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

आपके परिदृश्य के जवाब में मैं एसएलॉट से सहमत हूं निहित यह है कि आपको जो चाहिए वह आपके आवेदन में विशिष्ट व्यवहारों का परीक्षण करने के लिए यूनिट परीक्षणों का एक सूट है।

1

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

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

3

एक साधारण सीआरयूडी आवेदन टीडीडी करना मेरी राय में गिटार पर स्केल का अभ्यास करने जैसा है- आपको लगता है कि यह कितना उबाऊ और थकाऊ है कि यह पता लगाने के लिए कि आपका खेल कितना सुधारता है। विकास के नियमों में - आपको कोड लिखने की संभावना होगी जो कम युग्मित है - अधिक टेस्टेबल। इसके अतिरिक्त आप कोड उपभोक्ता के परिप्रेक्ष्य से चीजों को देखने की अधिक संभावना रखते हैं - आप वास्तव में इसका उपयोग करेंगे। इसमें बहुत अधिक रोचक साइड इफेक्ट्स जैसे अधिक सहज ज्ञान युक्त एपीआई, चिंताओं के बेहतर पृथक्करण आदि हो सकते हैं। माना जाता है कि मचान जनरेटर हैं जो आपके लिए मूल सीआरयूडी कर सकते हैं और उनके पास विशेष रूप से प्रोटोटाइप के लिए एक जगह है, हालांकि वे आम तौर पर ढांचे से बंधे होते हैं प्रकार के। जब तक आपके पास कोर कार्यक्षमता की आवश्यकता न हो, तब तक मूल डोमेन पर ध्यान केंद्रित न करें, जब तक कि आपके पास आवश्यक मूल कार्यक्षमता का बेहतर विचार न हो - टीडीडी आपको ऐसा करने में भी मदद कर सकता है। आपके उदाहरण में: क्या आप संदेश कतार या पदानुक्रमित पेड़ आदि चाहते हैं? क्या आप उन्हें वास्तविक समय में लोड करना चाहते हैं? सॉर्टिंग/खोज के बारे में क्या? क्या आपको JSON या सिर्फ HTML का समर्थन करने की आवश्यकता है? बीडीडी/टीडीडी के साथ इन प्रकार के प्रश्नों को देखना बहुत आसान है। यदि आप टीडीडी कर रहे हैं तो आप फ्रेमवर्क का उपयोग किए बिना अपने कोर लॉजिक का परीक्षण करने में सक्षम हो सकते हैं (और इसे लोड करने/चलाने के लिए एक मिनट का इंतजार कर रहे हैं)

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