क्या TDD के बाद अनिवार्य रूप से DI का नेतृत्व होता है?


14

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

तो मेरा सवाल यह है: क्या टीडीडी प्रिंसिपल और लेखन इकाई परीक्षण का पालन करना जो बाहरी सेवाओं पर निर्भर नहीं है, अनिवार्य रूप से डीआई की ओर जाता है?


8
मैं द आर्ट ऑफ़ यूनिट टेस्टिंग पढ़ रहा हूँ और ऐसा लगता है कि यह निश्चित रूप से डिपेंडेंसी इंजेक्शन (DI) को जन्म देता है।
प्रोग्रामर

2
तो यह किस भाषा के बारे में है? जावा में DI / etc आवश्यक हैं, लेकिन यह एक भाषा सीमा के कारण है - पायथन जैसी भाषाओं की आवश्यकता नहीं है क्योंकि वे परीक्षणों में पैच निर्भरता को बंद कर सकते हैं।
इज़्काता

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

जवाबों:


19

टीडीडी और लेखन इकाई परीक्षण के बाद क्या डेटाबेस या बाहरी सेवाओं पर निर्भर नहीं होता है जो अनिवार्य रूप से डीआई की ओर जाता है?

DI की विस्तृत परिभाषा के लिए, हाँ। एक रिक्त स्थान में कक्षाएं मौजूद नहीं हैं, इसलिए उन्हें किसी भी तरह अपनी निर्भरताएं भरने की आवश्यकता है। कभी-कभी सिर्फ एक मूल्य प्रदान करना ठीक है। कभी-कभी आपको कंस्ट्रक्टर में एक नकली प्रदान करने की आवश्यकता होती है। कभी-कभी IoC कंटेनरों के माध्यम से। कभी-कभी निजी परीक्षण एक्सेसर के माध्यम से। यह सब कुछ परीक्षण चीज को कक्षा में इंजेक्ट कर रहा है ताकि यह अलगाव में काम कर सके।


9

उन लोगों के लिए जो पहले से ही DI के बारे में जानते हैं, लेकिन अभी तक कभी नहीं देखा है, मुझे लगता है कि यूनिट परीक्षण लगभग हमेशा DI का उपयोग करने के लिए नेतृत्व करेंगे।

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


8

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

http://stephenwalther.com/archive/2009/04/11/tdd-tests-are-not-unit-tests.aspx

मतभेदों की व्याख्या के लिए।


1
"TDD UT नहीं है" के लिए +1। यह भी पहचानने के लिए कि अत्यधिक अनप्लगिंग UTD का एक सामान्य परिणाम है, TDD का नहीं (आवश्यक रूप से)।
जेवियर

3

हां और नहीं: TDD अच्छी तरह से संरचित कोड लिखने की ओर जाता है, जो स्वयं DI की ओर जाता है।

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


क्या आप अपनी हां और ना में कोई जवाब नहीं दे सकते? DI के बिना TDD कैसे करता है।
गाइल्स

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

0

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

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


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