क्या परीक्षण-संचालित विकास (TDD) के लिए परीक्षण हमेशा इकाई-परीक्षण होते हैं?


41

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


6
एक दूसरे के अंदर घोंसले के शिकार लाल / हरे / रिफ्लेक्टर के एक से अधिक विभिन्न स्तरों का उपयोग करना असामान्य नहीं है। उदाहरण के लिए, आप स्वीकृति / व्यवहार परीक्षण लिखते समय लाल / हरे / रिफ्लेक्टर का पालन कर सकते हैं, जहाँ स्वीकृति परीक्षण के 'हरे' चरण में इकाई परीक्षणों के कई लाल / हरे / रिफलेक्टर पुनरावृत्तियों शामिल हैं।
सीन बर्टन

1
शीर्षक प्रश्न की सामग्री से मेल नहीं खाता है। शीर्षक "परीक्षण हमेशा इकाई-परीक्षण होते हैं " (उत्तर: नहीं, इकाई-परीक्षण की तुलना में अन्य प्रकार के परीक्षण हो सकते हैं), सामग्री पूछती है "क्या आपको पहले परीक्षण लिखना चाहिए?"।
AnoE

@ कोई सामग्री का पहला वाक्य सिर्फ एक परिचयात्मक बयान है। सेकंड का वाक्य यह नहीं पूछता है कि क्या परीक्षण को पहले लिखा जाना है, लेकिन अगर टीडीडी दृष्टिकोण का उपयोग परीक्षण विधियों के लिए किया जा सकता है जो कि टीडीडी है।
user1364368

@ user1364368, सवाल को थोड़ा सुधारने के लिए स्वतंत्र महसूस करें, कम से कम मैं इस बारे में उलझन में था कि आपका इरादा पहले पढ़ने पर क्या है, और शीर्ष-मतदान प्रश्न, जबकि आपके दोनों वाक्यों को संबोधित करना भी पहले वाले के साथ प्रमुखता से शुरू होता है।
AnoE

@ क्या मैंने वास्तविक प्रश्न क्या है यह स्पष्ट करने के लिए दूसरे वाक्य की शुरुआत को बदल दिया।
user1364368

जवाबों:


27

आपके लिए सभी TDD की आवश्यकता है कि आप एक असफल परीक्षा लिखें, फिर इसे पास करने के लिए अपना कोड संशोधित करें।

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


59

लाल हरे रंग का परावर्तक चक्र एक बहुत ही ध्वनि सिद्धांत पर बनाया गया है:

केवल विश्वास परीक्षण जो आपने पास और असफल दोनों देखा है।

हाँ जो स्वचालित एकीकरण परीक्षणों के साथ भी काम करता है। इसके अलावा मैनुअल परीक्षण। हेक, यह कार बैटरी परीक्षकों पर काम करता है। यह है कि आप परीक्षण का परीक्षण कैसे करते हैं।

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


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

12

हालांकि, मैं सोच रहा हूं कि क्या परीक्षण-संचालित दृष्टिकोण को अन्य प्रकार के परीक्षणों पर भी लागू किया जा सकता है।

हाँ, और एक अच्छी तरह से ज्ञात दृष्टिकोण जो यह व्यवहार-संचालित विकास है । BDD में औपचारिक कल्पना से उत्पन्न होने वाले परीक्षणों को "इकाई परीक्षण" कहा जा सकता है, लेकिन वे आम तौर पर वास्तविक TDD में निम्न स्तर के नहीं होंगे, वे संभवतः "स्वीकृति परीक्षण" शब्द के लिए बेहतर होंगे।


8

मैं परीक्षण-संचालित विकास को अब तक समझता हूं कि आपको केवल उत्पादक कोड लिखने की अनुमति है जब आपके पास एक असफल (लाल) इकाई परीक्षण होता है।

नहीं। आपको केवल परीक्षण के संदेश को बदलने के लिए सबसे सरल कोड लिखना संभव है। यह किस तरह के परीक्षण के बारे में कुछ नहीं कहता है।

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

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

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

अब आप अगली यूनिट टेस्ट बनाते हैं और ऊपर दोहराते हैं, जब तक कि फंक्शनल टेस्ट भी पास नहीं हो जाता। कार्यात्मक परीक्षण के संरक्षण के तहत, अब आप कई इकाइयों में रिफ्लेक्टरिंग कर सकते हैं।

यह मध्य चक्र अब तक दोहराता है जब तक स्वीकृति परीक्षण पास नहीं हो जाता है, जिस बिंदु पर आप अब पूरे सिस्टम में रिफैक्टोरिंग कर सकते हैं।

अब, आप अगले स्वीकृति मानदंड को चुनते हैं और बाहरी चक्र फिर से शुरू होता है।

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

नोट: आपको हमेशा तीन स्तरों के परीक्षणों की आवश्यकता नहीं है। हो सकता है, कभी-कभी आपको और अधिक की आवश्यकता हो। अधिक बार, आपको कम की आवश्यकता होती है। यदि आपकी कार्यक्षमता के टुकड़े छोटे हैं, और आपके कार्यात्मक परीक्षण तेज हैं, तो आप बिना (या कम इकाई परीक्षणों के) द्वारा प्राप्त कर सकते हैं। अक्सर, आपको केवल स्वीकृति परीक्षण और इकाई परीक्षण की आवश्यकता होती है। या, अपनी स्वीकृति मानदंडों तो ठीक-कणों का कर रहे हैं कि अपनी स्वीकृति परीक्षण कर रहे हैं कार्यात्मक परीक्षण।

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

हालांकि, मैं सोच रहा हूं कि क्या परीक्षण-संचालित दृष्टिकोण को अन्य प्रकार के परीक्षणों पर भी लागू किया जा सकता है।

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

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

नियम हैं:

  1. ठीक एक नया परीक्षण लिखें, सबसे छोटा परीक्षण जो आप एक समाधान की दिशा में इंगित कर सकते हैं
  2. इसे विफल देखें; संकलन विफलताओं को विफलताओं के रूप में गिना जाता है
  3. (1) परीक्षण विधि से कम से कम कार्यान्वयन कोड लिखकर परीक्षा पास करें
  4. दोहराव को हटाने के लिए रिफ्लेक्टर, और अन्यथा डिजाइन में सुधार के लिए आवश्यक। इन चालों का उपयोग करने के बारे में सख्त रहें:
    1. आप एक नया तरीका चाहते हैं - समय को फिर से भरने तक प्रतीक्षा करें ... फिर इनमें से एक करके और कोई अन्य तरीके से नई (गैर-परीक्षण) विधियाँ बनाएँ:
      • पसंदीदा: टेस्ट क्लास में एक नया तरीका बनाने के लिए (3) के अनुसार बनाए गए कार्यान्वयन कोड पर एक्सट्रैक्ट मेथड या
      • यदि आपको होना चाहिए: कार्यान्वयन कोड को मौजूदा कार्यान्वयन पद्धति के अनुसार (3) स्थानांतरित करें
    2. आप एक नया वर्ग चाहते हैं-तब तक प्रतीक्षा करें, जब तक कि समय ... तब तक नॉन-टेस्ट कक्षाओं का निर्माण एक मूव मेथड के लिए और किसी अन्य कारण से न करें।
    3. मूव मेथड, और कोई अन्य तरीका करके कार्यान्वयन कक्षाओं को पॉप्युलेट करें

ये नियम टीडीडी के अभ्यास के लिए हैं। वे वास्तव में उत्पादन में टीडीडी करने के लिए नहीं हैं (हालांकि कुछ भी आपको इसे आज़माने से नहीं रोकता है)। वे निराशा महसूस कर सकते हैं क्योंकि यह कभी-कभी ऐसा लगता है जैसे कि आप बिना किसी वास्तविक प्रगति के हजारों छोटे छोटे कदम उठाते हैं।


2

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

संदर्भ : केंट बेक द्वारा "उदाहरण के लिए परीक्षण प्रेरित विकास"

केंट बेक का वर्णन है कि अध्याय 32 में "यूनिट टेस्ट" से उनका क्या मतलब है - टीडीआर का प्रबंधन


1

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

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

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


1

टॉक टेस्ट-ड्रिवेन डिवेलपमेंट में: यह वह नहीं है जिसका हमारा मतलब था कि स्टीव फ्रीमैन टीडीडी बड़ी तस्वीर की निम्नलिखित स्लाइड दिखाते हैं (उत्तर के नीचे की छवि देखें)। इसमें एक कदम "राइट-टू-एंड-एंड-टेस्ट लिखें" है, जिसके बाद "फेलिंग यूनिट-टेस्ट लिखें" है। (ऊपर दाईं ओर ज़ूम इन करने के लिए क्लिक करें)

TDD में कोई भी परीक्षण हमेशा इकाई-परीक्षण नहीं होता है।

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

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


-1

नहीं, इसे अन्य प्रकार के परीक्षणों पर लागू नहीं किया जा सकता है, एक सरल व्यावहारिक कारण के लिए: अन्य प्रकार के परीक्षण निष्पादित करने में बहुत लंबा समय ले रहे हैं।

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


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

@ जोक मैंने कभी और नहीं देखा जो इतना तेज है। मेरे पिछले प्रोजेक्ट पर मेरे कार्यात्मक परीक्षणों में 30 सेकंड लगे, और यह तेज़ है। एकीकरण और भी लंबा। मेरे मामले में, और कुछ भी समझ में नहीं आया। इसके अलावा, इकाई परीक्षण सभी प्रकार के परीक्षणों में से सबसे तेज़ हैं - इसलिए यह उनका उपयोग करने के लिए समझ में आता है।
B43ови।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.