एकीकरण परीक्षण डिजाइन की आलोचना कैसे करते हैं?


38

मैं JB Rainsberger के ब्लॉग पोस्ट को एकीकृत परीक्षणों पर पढ़ रहा हूं और सोच रहा हूं कि हमारे डिजाइन के साथ एकीकरण परीक्षण किस तरह से अधिक कठोर है?

हम और अधिक एकीकृत परीक्षण लिखते हैं, जो बड़े होते हैं और हमारे डिजाइन की आलोचना नहीं करते हैं जैसा कि माइक्रोटेस्ट करते हैं


3
सवाल भ्रामक है। "किस तरह से एक एकीकरण परीक्षण अधिक कठोर है" ... "एकीकृत परीक्षण, जो बड़े हैं और कठोर रूप में हमारे डिजाइन की आलोचना नहीं करते हैं" - अब क्या?
एनओई


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

जवाबों:


46

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

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

अपडेट : जैसा कि रेन्सबर्गर ने नीचे नोट किया था, उन्होंने माइक्रोटेस्ट को इकाई परीक्षणों का पर्याय बनाने का इरादा नहीं किया था। उन्होंने एक विस्तृत जवाब भी दिया है जो आपको गहरी अंतर्दृष्टि प्रदान कर सकता है कि वह क्या संवाद कर रहे थे।


2
मैं सिद्धांत रूप में आपके उत्तर से सहमत हूं, लेकिन उस तरीके से नहीं जिस तरह आप इसे स्पष्ट कर रहे हैं। कोई व्यक्ति जो यह विशेष प्रश्न पूछ रहा है, यह जानने की संभावना नहीं है कि "मॉकिंग," "युग्मन" और "सामंजस्य" शब्दों का क्या अर्थ है, और आपने अपने उत्तर में उन शब्दों को परिभाषित नहीं किया है।
रॉबर्ट हार्वे

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

10
अंत में, "सूक्ष्म परीक्षण" पसंदीदा शब्द नहीं है। मुझे यह पसंद है जब ब्लॉगर अपनी तकनीकी शर्तों को बनाते हैं।
रॉबर्ट हार्वे

2
@ रबरडक: माइक्रोटेस्ट्स (लगभग 16,900 परिणाम) बनाम यूनिट टेस्ट (लगभग 193,000,000 परिणाम) । आस - पास भी नहीं। यहां तक ​​कि अगर आप इकाई और परीक्षणों को एक साथ मैश करते हैं तो भी आपको 14 मिलियन परिणाम मिलते हैं।
रॉबर्ट हार्वे

5
कृपया "माइक्रोएस्ट" और "यूनिट टेस्ट" की बराबरी न करें (कुछ विवरणों के लिए मेरा जवाब देखें); अन्यथा, मुझे लगता है कि आप समझ गए कि मैंने क्या वर्णन करने की कोशिश की।
जेबी रेन्सबर्गर

28

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

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

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

मैं कहता हूं "और अधिक कठोर" एक दोस्त की छवि को आकर्षित करने के लिए जो आपको सीधे बताता है कि आप क्या नहीं सुनना चाहते हैं, लेकिन सुनने की आवश्यकता है, और जो आपको इस तरह से तात्कालिकता व्यक्त करने के लिए चिल्लाता है कि अन्य लोग सहज महसूस न करें। करते हुए। दूसरी ओर, एकीकृत परीक्षण, शांत रहें और केवल उन समस्याओं पर संकेत दें, जब आपके पास उन्हें संबोधित करने के लिए न तो समय होता है और न ही ऊर्जा। एकीकृत परीक्षण से गलीचा के नीचे डिजाइन की समस्याओं को दूर करना आसान हो जाता है।

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


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

@ZanLynx मैंने इस बारे में लंबाई में लिखा है। यहां शुरू करें: blog.thecodewhisperer.com/series#integrated-tests-are-a-scam
JB Rainsberger

9

उनका मतलब है कि एकीकरण परीक्षणों की तुलना में इकाई परीक्षणों द्वारा अच्छे सॉफ्टवेयर डिजाइन की बेहतर जानकारी दी जाती है।

यहाँ पर क्यों। लेखन इकाई परीक्षण आपको कोड लिखने के लिए बाध्य करता है जो इकाई-परीक्षण योग्य है। यूनिट-टेस्ट करने योग्य कोड उस कोड की तुलना में बेहतर डिज़ाइन होता है जिसमें यूनिट टेस्ट नहीं होते हैं।

एकीकरण परीक्षण आपके कोड को उसी तरह सूचित नहीं करते हैं क्योंकि आप सिर्फ अपने सॉफ़्टवेयर की बाहरी परत का परीक्षण कर रहे हैं, न कि आंतरिक इंटरफेस जो आपके सॉफ़्टवेयर को एक साथ जोड़ते हैं।

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