2010-12-09 11 views
18

मैं टीडीडी सीखने का प्रयास कर रहा हूं लेकिन मुझे थोड़ा सा ऐप के साथ परीक्षण करने की आवश्यकता के बारे में अपने सिर को पाने में कठिनाई हो रही है।एक साधारण उदाहरण के साथ टीडीडी सीखना

यह उपयोगकर्ता से एक csv फ़ाइल के स्थान, एक शब्द दस्तावेज़ mailmerge टेम्पलेट के स्थान और एक आउटपुट स्थान लेने की जरूरत:

(सरलीकृत कुछ हद तक) अनुप्रयोग के लिए कल्पना इस प्रकार है।

एप्लिकेशन तो csv फ़ाइल पढ़ा जाएगा और प्रत्येक पंक्ति के लिए, शब्द टेम्पलेट और फ़ोल्डर निर्दिष्ट करने के लिए उत्पादन के साथ डेटा को मर्ज।

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

मुझे लगता है कि कुछ सामान्य टीडीडी मार्गदर्शन बहुत मददगार होगा!

उत्तर

26

मैं आपके प्रोग के प्रत्येक चरण के लिए परिदृश्यों के बारे में सोचकर शुरू करूंगा राम, विफलता मामलों और उनके अपेक्षित व्यवहार के साथ शुरू:

  • उपयोगकर्ता एक अशक्त csv फ़ाइल स्थान प्रदान करता है (एक ArgumentNullException फेंकता है)।

  • उपयोगकर्ता एक खाली सीएसवी फ़ाइल स्थान प्रदान करता है (ArgumentException फेंकता है)।

  • उपयोगकर्ता द्वारा निर्दिष्ट सीएसवी फ़ाइल मौजूद नहीं है (जो भी आपको लगता है उचित है)।

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

public class Merger { 
    public void Merge(string csvPath, string templatePath, string outputPath) { 
     if (csvPath == null) { throw new ArgumentNullException("csvPath"); } 
    } 
} 

उसके बाद, मानक स्थितियों में कदम:

  • निर्दिष्ट csv फ़ाइल है एक पंक्ति (विलय को एक बार कहा जाना चाहिए, अनुमानित स्थान पर आउटपुट आउटपुट)।

  • निर्दिष्ट सीएसवी फ़ाइल में दो पंक्तियां हैं (विलय को दो बार कहा जाना चाहिए, अनुमानित स्थान पर आउटपुट आउटपुट)।

  • आउटपुट फ़ाइल का नाम आपकी अपेक्षाओं (जो कुछ भी है) के अनुरूप है।

और इसी तरह। एक बार जब आप इस दूसरे चरण में पहुंच जाएंगे, तो आप उस व्यवहार की पहचान करना शुरू कर देंगे जिसे आप स्टब करना चाहते हैं और नकली करना चाहते हैं। उदाहरण के लिए, यह जांचना कि कोई फ़ाइल मौजूद है या नहीं - .NET इसे स्टब करना आसान नहीं बनाता है, इसलिए आपको शायद एडाप्टर इंटरफ़ेस और क्लास बनाने की आवश्यकता होगी जो आपको अपने प्रोग्राम को वास्तविक फ़ाइल सिस्टम से अलग करने देगी वास्तविक सीएसवी फाइलों और मेल-मर्ज टेम्पलेट्स के कुछ भी नहीं कहें)। वहाँ अन्य तकनीक उपलब्ध हैं, लेकिन इस पद्धति काफी मानक है: यूनिट टेस्टिंग की कला संदर्भित करने के लिए

[Test] 
[ExpectedException(typeof(FileNotFoundException))] 
public void Fails_When_Csv_File_Does_Not_Exist() { 

    IFileFinder finder = mockery.NewMock<IFileFinder>(); 
    Merger  merger = new Merger(finder); 
    Stub.On(finder).Method("FileExists").Will(Return.Value(false)); 

    merger.Merge("csvPath", "templatePath", "outputPath"); 
} 
+1

बहुत अच्छे ठोस उदाहरण! – Davy8

2

इकाई परीक्षण आप किसी भी निर्भरता से वर्ग दसगुणा ताकि आप प्रभावी रूप से सिर्फ वर्ग ही परीक्षण कर सकते हैं की जरूरत करने में सक्षम होने के लिए।

ऐसा करने के लिए आपको कक्षा में किसी भी निर्भरता को इंजेक्ट करने की आवश्यकता होगी। आप आमतौर पर उस ऑब्जेक्ट में गुजरकर ऐसा करेंगे जो कि निर्भरता इंटरफ़ेस को आपके वर्ग में कन्स्ट्रक्टर में लागू करता है।

मजाक चौखटे अपनी निर्भरता का एक नकली उदाहरण है कि अपने वर्ग परीक्षण के दौरान कॉल कर सकते हैं बनाने के लिए इस्तेमाल कर रहे हैं। आप नकली को वैसे ही व्यवहार करने के लिए परिभाषित करते हैं जैसे आपकी निर्भरता परीक्षण के अंत में इसके राज्य को सत्यापित करेगी।

मैं राइनो mocks के साथ एक खेल होने और दस्तावेज में उदाहरण के माध्यम से जा यह कैसे काम करता का एहसास दिलाने के लिए सिफारिश करेंगे।

http://ayende.com/projects/rhino-mocks.aspx

5

सरल सामान्य मार्गदर्शन:

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

यूनिट परीक्षण लिखकर आप वास्तव में आवश्यकताओं को निर्दिष्ट करते हैं लेकिन किसी अन्य रूप में, कोड पढ़ने में आसान होते हैं।

इसे किसी अन्य कोण से देखना: जब आपको इसके लिए एक नया काला बॉक्सिंग क्लास और यूनिट परीक्षण प्राप्त होता है, तो आपको यह देखने के लिए इकाई परीक्षण पढ़ना चाहिए कि कक्षा क्या करती है और यह कैसे व्यवहार करती है।

इकाई परीक्षण के बारे में अधिक पढ़ने के लिए मैं एक बहुत अच्छी किताब की सिफारिश:

  • Link1
  • Link2: Art Of Unit Testing

    यहां पर कुछ अधिक जानकारी और उदाहरण के लिए TDD के बारे में StackOverflow पर लेख के लिए लिंक कर रहे हैं

+1

+1:

public interface IFileFinder { bool FileExists(string path); } // Concrete implementation to use in production public class FileFinder: IFileFinder { public bool FileExists(string path) { return File.Exists(path); } } public class Merger { IFileFinder finder; public Merger(IFileFinder finder) { this.finder = finder; } } 

परीक्षण में, आप एक ठूंठ कार्यान्वयन में पास भेज देंगे। यह एक महान किताब है। – Steven

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