इकाई परीक्षण में "इकाई" के तहत क्या समझा जाता है


9

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

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

जवाबों:


11

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

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

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

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

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

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

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

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

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


10

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

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

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

यह वास्तव में समस्या है कि व्यवहार-संचालित विकास , और विशेष रूप से स्वीकृति-परीक्षण-संचालित विकास , हल करने के लिए निकलता है। लेकिन यह इकाई परीक्षणों / परीक्षण-संचालित विकास की आवश्यकता को दूर नहीं करता है; यह केवल इसका पूरक है।


मैं वास्तव में कहना चाहता था कि व्यवहार परीक्षण नाजुक हैं। कोडबेस बदलाव के दौरान वे अक्सर झूठे नकारात्मक हो जाते हैं। यह राज्य परीक्षणों के साथ कम होता है (लेकिन राज्य परीक्षण इकाई परीक्षण के लिए बहुत ही कम होते हैं)
साइबेरियाई Guy

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

राज्य द्वारा मेरा मतलब है परीक्षण जो राज्य को सत्यापित करता है, कुछ फ़ंक्शन का परिणाम; व्यवहार से मेरा मतलब है कि परीक्षण जो परिणाम की पुष्टि नहीं करता है, लेकिन तथ्य यह है कि कुछ समारोह को बुलाया गया था
साइबेरियाई

@ इड़ा: उस मामले में, मैं पूरी तरह से असहमत हूं। जिसे आप राज्य परीक्षण कह रहे हैं, मैं एकीकरण कहता हूं। जिसे आप व्यवहार कह रहे हैं, मैं इकाई कहता हूं। उनकी बहुत परिभाषा से एकीकरण परीक्षण अधिक नाजुक हैं। Google "एकीकरण परीक्षण इकाई नाजुक" और आप देखेंगे कि मैं अकेला नहीं हूँ।
पीडीआर

परीक्षण के बारे में लेखों का एक लॉग है लेकिन उनमें से कौन सा आपकी राय साझा करता है?
साइबेरियाईगूई

2

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

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


1
काफी नहीं, एक इकाई किसी भी अलग-थलग विषय है, सिर्फ इसलिए कि स्वचालित टूलिंग एक विधि का इलाज करना पसंद करती है क्योंकि यह ऐसा नहीं करता है, और न ही इसे सर्वश्रेष्ठ बनाता है। 'पृथक' यहाँ की कुंजी है। यहां तक ​​कि अगर आप तरीकों का परीक्षण करते हैं, तो आपको निजी लोगों का भी परीक्षण करना चाहिए।
gbjbaanb

1

अंगूठे का मेरा नियम: कोड की सबसे छोटी इकाई जो अभी भी जटिल है जिसमें कीड़े शामिल हैं।

यह एक विधि या वर्ग है या उप-प्रणाली विशेष कोड पर निर्भर करती है, कोई सामान्य नियम नहीं दिया जा सकता है।

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

अन्य मामलों में एक एकल विधि कुछ जटिल गणना कर सकती है जो अलगाव में परीक्षण करने के लिए मूल्यवान है।

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

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