आप यूनिट परीक्षण पर कितना समय बिताते हैं?


27

जिस कंपनी में मैं काम करता था, अधिकारियों ने जोर देकर कहा था कि यूनिट परीक्षणों के साथ कोड कवरेज 99% या अधिक होना चाहिए। इसके परिणामस्वरूप कोड की तुलना में अधिक परीक्षण लिखे गए। इसे लागू करने के लिए हमें एक ही वर्ग के लिए परीक्षण लिखने के लिए सचमुच 3 दिन लगे।

नतीजतन, हालांकि, मैंने टीडीडी, परीक्षण उपकरण, प्रथाओं आदि के बारे में बहुत कुछ सीखा।

कंपनी में मैंने बाद में काम किया, इकाई परीक्षण एक अज्ञात चीज थी। यह कुछ ऐसा था जो शायद पहले किसी ने सुना हो। मैंने उन्हें इकाई परीक्षण की अवधारणा से परिचित कराने के लिए संघर्ष किया, लेकिन बिना प्रभाव के।

अब, एक स्वरोजगार के रूप में, मुझे आश्चर्य है - यूनिट परीक्षण पर खर्च करने के लिए वास्तव में कितना समय आवश्यक है? ज्यादातर iPhone / Android डेवलपर होने के नाते, कोड के किन हिस्सों को परीक्षणों में शामिल किया जाना चाहिए?


मेरी पिछली कंपनी में, यह जावा ईई, धारियों और स्ट्रट्स की रूपरेखा थी। जैसा कि मैंने कहा, अब यह ज्यादातर iPhone और Android विकास है।
मैगी

TDD का मतलब है कि आप कोड से पहले परीक्षण लिखते हैं। ऐसा लगता है कि यह "तथ्य के बाद" परीक्षण था, जो कुछ और है।

प्रबंधकों ने तकनीक की परवाह नहीं की, मेरी टीम के नेता ने TDD पर जोर दिया। यह दोनों के संयोजन के रूप में समाप्त हुआ :)
मैगी

: मैगी, आप इस लेख दिलचस्प लग सकते fastcompany.com/magazine/06/writestuff.html

क्या समय का अनुमान लगाने के लिए कुछ मेटकासिस है? JS / .NET कोड के लिए उपकरण?
नरक

जवाबों:


16

यूनिट परीक्षण की जरूरत है कि कई कारकों पर निर्भर करता है:

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

10

हमारे उत्पाद समूह में, हम इकाई परीक्षणों से 50-70% कोड कवरेज और संयुक्त परीक्षणों और परीक्षण स्वचालन से 90% + कवरेज का लक्ष्य रखते हैं। इकाई परीक्षणों को लिखने के लिए आम तौर पर बजट में प्रत्येक सुविधा के लिए लगभग 1 दिन होता है जो कोडिंग के 3-4 दिन लगते हैं। लेकिन यह बहुत सारे कारकों के साथ भिन्न हो सकता है।

99% कोड कवरेज महान है। यूनिट परीक्षण महान हैं। लेकिन अकेले यूनिट परीक्षण से 99% कोड कवरेज? मुझे लगता है कि यह विश्वास करना मुश्किल है कि आप इकाई परीक्षण से अकेले इतना कवरेज प्राप्त कर सकते हैं।

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

लेकिन आपने कहा कि तीन दिनों का परीक्षण लेखन केवल एक वर्ग के लिए था। शायद वर्ग ही इकाई परीक्षण के लिए डिज़ाइन नहीं किया गया था। क्या वर्ग UI लागू करता है? नेटवर्किंग? फ़ाइल I / O यदि हां, तो आपने अपने व्यावसायिक तर्क की तुलना में जावा रनटाइम का परीक्षण करने के लिए अधिक कोड लिखना समाप्त कर दिया होगा जो रनटाइम के साथ इंटरैक्ट करता है।

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


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

2
इसीलिए आपको पहले टेस्ट लिखना चाहिए। फिर आप उन प्राकृतिक स्थानों का पता लगा सकते हैं जहाँ तर्क एक साथ दिखाई देते हैं।

10

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

आप जो चाहते हैं, वह यह है कि यदि आप गलती से अपनी कार्यक्षमता बदलते हैं तो आपके परीक्षण टूट जाते हैं, इसलिए आप इन चीजों को जितना जल्दी हो सके पाते हैं। जब कार्यक्षमता अप्रत्याशित रूप से बदलती है तो ग्राहक दृढ़ता से नापसंद करते हैं।


3
और आप खराब दिखते हैं जब आप बग ए को ठीक करते हैं बग को केवल बी एंड सी
जेएफओ

यह निर्भर करता है कि B और C परीक्षण द्वारा पकड़े गए हैं या नहीं

"अब आप अपने विचार से अधिक समय बनाए रखने में खर्च करेंगे" - वास्तव में, विशेष रूप से इस बात को ध्यान में रखते हुए कि SW उत्पाद आमतौर पर अपने नियोजित जीवनकाल की रूपरेखा बनाते हैं, अक्सर।
Péter Török

आप वास्तव में "योजना" नहीं कर सकते हैं एक लंबे समय तक रहने वाले आवेदन के बाद से आप पहले से नहीं बता सकते हैं कि परियोजना सफल होगी या नहीं। आपको हमेशा इस बात पर विचार करना चाहिए कि परीक्षण के लिए बजट का समय कब है
एरन गैपरिन

1
@ Eran, इसलिए आपको असफलता के लिए योजना बनानी चाहिए ताकि आपको परीक्षणों के लिए बजट न करना पड़े?

4

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

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


हां, मेरे लिए यह सच है (वास्तव में मैं आमतौर पर परीक्षणों पर काम करने और उत्पाद कोड पर हर कुछ सेकंड में काम करता हूं, मिनट नहीं।) इसलिए मैं यकीनन समय के 100% परीक्षणों पर काम कर रहा हूं।
जोनाथन हार्टले

2

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


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

3
@ कोडर, क्योंकि लोगों के पास अनुभव है और जानते हैं कि परीक्षण अंधे डिबगिंग की तुलना में बहुत अधिक उपयोगी हैं।
OZ_

2
निर्भर करता है। यूनिट-परीक्षण अक्सर काउंटर-उत्पादक होते हैं और सुरक्षा की झूठी भावना जोड़ते हैं। और अच्छी तरह से संरचित कोड में आप "अंधे डिबगिंग" समस्या में नहीं आएंगे। आपको एक समस्या मिलती है, आप जानते हैं कि कहां देखना है। यदि आप नहीं करते हैं, तो एक पूर्ण कोड / डिज़ाइन समीक्षा करें। इसे भी देखें: programmers.stackexchange.com/questions/86636/…
Coder

4
कई TDD समर्थकों के साथ यही समस्या है, उनके पास सभी डिबगिंग खोजने के लिए परीक्षणों पर भरोसा करते हुए डिबगिंग और डिज़ाइन के खिलाफ शत्रुतापूर्ण रुख है। फिर, उत्पादन कोड में, एप्लिकेशन मेमोरी, हैंडल को लीक करते हैं, और मल्टी-कोर पर क्रैश करते हैं, और वे पसंद हैं? WTH ?. टीडीडी केवल एक उपकरण है, और हाथ में काम के आधार पर या तो बहुत उत्पादक हो सकता है, या बहुत उल्टा हो सकता है। लिंक किए गए पोस्ट में सभी कठिन मामलों के लिए यूनिट-परीक्षण लिखने की कोशिश करें, और आप उत्पाद को कभी भी शिप नहीं करेंगे।
कोडर

1
"यदि आप उपकरण जानते हैं, तो आप शायद ही कभी एक समस्या में भागते हैं जिसमें डिबग करने में 5 मिनट से अधिक समय लगता है।" - @ कोड मुझे आश्चर्य है कि आप किस प्रकार के एप्लिकेशन देख रहे हैं।
कर्क ब्रॉडहर्स्ट

2

जैसा कि दूसरों ने पहले ही नोट किया है, यह काफी हद तक सॉफ्टवेयर के प्रकार पर निर्भर करता है। आपके द्वारा उल्लिखित 3: 1 परीक्षण / विकास समय अनुपात औसत परियोजनाओं के लिए थोड़ा बहुत हो सकता है, लेकिन मिशन महत्वपूर्ण ऐप्स के लिए पूरी तरह से ठीक हो सकता है और जीवन की महत्वपूर्ण प्रणाली के लिए बहुत कम हो सकता है।

99 +% यूनिट टेस्ट कवरेज समान रूप से औसत ऐप के मामले में उम्मीद करने के लिए बहुत अधिक है, लेकिन जीवन की महत्वपूर्ण परियोजना के लिए बहुत कम है।

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


क्या आपके पास मोबाइल ऐप्स का अनुभव है? एक साधारण मोबाइल एप्लिकेशन के लिए एक स्वीकार्य परीक्षण / विकास अनुपात क्या होगा?
मैगी

@ मैगी, दुर्भाग्य से नहीं। (इसलिए अगर मुझे एक लिखने की आवश्यकता है, तो मैं शायद यूनिट परीक्षण पर अपने सामान्य समय से अधिक खर्च करूंगा :-)
पेटर टॉरक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.