क्या हमें अपने सभी तरीकों का परीक्षण करना चाहिए?


61

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

SomeClass getSomething(parameters) {
    return myDao.findSomethingBySomething(parameters);
}

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

यह मुझे लगता है, हालांकि। क्या हमें उच्चतम परीक्षण कवरेज% के लिए प्रयास करना चाहिए? या फिर यह कला के लिए बस एक कला है? मैं चीजों को परखने के पीछे कोई कारण नहीं देखता:

  • गेटर्स और सेटर (जब तक कि उनमें वास्तव में कुछ तर्क न हो)
  • "बॉयलरप्लेट" कोड

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

क्या कोई तर्कसंगत / "ज्वलनशील" कारण नहीं है कि किसी को हर एक (या जितने भी हो सकते हैं) को कोड की रेखा का परीक्षण क्यों करना चाहिए?


2
मैं अभी भी इस सवाल पर अपना मन बना रहा हूं, लेकिन यहां किसी ऐसे व्यक्ति की बात है जिसने जवाब तय किया है "नहीं"। इयान कूपर: टीडीडी, जहां यह सब गलत हो गया था इस महान बात को संक्षेप में बताने के लिए, आपको बाहर का परीक्षण करना चाहिए और नए व्यवहारों का परीक्षण करना चाहिए न कि नए तरीकों का।
डैनियल कपलान

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


यह कुछ हद तक आपके सिस्टम पर निर्भर करेगा, अगर आप एक सिस्टम को विकसित कर रहे हैं, जिसमें मध्यम से लेकर सुरक्षा स्तर तक की ऊँचाई है, तो आपको ट्रिवेलिटी
jk

जवाबों:


48

मैं केंट बेक के अंगूठे के नियम से जाता हूं:

सब कुछ का परीक्षण करें जो संभवतः टूट सकता है।

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

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


आह मैं उस बोली को बिलकुल भूल गया! मुझे लगता है कि मैं इसे अपने मुख्य तर्क के रूप में उपयोग करूंगा क्योंकि स्पष्ट रूप से - यहां क्या टूट सकता है? वास्तव में ज्यादा नहीं। केवल एक चीज जो टूट सकती है वह है विधि आह्वान और अगर ऐसा होता है तो इसका मतलब है कि वास्तव में कुछ बुरा हुआ है। धन्यवाद!
ज़ेनजेन

5
@Zenzen: "यहाँ क्या टूट सकता है? वास्तव में बहुत ज्यादा नहीं।" - तो यह टूट सकता है । बस एक छोटा सा टाइपो। या कोई कुछ कोड जोड़ता है। या निर्भरता को गड़बड़ कर देता है। मुझे वास्तव में लगता है कि बेक दावा करेगा कि आपका मुख्य उदाहरण टूटने योग्य है। गेटर्स और सेटर्स, कम, हालांकि मैंने खुद को कॉपी / पेस्ट त्रुटि में पकड़ा है, तब भी। असली सवाल यह है कि अगर टेस्ट लिखना बहुत तुच्छ है, तो इसका अस्तित्व क्यों है?
पीडीआर

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

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

7
नेत्रहीन हर चीज का परीक्षण करना जो तोड़ नहीं सकता था। ऐसी रणनीति बनाने की जरूरत है जहां उच्च जोखिम वाले घटकों का पहले परीक्षण किया जाए।
कोडार्ट

12

यूनिट परीक्षण के कुछ प्रकार हैं:

  • राज्य आधारित। आप कार्य करते हैं और फिर ऑब्जेक्ट की स्थिति के खिलाफ दावा करते हैं। जैसे मैं एक जमा करता हूं। मैं तो यह देखने के लिए जांच करता हूं कि क्या बैलेंस बढ़ गया है।
  • वापसी मूल्य आधारित। आप वापसी मूल्य के खिलाफ काम करते हैं और जोर देते हैं।
  • सहभागिता आधारित है। आप सत्यापित करते हैं कि आपकी वस्तु को दूसरी वस्तु कहा जाता है। ऐसा लगता है कि आप अपने उदाहरण में क्या कर रहे हैं।

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

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

  • जांचें कि मैंने सटीक पैरामीटर के साथ डेटा एक्सेस लेयर कहा है जिसे पास किया गया है।
  • जांचें कि यह केवल एक बार बुलाया गया है।
  • जांचें कि मैं ठीक वही हूं जो डेटा एक्सेस लेयर द्वारा मुझे दिया गया है। अन्यथा मैं भी अशक्त हो सकता है।

वर्तमान में वहाँ कोई तर्क नहीं है, लेकिन यह हमेशा मामला नहीं होगा।

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

मैं अन्य घटकों के परीक्षण पर भी ध्यान केंद्रित करूंगा यदि इस पद्धति के लिए एकीकरण परीक्षण था। मैं अभी तक एक कंपनी को ठोस एकीकरण परीक्षणों के साथ देख रहा हूं।

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

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


आप यह क्यों जाँचेंगे कि आपके DAL को केवल एक बार बुलाया गया है?
मार्जन वेनमा

9

यहाँ आपके सॉफ़्टवेयर की गुणवत्ता के बारे में सोचने का अच्छा तरीका है:

  1. टाइप चेकिंग समस्या का हिस्सा है।
  2. परीक्षण बाकी संभाल लेंगे

बॉयलरप्लेट और तुच्छ कार्यों के लिए, आप यह काम कर रहे प्रकार की जाँच पर भरोसा कर सकते हैं, और बाकी के लिए, आपको परीक्षण मामलों की आवश्यकता है।


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

6

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


याद रखें कि कुछ गेटर्स या सेटर के साइड इफेक्ट्स होते हैं (हालांकि यह हतोत्साहित किया जाता है और ज्यादातर मामलों में बुरा व्यवहार माना जाता है), इसलिए आपके स्रोत कोड में परिवर्तन भी इसे प्रभावित कर सकता है।
आंद्रेज बोबाक

3

TDD के साथ एक शानदार YES (और कुछ अपवादों के साथ)

विवादास्पद ठीक है, लेकिन मेरा तर्क है कि जो कोई भी इस प्रश्न का उत्तर 'नहीं' दे रहा है, उसे TDD की मौलिक अवधारणा याद आ रही है।

मेरे लिए, यदि आप TDD का अनुसरण करते हैं, तो उत्तर एक शानदार हां है । यदि आप नहीं हैं तो कोई प्रशंसनीय उत्तर नहीं है।

TDD में DDD

TDD को अक्सर आपको मुख्य लाभ के रूप में उद्धृत किया जाता है।

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

कार्यान्वयन से अलग जिम्मेदारी

प्रोग्रामर के रूप में, यह बहुत महत्वपूर्ण है कि विशेषताओं के महत्व के बारे में सोचने के लिए और कुछ ओवरहेड के रूप में गेटर्स और सेटर।

लेकिन विशेषताएँ एक कार्यान्वयन विवरण हैं, जबकि बसने वाले और गेटर्स एक संविदात्मक इंटरफ़ेस हैं जो वास्तव में कार्यक्रमों को काम करते हैं।

किसी वस्तु पर वर्तनी के लिए यह अधिक महत्वपूर्ण है:

अपने ग्राहकों को इसकी स्थिति बदलने की अनुमति दें

तथा

अपने ग्राहकों को इसकी स्थिति के बारे में बताने की अनुमति दें

फिर यह राज्य वास्तव में कैसे संग्रहीत किया जाता है (जिसके लिए एक विशेषता सबसे आम है, लेकिन एकमात्र तरीका नहीं है)।

एक परीक्षण जैसे

(The Painter class) should store the provided colour

TDD के प्रलेखन भाग के लिए महत्वपूर्ण है ।

तथ्य यह है कि अंतिम कार्यान्वयन तुच्छ (विशेषता) है और जब आप परीक्षण लिखते हैं तो कोई रक्षा लाभ नहीं होता है।

राउंड-ट्रिप इंजीनियरिंग की कमी ...

सिस्टम डेवलपमेंट वर्ल्ड में प्रमुख समस्याओं में से एक राउंड-ट्रिप इंजीनियरिंग 1 की कमी है - एक सिस्टम की डेवलपमेंट प्रक्रिया असंतुष्ट उप-प्रक्रियाओं में खंडित हो जाती है जिसमें (प्रलेखन, कोड) अक्सर असंगत होते हैं।

1 ब्रॉडी, माइकल एल। "जॉन मायलोपोलोस: वैचारिक मॉडलिंग के बीज बोना।" वैचारिक मॉडलिंग: नींव और अनुप्रयोग। स्प्रिंगर बर्लिन हीडलबर्ग, 2009. 1-9।

... और टीडीडी इसे कैसे हल करता है

यह टीडीडी का प्रलेखन हिस्सा है जो यह सुनिश्चित करता है कि सिस्टम और इसके कोड के विनिर्देश हमेशा सुसंगत हैं।

पहले डिजाइन करें, बाद में लागू करें

टीडीडी के भीतर हम पहले असफलता परीक्षण लिखते हैं, उसके बाद ही कोड लिखते हैं जो उन्हें पास होने देता है।

उच्च-स्तरीय BDD के भीतर, हम पहले परिदृश्य लिखते हैं, फिर उन्हें पास करते हैं।

आपको बसने और पाने वाले को बाहर क्यों करना चाहिए?

सिद्धांत रूप में, टीडीडी के भीतर एक व्यक्ति के लिए परीक्षण लिखना पूरी तरह से संभव है, और एक और कोड को लागू करने के लिए जो इसे पास करता है।

इसलिए खुद से पूछें:

क्या क्लास लिखने वाले व्यक्ति को गेटर्स और सेटर का उल्लेख करना चाहिए।

चूँकि गेटर्स और सेटर एक वर्ग के लिए एक सार्वजनिक इंटरफ़ेस हैं, इसलिए उत्तर स्पष्ट रूप से हाँ है , या किसी वस्तु की स्थिति को सेट या क्वेरी करने का कोई तरीका नहीं होगा।

जाहिर है, यदि आप पहले कोड लिखते हैं, तो उत्तर इतना स्पष्ट नहीं हो सकता है।

अपवाद

इस नियम के कुछ स्पष्ट अपवाद हैं - ऐसे कार्य जो स्पष्ट रूप से कार्यान्वयन विस्तार हैं और स्पष्ट रूप से सिस्टम के डिजाइन का हिस्सा नहीं हैं।

उदाहरण के लिए, एक स्थानीय विधि 'बी ()':

function A() {

    // B() will be called here    

    function B() {
        ...
    }
} 

या square()यहाँ निजी समारोह :

class Something {
private:
    square() {...}
public:
    addAndSquare() {...}
    substractAndSquare() {...}
}

या कोई अन्य फ़ंक्शन जो publicइंटरफ़ेस का हिस्सा नहीं है जिसे सिस्टम घटक के डिज़ाइन में वर्तनी की आवश्यकता होती है।


1

जब एक दार्शनिक विचित्रता का सामना करना पड़ता है, तो ड्राइविंग आवश्यकताओं को वापस छोड़ दें।

क्या आपका लक्ष्य प्रतिस्पर्धी लागत पर उचित विश्वसनीय सॉफ़्टवेयर का उत्पादन करना है?

या यह लागत की परवाह किए बिना उच्चतम संभव विश्वसनीयता के सॉफ्टवेयर का उत्पादन करने के लिए है?

एक बिंदु तक, गुणवत्ता और विकास की गति / लागत संरेखण के दो लक्ष्य: आप दोषों को ठीक करने की तुलना में कम समय लेखन परीक्षण खर्च करते हैं।

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

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

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


0

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

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


0

यह एक पेचीदा सवाल है।

सख्ती से कहूंगा कि यह जरूरी नहीं है। आप BDD स्टाइल यूनिट और सिस्टम लेवल टेस्ट लिखने से बेहतर हैं कि व्यावसायिक आवश्यकताएं सकारात्मक और नकारात्मक परिदृश्यों में काम करती हैं।

यह कहा गया है कि अगर आपका तरीका इन परीक्षा मामलों से कवर नहीं है, तो आपको यह सवाल करना होगा कि यह पहले स्थान पर क्यों है और अगर इसकी आवश्यकता है, या यदि आपके दस्तावेज़ या उपयोगकर्ता कहानियों में परिलक्षित कोड में छिपी आवश्यकताएं हैं, तो एक BDD शैली परीक्षण मामले में एन्कोड किया जाना चाहिए।

व्यक्तिगत रूप से मैं लगभग 85-95% तक लाइन द्वारा कवरेज रखना पसंद करता हूं और मौजूदा चेक टेस्ट कवरेज का बीमा करने के लिए मेनलाइन के लिए गेट चेक-इन प्रति लाइन सभी कोड फ़ाइलों के लिए इस स्तर को हिट करता है और यह कि कोई भी फाइल खुला नहीं है।

यह मानते हुए कि परीक्षण की सर्वोत्तम प्रथाओं का पालन किया जा रहा है, इससे डेवलपर्स को बिना कवरेज के समय बर्बाद करने के लिए समय बर्बाद करने की कोशिश करने के लिए डेवलपर्स को मजबूर करने के लिए बहुत सारी कवरेज मिलती है।


-1

यह समस्या अपने आप में ही सवाल है, आपको सभी "मेथाडोस" या सभी "वर्गों" का परीक्षण करने की आवश्यकता नहीं है जिन्हें आपको अपने सिस्टम की सभी विशेषताओं का परीक्षण करने की आवश्यकता है।

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

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

सुविधाओं / व्यवहारों में सोचें न कि विधि कक्षाओं में, मैं इसे पर्याप्त बार नहीं दोहरा सकता।


-4

यह मुझे लगता है, हालांकि। क्या हमें उच्चतम परीक्षण कवरेज% के लिए प्रयास करना चाहिए?

हां, आदर्श रूप से 100%, लेकिन कुछ चीजें इकाई परीक्षण योग्य नहीं हैं।

गेटर्स और सेटर (जब तक कि उनमें वास्तव में कुछ तर्क न हो)

गेटर्स / सेटर्स बेवकूफ हैं - बस उनका उपयोग न करें। इसके बजाय, अपने सदस्य चर को सार्वजनिक अनुभाग में रखें।

"बॉयलरप्लेट" कोड

सामान्य कोड प्राप्त करें, और इकाई इसका परीक्षण करें। यह उतना ही सरल होना चाहिए।

क्या कोई तर्कसंगत / "ज्वलनशील" कारण नहीं है कि किसी को हर एक (या जितने भी हो सकते हैं) को कोड की रेखा का परीक्षण क्यों करना चाहिए?

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

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


अच्छी तरह से एक चीज़ को सीधे होने दें: मेरा मतलब यह नहीं था कि मैं टीडीडी / लेखन परीक्षण का उपयोग नहीं करता हूं। काफी विपरीत। मुझे पता है कि परीक्षण बग के बारे में सोच सकते हैं जो मैंने नहीं सोचा था, लेकिन यहां परीक्षण करने के लिए क्या है? मैं बस यह सोचता हूं कि इस तरह की विधि "नॉट यूनिट टेस्टेबल" में से एक है। जैसा कि Péter Török ने कहा (Kent Beck के हवाले से) आपको ऐसे सामान का परीक्षण करना चाहिए जो टूट सकता है। संभवतः यहाँ क्या टूट सकता है? वास्तव में बहुत ज्यादा नहीं है (इस पद्धति में केवल एक साधारण प्रतिनिधिमंडल है)। मैं एक इकाई परीक्षण लिख सकता हूं, लेकिन इसमें केवल डीएओ और एक मुखर का मजाक होगा, बहुत परीक्षण नहीं। गेटर्स / सेटर्स के लिए कुछ फ्रेमवर्क की आवश्यकता होती है।
ज़ेनजन

1
इसके अलावा, जब से मैंने इसे नोट नहीं किया "गेट कॉमन कोड, और यूनिट टेस्ट।" यह उतना ही सरल होना चाहिए। " उससे तुम्हारा क्या मतलब है? यह एक सेवा वर्ग है (GUI और DAO के बीच एक सेवा परत में), यह पूरे ऐप के लिए सामान्य है। वास्तव में इसे अधिक सामान्य नहीं बना सकते हैं (क्योंकि यह कुछ मापदंडों को स्वीकार करता है और DAO में एक निश्चित विधि कहता है)। एकमात्र कारण यह है कि आवेदन की स्तरित वास्तुकला का पालन करना है इसलिए GUI सीधे DAO को कॉल नहीं करेगा।
ज़ेनजन

20
-1 के लिए "गेटर्स / सेटर्स बेवकूफ हैं - बस उनका उपयोग न करें। इसके बजाय, अपने सदस्य चर को सार्वजनिक अनुभाग पर रखें।" - बहुत गलत। इस पर एसओ से कई बार चर्चा हो चुकी है । हर जगह सार्वजनिक क्षेत्रों का उपयोग करना वास्तव में गेटर्स का उपयोग करने से भी बदतर है और हर जगह बसता है।
पेटर तोर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.