उन वस्तुओं का निर्माण कर रहा है जो आपको लगता है कि आपको TDD में पहले परीक्षण में ओके की आवश्यकता होगी


15

मैं TDD के लिए काफी नया हूं और किसी भी कार्यान्वयन कोड से पहले अपना पहला परीक्षण बनाते समय मुझे परेशानी होती है। कार्यान्वयन कोड के किसी भी ढांचे के बिना मैं अपना पहला परीक्षण लिखने के लिए स्वतंत्र हूं, हालांकि मैं चाहता हूं, लेकिन यह हमेशा मेरे जावा / ओओ द्वारा समस्या के बारे में सोचने के तरीके से बाहर आता है।

उदाहरण के लिए मेरे गितुब ConwaysGameOfLife में पहला परीक्षण जो मैंने लिखा था (नियम 1_zeroNeighbours) मैंने एक GameOfLife ऑब्जेक्ट बनाकर शुरू किया था जो अभी तक लागू नहीं हुआ था; एक सेट विधि कहा जाता है कि मौजूद नहीं था, एक कदम विधि है कि मौजूद नहीं था, एक विधि है कि मौजूद नहीं था, और फिर एक जोर का इस्तेमाल किया।

जैसे-जैसे मैंने और अधिक परीक्षण लिखे और रिफलेक्ट किए गए, वैसे-वैसे परीक्षण विकसित हुए, लेकिन मूल रूप से यह कुछ इस तरह दिखता था:

@Test
public void rule1_zeroNeighbours()
{
    GameOfLife gameOfLife = new GameOfLife();
    gameOfLife.set(1, 1, true);
    gameOfLife.step();
    assertEquals(false, gameOfLife.get(1, 1));
}

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

जिस तरह से आप समझते हैं कि टीडीडी यह ठीक है? मुझे लगता है कि इसमें TDD / XP के सिद्धांतों का पालन किया जा रहा है, मेरे परीक्षण और कार्यान्वयन समय के साथ-साथ रिफलेक्टरिंग के साथ विकसित हुए हैं, और इसलिए यदि यह प्रारंभिक डिजाइन बेकार साबित हो गया होता तो यह बदलने के लिए खुला होता, लेकिन ऐसा लगता है कि मैं एक दिशा को मजबूर कर रहा हूं इस तरह से शुरू करके समाधान।

लोग TDD का उपयोग कैसे करते हैं? मैं कोई GameOfLife ऑब्जेक्ट, केवल आदिम और स्थिर तरीकों के साथ शुरू करके रिफैक्टरिंग के अधिक पुनरावृत्ति के माध्यम से जा सकता था, लेकिन ऐसा लगता है कि बहुत अधिक विवादित है।


5
TDD न तो सावधान योजना और न ही सावधान डिजाइन पैटर्न चयन की जगह लेता है। कहा कि, इससे पहले कि आप किसी भी कार्यान्वयन को लिखने के लिए परीक्षण के पहले कुछ लाइनों को संतुष्ट करने के लिए लिखा है, इससे बेहतर समय है कि आपने अपनी निर्भरता को पहचानने के लिए लिखा है कि आपकी योजना मूर्ख है, या आपने गलत पैटर्न को चुना है यह अजीब है या आपके परीक्षण की मांग के तरीके में एक वर्ग को आमंत्रित करने के लिए भ्रमित करने वाला है।
१२:०५ पर svidgen

जवाबों:


9

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

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

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

प्रो अपफ्रंट डिज़ाइन

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

प्रो टेस्ट-ड्राइविंग डिज़ाइन

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

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

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


लिंक एक बहुत अच्छा पढ़ा बेन था। साझा करने के लिए धन्यवाद।
रबरडक

1
@RubberDuck आपका स्वागत है! मैं इससे पूरी तरह सहमत नहीं हूं, वास्तव में, लेकिन मुझे लगता है कि यह उस दृष्टिकोण को बहस करने का एक उत्कृष्ट काम करता है।
बेन आरोनसन

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

17

परीक्षण को पहले स्थान पर लिखने के लिए, आपको उस एपीआई को डिजाइन करना होगा जिसे आप लागू करने जा रहे हैं। आपने पहले से ही पूरी परीक्षा बनाने के लिए अपना परीक्षण लिखकर GameOfLifeऔर अपने परीक्षण को लागू करने के लिए उपयोग करके गलत पैर पर चलना शुरू कर दिया है ।

JUnit और मॉकिटो के साथ प्रैक्टिकल यूनिट टेस्टिंग से :

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

आपका परीक्षण API डिज़ाइन करने के लिए बहुत प्रयास नहीं करता है। आपने एक स्टेटफुल सिस्टम स्थापित किया है, जहां सभी कार्यक्षमता बाहरी GameOfLifeवर्ग के भीतर समाहित है ।

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

"एक परीक्षण लिखें जो विफल रहता है" कदम पर चमकना आसान है। लेकिन असफल परीक्षण लिखना जो आपके इच्छित तरीके से काम करता है वह टीडीडी का मूल है।


1
एक सेल को ध्यान में रखते सिर्फ एक के लिए एक आवरण होगा boolean, कि डिजाइन निश्चित रूप से प्रदर्शन के लिए बुरा होगा। जब तक यह भविष्य में दो से अधिक राज्यों के साथ अन्य सेलुलर ऑटोमेटा के लिए एक्स्टेंसिबल होने की आवश्यकता नहीं है?
user253751

2
@immibis विवरणों पर चर्चा कर रहा है। आप एक वर्ग से शुरू कर सकते हैं जो कोशिकाओं के संग्रह का प्रतिनिधित्व करता है। आप सेल क्लास और उसके परीक्षणों को एक कक्षा के साथ माइग्रेट / मर्ज कर सकते हैं, यदि बाद में प्रदर्शन एक समस्या है तो कोशिकाओं के संग्रह का प्रतिनिधित्व करते हैं।
एरिक

@immibis लाइव पड़ोसियों की संख्या प्रदर्शन कारणों से संग्रहीत की जा सकती है। रंग के कारणों से सेल की टिक टिक की संख्या जीवित है ..
ब्लोर्बर्ड

@ आईमिसिस प्रीमेच्योर ऑप्टिमाइज़ेशन इज़ एविल ... इसके अलावा, आदिम जुनून से बचना अच्छी गुणवत्ता कोड लिखने का एक शानदार तरीका है, चाहे वह कितने भी राज्यों का समर्थन करता हो। जरा देखिए
Paul

0

वहाँ इस बारे में विचार के विभिन्न स्कूल।

कुछ का कहना है: परीक्षण नहीं संकलन त्रुटि है - जाओ सबसे छोटा उपलब्ध उत्पादन कोड लिखें।

कुछ का कहना है: यह परीक्षण ठीक है कि पहले जांच लें कि क्या वह बेकार है (या नहीं) चींटी तो लापता कक्षाओं / विधियों का निर्माण करती है

पहले दृष्टिकोण के साथ आप वास्तव में एक लाल-हरे-परावर्तक चक्र में हैं। दूसरे के साथ आपके पास थोड़ा सा व्यापक अवलोकन है जिसे आप प्राप्त करना चाहते हैं।

यह आप पर निर्भर है कि आप किस तरीके से काम करते हैं। IMHO दोनों दृष्टिकोण मान्य हैं।


0

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

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

अपने परीक्षण लिखने के लिए आप ककड़ी या इसी तरह का उपयोग करने में क्या मदद कर सकते हैं ।


0

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

TDD सिर्फ एक विकास दृष्टिकोण है लिंक: TDD
1. एक परीक्षण जोड़ें
2. सभी परीक्षण चलाएं और देखें कि क्या नया विफल रहता है
3. कुछ कोड लिखें
4. परीक्षण चलाएं
5. Refactor कोड
6. दोहराएं

टीडीडी आपको अपने सॉफ़्टवेयर को विकसित करने से पहले सभी आवश्यक सुविधाओं को कवर करने में मदद करता है जो आपने योजना बनाई है। लिंक: लाभ


0

मुझे उस कारण से जावा या C # में लिखे सिस्टम लेवल टेस्ट पसंद नहीं हैं । जावा के लिए सी # या ककड़ी आधारित परीक्षण ढांचे में से एक के लिए SpecFlow को देखें (शायद JBehave)। तब आपके परीक्षण इस तरह अधिक दिख सकते हैं।

यहाँ छवि विवरण दर्ज करें

और आप अपने सभी सिस्टम परीक्षणों को बदलने के बिना अपने ऑब्जेक्ट डिज़ाइन को बदल सकते हैं।

("सामान्य" इकाई परीक्षण एकल कक्षाओं का परीक्षण करते समय बहुत अच्छे होते हैं।)

जावा के लिए BDD फ्रेमवर्क के बीच अंतर क्या हैं?

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