कुछ सरल कार्यक्षमता को कोड करने के लिए मैं TDD का उपयोग कैसे शुरू कर सकता हूं?


9

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

मेरे लिए इसके बारे में सबसे उपयोगी बात यह है कि यह प्रतिगमन परीक्षण की भूमिका को अवशोषित करता है।

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

इसलिए यह प्रश्न पॉइंटर्स के लिए पूछना है कि मैं निम्नलिखित विकास कार्य के लिए पहला परीक्षण क्या लिख ​​सकता हूं: मैं कोड का उत्पादन करना चाहता हूं जो निर्माता / उपभोक्ता के फैशन में कार्य निष्पादन को अंजाम देता है।

मैंने इस कोड को लिखने के बाद इस प्रश्न को लिखने का निर्णय लिया और इसे रोक दिया (सोच रहा था कि क्या मैं वास्तव में इस समय के लिए TDD का उपयोग कर सकता हूं)

कोड:

interface ITask
{
    Guid TaskId { get; }
    bool IsComplete { get; }
    bool IsFailed { get; }
    bool IsRunning { get; }
}

interface ITaskContainer
{
    Guid AddTask(ICommand action);
}

interface ICommand
{
    string CommandName { get; }
    Dictionary<string, object> Parameters { get; }
    void Execute();
}

आपको पहले परीक्षणों को लिखा जाना चाहिए और उन्हें इंटरफेस करना चाहिए! संपूर्ण विचार यह है कि TDD आपके API के लिए है।

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

5
यह आपकी पहली असफल परीक्षा है।
कोरी

जवाबों:


10

इस अवधारणा के साथ शुरू करना:
1) उस व्यवहार से शुरू करें जो आप चाहते हैं। इसके लिए एक परीक्षण लिखें। परीक्षण विफल देखें।
2) टेस्ट पास करने के लिए पर्याप्त कोड लिखें। सभी परीक्षण पास देखें।
3) निरर्थक / मैला कोड के लिए देखो -> रिफ्लेक्टर। देखें परीक्षण अभी भी पास गोटो १

तो # 1 पर, मान लें कि आप एक नया कमांड बनाना चाहते हैं (मैं यह बता रहा हूं कि कमांड कैसे काम करेगा, इसलिए मेरे साथ सहन करें)। (इसके अलावा, मैं अत्यधिक TDD के बजाय थोड़ा व्यावहारिक हो जाऊंगा)

नया कमांड MakeMyLunch कहलाता है, इसलिए आप पहले इसे तुरंत बनाने के लिए एक परीक्षण बनाएं और कमांड का नाम प्राप्त करें:

@Test
public void instantiateMakeMyLunch() {
   ICommand command = new MakeMyLunchCommand();
   assertEquals("makeMyLunch",command.getCommandName());
}

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

तो आगे आप इसे क्रियान्वित करना चाहते हैं। तो आपको पूछना होगा: मुझे कैसे पता चलेगा कि "मेकमायंच" ने सफलतापूर्वक "मेरा दोपहर का भोजन बनाया"। इस ऑपरेशन के कारण सिस्टम में क्या बदलाव आए? क्या मैं इसके लिए परीक्षण कर सकता हूं?

मान लीजिए कि इसके लिए परीक्षण करना आसान है:

@Test
public void checkThatMakeMyLunchIsSuccessful() {
   ICommand command = new MakeMyLunchCommand();
   command.execute();
   assertTrue( Lunch.isReady() );
}

अन्य समय में, यह अधिक कठिन है, और आप वास्तव में क्या करना चाहते हैं, विषय-परीक्षण (मेकमाय्लेन्चकम) की जिम्मेदारियों का परीक्षण करना है। शायद MakeMyLunchCommand की जिम्मेदारी फ्रिज और माइक्रोवेव के साथ बातचीत करना है। तो इसे टेस्ट करने के लिए आप मॉक फ्रिज और मॉक माइक्रोवेव का उपयोग कर सकते हैं। [दो नमूना नकली रूपरेखा Mockito और nMock हैं या यहाँ देखें ।]

किस मामले में आप निम्न छद्म कोड जैसा कुछ करेंगे:

@Test
public void checkThatMakeMyLunchIsSuccessful() {
   Fridge mockFridge = mock(Fridge);
   Microwave mockMicrowave = mock(Microwave);
   ICommand command = new MakeMyLunchCommand( mockFridge, mockMicrowave );
   command.execute();
   mockFramework.assertCalled( mockFridge.removeFood );
   mockFramework.assertCalled( microwave.turnon );
}

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

व्यावहारिक कहते हैं कि कक्षाओं के समूह के लिए परीक्षण करें और परिणाम के लिए परीक्षण करें (क्या आपका दोपहर का भोजन तैयार है?)।

सही संतुलन ढूंढें जो आपके सिस्टम के लिए काम करता है।

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


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

1
अच्छा प्रश्न! यदि आपके द्वारा बनाया गया एकमात्र आदेश "MakeMyLunchCommand" है, तो विधि ".makeMyLunch ()" से शुरू हो सकती है। जो ठीक होता। फिर आप एक और कमांड बनाते हैं ("NapCommand.takeNap ()")। फिर भी विभिन्न तरीकों के साथ कोई समस्या नहीं है। फिर आप इसे अपने पारिस्थितिक तंत्र में उपयोग करना शुरू करते हैं, जो कि संभावना है कि आपको आईसीओमैंड इंटरफ़ेस में सामान्यीकरण के लिए मजबूर किया जाता है। सामान्य तौर पर, आप अक्सर अंतिम जिम्मेदार क्षण तक सामान्यीकरण में देरी करते हैं, क्योंकि YAGNI [ en.wikipedia.org/wiki/You_ain't_gonna_need_it ] =) अन्य बार, आप जानते हैं कि आप वहां पहुंचने जा रहे हैं जो आप इसके साथ शुरू करते हैं।
jayraynet

(यहाँ पर यह धारणा भी है कि आप एक आधुनिक IDE का उपयोग कर रहे हैं जो विधि नाम की चीजों को तुच्छ बनाता है)
jayraynet

1
सलाह के लिए फिर से धन्यवाद, यह मेरे लिए एक मील का पत्थर है कि आखिरकार वे सभी टुकड़ों को कैसे देखते हैं और वे कैसे फिट होते हैं - और हां, त्वरित
रिफ्लेक्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.