कार्यान्वयन विवरणों के युग्मन के बिना इकाई परीक्षण व्यवहार


16

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

व्यवहार save X to some data sourceमें सेवाओं और रिपॉजिटरी के एक विशिष्ट सेट के साथ एक प्रणाली की तरह , हम इकाई को सेवा के स्तर पर कुछ डेटा की बचत का परीक्षण कैसे कर सकते हैं, रिपॉजिटरी के माध्यम से, परीक्षण विवरणों को युग्मित किए बिना (जैसे एक विशिष्ट विधि को कॉल करना) )? क्या इस तरह के युग्मन से बचना वास्तव में प्रयास के लायक नहीं है / किसी तरह से खराब है?


1
यदि आप परीक्षण करना चाहते हैं कि डेटा रिपॉजिटरी में सहेजा गया था, तो परीक्षण को वास्तव में जाकर रिपॉज़िटरी को देखना होगा कि क्या डेटा है, सही है? या क्या मैं कुछ न कुछ भूल रहा हूं?

मेरा प्रश्न परीक्षणों को लागू करने से बचने के बारे में अधिक था जैसे कि रिपॉजिटरी पर एक विशिष्ट विधि को कॉल करना, या वास्तव में अगर ऐसा कुछ किया जाना चाहिए।
एंडी हंट

जवाबों:


8

आपका विशिष्ट उदाहरण एक ऐसा मामला है जिसे आपको आमतौर पर जाँच करके यह देखना पड़ता है कि क्या एक निश्चित विधि कहलाती है, क्योंकि saving X to data sourceइसका मतलब बाहरी निर्भरता के साथ संचार करना है , इसलिए आपको जिस व्यवहार का परीक्षण करना है वह यह है कि संचार अपेक्षित रूप से हो रहा है

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

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

पुनश्च: यह कहने का मेरा उद्देश्य नहीं है कि राज्य या सहभागिता द्वारा परीक्षण TDD का एकमात्र सही तरीका है - मेरा मानना ​​है कि यह सही काम के लिए सही उपकरण का उपयोग करने का मामला है।


जब आप "बाहरी निर्भरता के साथ संचार" का उल्लेख करते हैं, तो क्या आप बाहरी निर्भरता का उल्लेख कर रहे हैं जो परीक्षण के तहत इकाई के लिए बाहरी हैं, या सिस्टम के लिए बाहरी उन सभी के रूप में?
एंडी हंट

"बाहरी निर्भरता" से मेरा मतलब है कि आपके आवेदन के लिए आपको प्लग-इन माना जा सकता है। आवेदन के द्वारा, मेरा मतलब है कि व्यावसायिक नियम, किसी भी तरह के विवरण के अज्ञेय जैसे कि दृढ़ता या यूआई के लिए किस रूपरेखा का उपयोग करना है। मुझे लगता है कि अंकल बॉब इसे बेहतर तरीके से समझा सकते हैं, जैसे इस बातचीत में: youtube.com/watch?v=WpkDN78P884
मिशेल हेनरिक

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

मैं वास्तव में परीक्षणों की वास्तविक दुनिया का उदाहरण देखना चाहूंगा जो कार्यान्वयन के लिए युग्मन कर रहे हैं।
पॉजिटिव

7

उस बात की मेरी व्याख्या है:

  • परीक्षण घटक, कक्षाएं नहीं।
  • उनके इंटरफ़ेस पोर्ट के माध्यम से घटकों का परीक्षण करें।

यह बात में नहीं कहा गया है, लेकिन मुझे लगता है कि सलाह के लिए ग्रहण किया गया संदर्भ कुछ इस तरह है:

  • आप उपयोगकर्ताओं के लिए एक प्रणाली विकसित कर रहे हैं, नहीं, कहते हैं, एक उपयोगिता पुस्तकालय या रूपरेखा।
  • प्रतिस्पर्धी बजट के भीतर परीक्षण का लक्ष्य यथासंभव सफलतापूर्वक वितरित करना है।
  • घटक एक एकल, परिपक्व, शायद सांख्यिकीय रूप से टाइप किए गए हैं, सी # / जावा जैसी भाषा।
  • एक घटक 10000-50000 लाइनों के क्रम का है; मावेन या वीएस परियोजना, ओएसजीआई प्लगइन, आदि।
  • घटकों को एक एकल डेवलपर या बारीकी से एकीकृत टीम द्वारा लिखा जाता है।
  • आप हेक्सागोनल वास्तुकला की तरह शब्दावली और दृष्टिकोण का अनुसरण कर रहे हैं
  • एक घटक पोर्ट वह है जहाँ आप स्थानीय भाषा को छोड़ते हैं, और इसकी प्रकार प्रणाली, पीछे, http / SQL / XML / बाइट्स और / ... पर स्विच कर रहे हैं
  • प्रत्येक पोर्ट को लपेटने से जावा / सी # अर्थ में, टाइप किए गए इंटरफेस होते हैं, जो प्रौद्योगिकियों को स्विच करने के लिए कार्यान्वित किए जा सकते हैं।

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

उस से बाहर निकालना, और मेरे कुछ विचारों में फेंक देना,

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

यदि आप ठीक से और सफाई से ऐसा करते हैं, तो आपको मुश्किल से एक नकली उपकरण की आवश्यकता होती है; यह केवल कुछ बार प्रति सिस्टम उपयोग किया जाता है।

एक डेटाबेस आमतौर पर एक सहयोगी होता है, इसलिए यह नकली के बजाय नकली हो जाता है। यह हाथ से लागू करने के लिए दर्दनाक होगा; सौभाग्य से ऐसी चीजें पहले से मौजूद हैं

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

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

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


क्या आप मुझे इंटरफ़ेस पोर्ट का एक ठोस उदाहरण बता सकते हैं / दे सकते हैं?
पॉजिटिव

आउटपुट इंटरफ़ेस का एक उदाहरण क्या है। क्या आप कोड में विशिष्ट हो सकते हैं? इनपुट इंटरफ़ेस के साथ भी।
पॉजिटिव

एक इंटरफ़ेस (जावा / सी # अर्थ में) एक पोर्ट लपेटता है, जो कुछ भी हो सकता है जो बाहरी दुनिया (डी / बी, सॉकेट, http, ....) से बात करता है। आउटपुट इंटरफ़ेस वह है जिसमें पोर्ट के माध्यम से बाहरी दुनिया से आने वाले रिटर्न मानों की कोई विधि नहीं है, केवल अपवाद या समकक्ष।
सोरू

एक इनपुट इंटरफ़ेस विपरीत है, एक सहयोगी इनपुट और आउटपुट दोनों है।
सोरू

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

0

मेरा सुझाव राज्य-आधारित परीक्षण दृष्टिकोण का उपयोग करना है:

GIVEN हमारे पास एक ज्ञात स्थिति में परीक्षण DB है

जब सेवा X तर्कों के साथ कहा जाता है

यह दावा करें कि डीबी अपने मूल राज्य से अपेक्षित राज्य में केवल पढ़ने के लिए रिपॉजिटरी विधियों को कॉल करके और उनके लौटे मानों की जांच करके बदल गया है

इस तरह से, आप सेवा के किसी भी आंतरिक एल्गोरिथ्म पर भरोसा नहीं करते हैं, और परीक्षणों को बदलने के बिना इसके कार्यान्वयन को फिर से भरने के लिए स्वतंत्र हैं।

यहां केवल युग्मन सेवा पद्धति कॉल और DB से डेटा पढ़ने के लिए आवश्यक रिपॉजिटरी कॉल है, जो ठीक है।

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