unit-testing - unit - यूनिट टेस्ट क्या है




यूनिट परीक्षणों में डुप्लिकेट कोड अधिक सहनशील है? (8)

"उन्हें अधिक ड्रवाई बनाने के लिए उन्हें दोहराया - प्रत्येक परीक्षण का इरादा अब स्पष्ट नहीं था"

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

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

पुराने समय में हमारे पास परीक्षण उपकरण थे जो विभिन्न प्रोग्रामिंग भाषाओं का उपयोग करते थे। परीक्षणों के साथ सुखद, काम करने के लिए काम करना मुश्किल था (या असंभव)।

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

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

क्या आप सहमत हैं कि यह व्यापार बंद है? यदि हां, तो क्या आप अपने परीक्षणों को पठनीय, या रखरखाव करने के लिए पसंद करते हैं?


आदर्श रूप से, लिखे जाने के बाद यूनिट परीक्षणों को ज्यादा नहीं बदला जाना चाहिए, इसलिए मैं पठनीयता की ओर झुकाऊंगा।

इकाई परीक्षण होने के कारण जितना संभव हो उतना अलग-अलग परीक्षणों को उन विशिष्ट कार्यक्षमताओं पर केंद्रित रखने में मदद करता है जिन्हें वे लक्षित कर रहे हैं।

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


कार्यान्वयन कोड और परीक्षण विभिन्न जानवर हैं और फैक्टरिंग नियम उनके लिए अलग-अलग लागू होते हैं।

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

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

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

जब तक प्रत्येक टेस्ट विधि लगभग 20 लाइनों से कम रहता है तब तक मैं परीक्षण कोड में तुच्छ डुप्लिकेशन को अनदेखा करता हूं। मुझे पसंद है जब सेटअप-रन-सत्यापित ताल परीक्षण विधियों में स्पष्ट है।

जब परीक्षण के "सत्यापित" भाग में डुप्लिकेशन क्रिप्प्स होता है, तो अक्सर कस्टम दावा विधियों को परिभाषित करने के लिए फायदेमंद होता है। बेशक, उन विधियों को अभी भी एक स्पष्ट रूप से पहचाने गए संबंध का परीक्षण करना चाहिए जिसे विधि नाम में स्पष्ट किया जा सकता है: assertPegFitsInHole -> अच्छा, assertPegIsGood -> खराब।

जब परीक्षण विधियां लंबी और दोहराई जाती हैं तो कभी-कभी मुझे कुछ पैरामीटर लेने वाले भरने वाले इन-ब्लैंक परीक्षण टेम्पलेट को परिभाषित करने में उपयोगी लगता है। फिर वास्तविक परीक्षण विधियों को उचित पैरामीटर के साथ टेम्पलेट विधि में कॉल में कम कर दिया जाता है।

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


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


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

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


मुझे नहीं लगता कि अधिक डुप्लीकेट और पठनीय कोड के बीच संबंध है। मुझे लगता है कि आपका टेस्ट कोड आपके दूसरे कोड के जितना अच्छा होना चाहिए। गैर-दोहराव कोड अधिक पठनीय है, फिर अच्छी तरह से किया जाने पर डुप्लिकेट कोड।


मैं इस वजह से rspec प्यार करता हूँ:

इसमें मदद करने के लिए 2 चीजें हैं -

  • सामान्य व्यवहार का परीक्षण करने के लिए साझा उदाहरण समूह।
    आप परीक्षणों का एक सेट परिभाषित कर सकते हैं, फिर अपने असली परीक्षणों में सेट 'शामिल' करें।

  • घोंसला संदर्भ।
    आप अनिवार्य रूप से कक्षा में हर एक नहीं, अपने परीक्षणों के एक विशिष्ट सबसेट के लिए 'सेटअप' और 'टियरडाउन' विधि कर सकते हैं।

जितनी जल्दी हो सके .NET / Java / अन्य परीक्षण ढांचे इन तरीकों को अपनाते हैं, बेहतर (या आप अपने परीक्षण लिखने के लिए आयरनआरबी या जेआरबी का उपयोग कर सकते हैं, जिसे मैं व्यक्तिगत रूप से सोचता हूं बेहतर विकल्प है)


मैं सहमत हूँ। व्यापार बंद है लेकिन विभिन्न स्थानों में अलग है।

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





code-duplication