आपने यूनिट परीक्षण को और अधिक सुखद कैसे बनाया है? [बन्द है]


18

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

यह "इकाई परीक्षण का सही तरीका क्या है" सवाल नहीं है। मैं बस छोटे व्यक्तिगत गुर जानना चाहता हूं जो इकाई परीक्षणों को लिखने की बोरियत (मुझे कहने की हिम्मत) को कम करते हैं।


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

इकाई परीक्षण में आलस्य और निराशा काम करने के लिए एक सामान्य प्रतिक्रिया है जो हमारे मस्तिष्क को बेकार मानती है। मुझे यूनिट परीक्षणों को लिखने और बनाए रखने से नफरत है जो बहुत कम या नकारात्मक आरओआई हैं। हालाँकि उपयोगी परीक्षण लिखना एक सुखद कार्य है लेकिन यह अपने आप में एक कौशल है कि यह पहचानना कि क्या उपयोगी है और क्या बकवास है। : एक आदमी है जो अपने ब्लॉग पर आधारित इस विषय पर एक किताब लिख रहा है नहीं है, आप यहाँ पढ़ने तारांकित कर सकते हैं enterprisecraftsmanship.com/2016/06/01/...
कोला

जवाबों:


22

सबसे पहले, मैं आपके साथ सहमत हूं - यदि आप पहले से ही पूर्ण कोड पर अपनी इकाई परीक्षण लिख रहे हैं, या आप मैन्युअल रूप से अपने कोड का परीक्षण कर रहे हैं, तो मुझे लगता है कि बहुत उबाऊ भी है।

मुझे लगता है कि मेरे लिए इकाई परीक्षण के दो तरीके हैं जो वास्तव में इसे सुखद बनाते हैं:

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

12

स्मग श्रेष्ठता।

मैं केवल आधा मजाक कर रहा हूं। "मुझे देखो, अच्छी प्रोग्रामिंग आदतों की खेती! यह 'यूनिट टेस्टिंग' सामान कुछ है मुझे दस साल से एगो कभी नहीं किया होगा - क्या एक मूर्ख! और बस उन सभी कीड़ों के बारे में सोचो जो मैं एक परिणाम के रूप में पकड़ने जा रहा हूं। यह उबाऊ, थकाऊ काम मैं अभी कर रहा हूँ - मेरा कोड बहुत बढ़िया होगा! मुझे पक्का पता चल जाएगा! *

* - नहीं, मैं नहीं करूँगा।

मुझे लगता है कि यह बाहर काम करने या स्वस्थ खाने की तरह है; जब तक मूर्त लाभ वास्तव में लात मारता है ("पवित्र गेंदों, मैं वास्तव में एप्रेशन-क्रिप्ट-टन ऑफ रिग्रेशन एरर्स को पकड़ रहा हूं, जो उत्पादन में घुस गया होगा!"), यह जानने का नैतिक गौरव कि आप राइट थिंग कर रहे हैं, आपको ले जाने में मदद कर सकता है। के माध्यम से।


7

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

उदाहरण के लिए, कुछ लोग एक फ़ंक्शन लिखेंगे, और फिर कुछ मूल्यों पर इसका परीक्षण करने के लिए एक इंटरैक्टिव सत्र खोलें और सुनिश्चित करें कि यह काम कर रहा है:

def fact x
  if x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact 10
=> 3628800
>> fact 7
=> 5040

लेकिन अब आप एक बग की खोज करते हैं:

>> fact -1
SystemStackError: stack level too deep
    from (irb):2:in `fact'
    from (irb):5:in `fact'
    from (irb):10

तो आप इसे ठीक करें:

def fact x
  if x < 0
    raise "Can't take the factorial of a negative number"
  elsif x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact -1
RuntimeError: Can't take the factorial of a negative number
    from (irb):3:in `fact'
    from (irb):10

लेकिन अब आपको वास्तव में यह सुनिश्चित करने के लिए परीक्षण करना चाहिए कि यह अभी भी काम करता है:

>> fact 10
=> 3628800
>> fact 7
=> 5040

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

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

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


@ बीरन, मैं सहमत हूँ। लेकिन यह सब इसे "सही" चीज़ बनाता है। लेकिन कोई इसे कैसे सुखद बनाता है? थोड़ा भी?
15

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

तो, इसे बुरी तरह से करने में समय बिताएं, ताकि ऐसा करने से RIGHT की तुलना मज़ेदार लगे? ... वह काम कर सकता है, वास्तव में ....
ब्लेयरहिपो

@ बीरन, मैं मानता हूं, एक व्यक्ति को "पहले" करना चाहिए - न केवल बोरियत को खत्म करने के लिए, बल्कि मुझे लगता है कि इसमें सही तरीका यह है कि इकाई परीक्षण के वास्तविक लाभों को प्राप्त करने के लिए।
13

@Biran, धन्यवाद! मैंने हाल ही में अपने एक शौक प्रोजेक्ट पर टीडीडी का इस्तेमाल किया और इसने इकाई परीक्षण के बारे में मेरे सोचने के तरीके को बदल दिया।
प्री

5

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


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

@ सड़कों: मैं मानता हूं, कभी-कभी यह मजेदार हो सकता है, लेकिन मेरे लिए, डिजाइन कार्यान्वयन की तुलना में बहुत अधिक दिलचस्प है। इस प्रकार मैं कार्यान्वयन पर अधिक समय बिताना पसंद नहीं करता। मैं इसे सीधे आगे और पूर्वानुमान के लिए पसंद करता हूं, खासकर क्योंकि यह अधिक विश्वसनीय समय कार्यक्रम बनाने की अनुमति देता है। जितना मैं सॉफ्टवेयर बनाने की प्रक्रिया का आनंद लेता हूं, मुझे लगता है कि परिणाम निर्णायक है।
back2dos

ओह मैं पूरी तरह से सहमत हूँ! यादृच्छिक बग के साथ एक प्रणाली रातों की नींद हराम कर सकती है .. मेरी पसंद केवल एक अवास्तविक दुनिया में एक प्राथमिकता थी जहां मज़ेदार मामलों के अलावा कुछ भी नहीं था!
Preets

3

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


3

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


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

1

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


ás, आप क्यों कहते हैं कि इकाई परीक्षण को बहुत अधिक विचार की आवश्यकता नहीं है? यदि आप TDD के साथ काम करते हैं तो इसमें बहुत अधिक सोच शामिल है। क्या यह सच नहीं है?
Preets

आप सही हैं, मैंने टीडीडी को ध्यान में नहीं रखा।
तमसे सजेलेई

0

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


0

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

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

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

वास्तव में, उत्तर एक शानदार "नहीं" है।

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


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

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