2010-12-31 11 views
20

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

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

मुझे लगता है कि मुझे इन मुद्दों को "टॉप डाउन" दृष्टिकोण का उपयोग नहीं किया जाएगा। सवाल यह है कि मैं यह कैसे करूँगा? क्या मुझे मुख्य() विधि का परीक्षण करके शुरू करना चाहिए?

यदि कोई मुझे कुछ पॉइंटर्स दे सकता है, तो इसकी बहुत सराहना की जाएगी।

+0

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

+0

मेरे पास कोई उच्च स्तरीय परीक्षण के मामले नहीं हैं, और शायद यही गुम है। केवल सवाल यह है कि: इस तरह का एक उच्च स्तरीय परीक्षण कैसा दिखता है? एप्लिकेशन केवल कंसोल में टेक्स्ट बनाता है। क्या मुझे ज़ोर देना चाहिए कि वहां क्या लिखा जा रहा है? – Chris

+0

जब आप "एकीकरण" कहते हैं, तो इसका मतलब यह नहीं है कि आप परीक्षण करना चाहते हैं कि वस्तुओं का तारों का सही होना सही है, लेकिन सभी वर्ग एक साथ अपेक्षित काम करते हैं। अब, ज्यादातर लोग अनुशंसा करते हैं कि आपके पास कुछ परीक्षण मामले हो सकते हैं जो आपको बताते हैं कि क्या आप काम के साथ हैं। मुख्य कार्य में आपके पास वास्तव में एक परीक्षण है, क्योंकि मार्कस ने बताया, एक सकारात्मक परीक्षण। परीक्षण विधियों में लिखे जाने वाले अंतिम तरीके, मुख्य विधियां, आप देख सकते हैं। मेरा सुझाव है कि आप स्वीकृति परीक्षण देखें। यह पुस्तक आपके लिए दिलचस्प हो सकती है: http://www.growing-object-oriented-software.com/ –

उत्तर

29

"टॉप-डाउन" already used in computing to describe an analysis technique है। मैं इसके बजाय "बाहर-इन" शब्द का उपयोग करने का सुझाव देता हूं।

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

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

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

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

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

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

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

इसे बाहर-बाहर फैशन में करके हम जितनी जल्दी हो सके एपीआई के बारे में अधिक जानकारी प्राप्त कर सकते हैं, और जितनी जल्दी हो सके उन एपीआई को फिर से काम कर सकते हैं। यह Real Options (never commit early unless you know why के सिद्धांतों के साथ फिट बैठता है)। हम ऐसा कुछ भी नहीं बनाते जिसे हम उपयोग नहीं करते हैं, और एपीआई स्वयं को उपयोगिता के लिए डिज़ाइन किए गए हैं - लेखन की आसानी के बजाय। यह कोड प्रोग्रामिंग भाषा से अधिक डोमेन भाषा का उपयोग करके अधिक प्राकृतिक शैली में लिखा जाता है, जिससे इसे और अधिक पठनीय बना दिया जाता है। चूंकि कोड लिखे जाने से 10x अधिक पढ़ा जाता है, यह भी इसे बनाए रखने में मदद करता है।

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

+0

इससे बहुत मदद मिलती है, धन्यवाद! ऐसा लगता है कि मुझे अपने आवेदन का परीक्षण करने के लिए एक अति स्वीकृति परीक्षण का उपयोग करना चाहिए। – Chris

+1

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

+2

यह एक अच्छा जवाब है, बहुत बहुत धन्यवाद। बहुत सूचनाप्रद। +1 – weberc2

0

आप अपने कंसोल एप्लिकेशन का परीक्षण भी कर सकते हैं। मैंने पाया यह काफी कठिन है, इस उदाहरण पर नजर:

[TestMethod] 
public void ValidateConsoleOutput() 
{ 
    using (StringWriter sw = new StringWriter()) 
    { 
     Console.SetOut(sw); 
     ConsoleUser cu = new ConsoleUser(); 
     cu.DoWork(); 
     string expected = string.Format("Ploeh{0}", Environment.NewLine); 
     Assert.AreEqual<string>(expected, sw.ToString()); 
    } 
} 

आप full post here देख सकते हैं।

2

यदि आप मुख्य() से सामान ले जाते हैं, तो क्या आप उस फ़ंक्शन का परीक्षण नहीं कर सकते?

ऐसा करने के लिए यह समझ में आता है, क्योंकि आप अलग-अलग cmd-args के साथ चलना चाहते हैं और आप उनको परीक्षण करना चाहते हैं।

+0

हां मैं ऐसा कर सकता था, और शायद इस बिंदु पर ऐसा करने की सबसे आसान बात है। हालांकि, शुरुआत में, क्या मुझे आवेदन के परीक्षण-ड्राइव के क्रम में कुछ उच्च स्तरीय परीक्षण के साथ शुरू नहीं करना चाहिए था? ऐसा लगता है कि रास्ता, लेकिन शायद मैं इससे बहुत अधिक कर रहा हूं। – Chris

+0

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

0

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


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


सांत्वना उत्पादन एक सरल संभव परीक्षण की क्षमता है, और यदि आप TDD का उपयोग यह सिर्फ उत्पादन के लिए w/ओ किसी भी निदान और डिबग संदेशों अंतिम परिणाम के लिए इस्तेमाल किया जा सकता है। इसलिए ठोस परिणाम लौटने के लिए अपने शीर्ष-स्तरीय फ़ंक्शन को बनाएं, इसे जांचें और इसे मुख्य

0

पर अनुशंसा करें I "उच्च डाउन" (मैं उच्च स्तर परीक्षण कहता हूं) की अनुशंसा करता हूं। मैंने इस बारे में लिखा है:

http://www.hardcoded.net/articles/high-level-testing.htm

तो हाँ, आप अपने सांत्वना उत्पादन सीधे परीक्षण करना चाहिए। निश्चित रूप से, शुरुआत में यह एक परीक्षण स्थापित करने का दर्द है ताकि कंसोल आउटपुट का परीक्षण करना आसान हो, लेकिन यदि आप उपयुक्त सहायक कोड बनाते हैं, तो आपके अगले "उच्च स्तर" परीक्षण लिखना बहुत आसान होगा। ऐसा करके, आप असीमित पुन: फैक्टरिंग क्षमता के लिए खुद को सशक्त बनाते हैं। "नीचे" के साथ, आपका प्रारंभिक वर्ग संबंध बहुत कठोर है क्योंकि रिश्ते को बदलने का मतलब है परीक्षण (बहुत सारे काम और खतरनाक) को बदलना।

0

MSDN magazine of December में एक दिलचस्प टुकड़ा था, जिसमें वर्णन किया गया है कि "बीडीडी चक्र पारंपरिक परीक्षण-संचालित विकास (टीडीडी) चक्र को फीचर-स्तरीय परीक्षणों के साथ कैसे लपेटता है जो यूनिट-स्तरीय कार्यान्वयन को चलाता है"। विवरण बहुत तकनीकी विशिष्ट हो सकते हैं, लेकिन विचार और प्रक्रिया रूपरेखा आपके प्रश्न के लिए प्रासंगिक ध्वनि है।

0

मुख्य अंत में बहुत सरल होना चाहिए। मैं नहीं पता है कि यह कैसे ग # में की तरह दिखता है, लेकिन C++ यह कुछ इस तरह दिखना चाहिए: वर्गों के निर्माताओं के लिए

#include "something" 

int main(int argc, char *argv[]) 
{ 
    return TaskClass::Run(argc, argv); 
} 

पास पहले से ही बनाई गई वस्तुओं, लेकिन इकाई में परीक्षण नकली वस्तुओं गुजरती हैं।

टीडीडी के बारे में अधिक जानकारी के लिए, these screencasts पर एक नज़र डालें।वे समझते हैं कि फुर्तीली विकास कैसे करें, लेकिन यह सीडी में उदाहरणों के साथ टीडीडी कैसे करना है, यह भी बात करता है।

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