यूनिट परीक्षण और क्यों और किस तरह के कार्य और / या कक्षाएं असंभव हैं


21

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


2
आपका बहाना? एक सहकर्मी? प्रबंधक? आप किस भाषा / रूपरेखा के साथ काम कर रहे हैं?

1
आवेदन में विरासत कोड का एक बहुत कुछ है और कोई नया समय नहीं है।
नूट

4
@ नागट: मैं असहमत हूं। आपके द्वारा उद्धृत प्रश्न उन स्थितियों के बारे में है जिनमें इकाई परीक्षण उपयोगी नहीं हैं। वर्तमान प्रश्न उन परिस्थितियों के बारे में है जो यूनिट परीक्षणों को कठिन बनाते हैं।
आर्सेनी मूरज़ेंको

@ मेनमा जाहिर है कि हम अलग-अलग प्रश्न पढ़ते हैं। "मैं यह समझने की कोशिश कर रहा हूं कि किस प्रकार के डिज़ाइन और कोड को यूनिट परीक्षण नहीं किया जा सकता है।" => "इकाई परीक्षण नहीं करना कब उचित है?"
gnat

1
@manizzzz: आप उस प्रश्न में संपादित करना चाह सकते हैं।
जमरनो

जवाबों:


27

कई कारकों इकाई परीक्षण के लिए मुश्किल कोड प्रस्तुत कर सकते हैं। जब यह मामला होता है, तो फिर से जाँचने के लिए कोड को बेहतर बनाने में मदद मिलती है।

कोड के कुछ उदाहरण जो शायद परीक्षण करना मुश्किल होगा:

  • 1000-LOC फ़ंक्शन,
  • कोड जो वैश्विक स्थिति पर बहुत निर्भर करता है,
  • कोड जिसे कंक्रीट की आवश्यकता होती है, ऑब्जेक्ट बनाने के लिए जटिल, जैसे कि डेटाबेस संदर्भ, इंटरफेस और निर्भरता इंजेक्शन पर निर्भर होने के बजाय,
  • कोड जो धीरे-धीरे कार्य करता है ,
  • स्पेगेटी कोड,
  • लीगेसी कोड जिसे पठनीयता या स्थिरता के बारे में कोई परवाह किए बिना वर्षों के लिए संशोधित किया गया था,
  • कोड को समझना मुश्किल है जिसमें लेखक के मूल इरादे के बारे में कोई टिप्पणी या संकेत नहीं हैं (उदाहरण के लिए कोड जो चर नामों का उपयोग करता है जैसे कि function pGetDp_U(int i, int i2, string sText)

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


8
यह भी परीक्षण कोड के लिए कठिन है जो गैर-शुद्ध कार्यों पर निर्भरता को इंजेक्ट नहीं करता है, जैसे यादृच्छिक संख्या, वर्तमान समय, हार्ड-वायर्ड I / O, इत्यादि
9000

इस तरह के परीक्षण कोड के लिए इसका तुच्छ - आपको केवल सही परीक्षण टूलिंग की आवश्यकता है, न कि आपके कोड को उनके अनुरूप करने के लिए। उदाहरण के लिए Microsoft Fakes का प्रयास करें।
gbjbaanb

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

14

बहुत सी चीजें हैं जो यूनिट टेस्ट के लिए कोड को कठिन बनाती हैं। संयोग से उनमें से बहुत से कोड को बनाए रखना मुश्किल हो जाता है:

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

मुझे लगता है कि यह एक उत्कृष्ट उत्तर है। आप कई कोड स्तर के मुद्दों, और वैश्विक राज्य के मुद्दों पर स्पर्श करते हैं। @ मेनमा के पास कुछ अन्य मुद्दे हैं जो मुझे लगता है कि मान्य हैं, लेकिन कम अच्छी तरह से परिभाषित हैं। जेफ़री थॉमस में I / O और UI का उल्लेख है। मुझे लगता है कि यदि आप इन तीन उत्तरों के अच्छे हिस्सों को जोड़ते हैं तो आपके पास एक शानदार प्रतिक्रिया होगी। मुझे यह उत्तर सबसे अच्छा लगता है, क्योंकि कोड एंटीपैटर्न पर ध्यान देने के कारण।
एम 2 टीएम

1
अर्घ - इकाई परीक्षण से बदतर कुछ भी नहीं है कि व्यावसायिक आवश्यकताओं से कोई समानता नहीं है और केवल एक निश्चित समय में आउटपुट हैं - उदाहरण के लिए 3 बार कहा जाने वाला मॉक सेटअप? 3 क्यों? क्योंकि यह पहली बार था जब टेस्ट रन / रेंट :)
माइकल

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

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

5

कोड लोगों के सामान्य उदाहरण इकाई परीक्षण की इच्छा नहीं रखते हैं:

  • कोड जो सीधे i / o (फ़ाइलों को पढ़ने, प्रत्यक्ष नेटवर्क कॉल,…) के साथ इंटरैक्ट करता है।
  • कोड जो सीधे यूआई को अपडेट करता है।
  • कोड जो सीधे एकल या वैश्विक वस्तुओं का संदर्भ देता है।
  • वह कोड जो वस्तु या उप-ऑब्जेक्ट स्थिति को स्पष्ट रूप से बदलता है।

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

चीजें जो सही मायने में इकाई परीक्षण नहीं हो सकती हैं:

  • अनंत लूप्स (एक थ्रेड मैनेजर, ड्राइवर या किसी अन्य प्रकार के लंबे चलने वाले कोड के लिए)
  • प्रत्यक्ष विधानसभा संचालन के कुछ प्रकार (जो कुछ भाषाओं का समर्थन करते हैं)
  • कोड जिसे विशेषाधिकार प्राप्त करने की आवश्यकता है (असंभव नहीं, सिर्फ एक अच्छा विचार नहीं)

2

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

डिज़ाइन किए गए कोड के खराब लिखे

  • अनुचित युग्मन (आमतौर पर तंग युग्मन जहां यह नहीं होना चाहिए)
  • रसोई सिंक कोड (जहां एक फ़ंक्शन में बहुत अधिक तर्क / जिम्मेदारियां हैं)

एक अलग दायरे में राज्य का रिलायंस

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

  • एकमात्र
  • वैश्विक
  • बंद

बाहरी / प्रणाली राज्य

  • हार्डवेयर / डिवाइस निर्भरता
  • नेटवर्क निर्भरता
  • फाइलसिस्टम निर्भरता
  • इंटर-प्रोसेस निर्भरता
  • अन्य प्रणाली कॉल निर्भरता

संगामिति

  • थ्रेडिंग (ताले, महत्वपूर्ण अनुभाग, आदि)
  • fork'ing
  • Coroutines
  • कॉल बैक करें
  • सिग्नल हैंडलर (सभी नहीं, लेकिन कुछ)

2

कोड जैसी कोई चीज नहीं है जिसका परीक्षण नहीं किया जा सकता है। हालाँकि, कोड के कुछ उदाहरण हैं जो वास्तव में हैं, वास्तव में परीक्षण करना कठिन है (संभवत: प्रयास के लायक नहीं होने के बिंदु पर):

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

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


0

इसके लिए मेरे मुख्य तीन समूह हैं:

  • कोड जो बाहरी सेवाओं पर निर्भर करता है

  • ऐसी प्रणालियाँ जो परीक्षकों को आवेदन के स्वतंत्र रूप से राज्य को संशोधित करने की अनुमति नहीं देती हैं।

  • परीक्षण वातावरण जो उत्पादन सेटअप को दोहराता नहीं है।

यह वही है जिसे मैंने एक डेवलपर के रूप में सबसे अधिक अनुभवी क्यूए इंजीनियर के रूप में अनुभव किया है।

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