आप यूनिट टेस्ट के मामले कैसे लिखते हैं?


14

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

सामान्य प्रवृत्ति क्या है? क्या डेवलपर्स को उन कोड के लिए यूनिट टेस्ट केस लिखना चाहिए जो उन्होंने खुद लिखे थे?


2
"सहारे"? "डिंट" का क्या अर्थ है?
S.Lott

जवाबों:


12

इस ब्लॉग पोस्ट को पढ़ने का प्रयास करें: राइटिंग ग्रेट यूनिट टेस्ट: सर्वश्रेष्ठ और सबसे खराब अभ्यास

लेकिन वेब पर अनगिनत अन्य हैं।

आपके सवालों के सीधे जवाब में ...

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

और आपने परीक्षण लिखने का जो तरीका बताया (आपके प्रश्न में) पूरी तरह से गलत है !!


9

यह दृष्टिकोण इकाई परीक्षण को बेकार बनाता है।

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


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

2
इसके अलावा, मुझे लगता है कि आपने "टेस्ट करने के लिए कोड लिखने के बाद टेस्ट लिखा था" क्या आपने किया था?
पेटर तोर्क

@ पेटर, शब्दांकन गलत हो गया - आपने इसे सही पाया। लेकिन, यदि आप परीक्षण लिखने का निर्णय लेते हैं तो उन्हें उपयोगी होने के लिए कुछ करना चाहिए। यह कहते हुए कि यह एक परीक्षण है, बस आँख बंद करके कोड करना - मेरी राय में - परीक्षण नहीं है।

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

3

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


3

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

अपने आप से पूछें: हम इकाई परीक्षण क्यों लिखते हैं? गोइंग ग्रीन स्पष्ट रूप से अंत का एक साधन है, अंतिम लक्ष्य परीक्षण के तहत कोड के बारे में दावे को साबित करना या रोकना है।

मान लें कि आपके पास एक विधि है जो फ्लोटिंग-पॉइंट संख्या के वर्गमूल की गणना करती है। जावा में, इंटरफ़ेस इसे इस प्रकार परिभाषित करेगा:

public double squareRoot(double number);

इससे कोई फर्क नहीं पड़ता है कि आपने कार्यान्वयन लिखा है या किसी और ने किया है, आप वर्ग-गुण के कुछ गुणों पर जोर देना चाहते हैं:

  1. यह sqrt (4.0) की तरह साधारण जड़ें लौटा सकता है
  2. यह एक वास्तविक सटीक sqrt (2.0) की तरह एक वास्तविक जड़ पा सकते हैं
  3. यह पाता है कि sqrt (0.0) 0.0 है
  4. यह एक अवैध संख्या फेंकता है जब एक नकारात्मक संख्या खिलाया जाता है, यानी sqrt (-1.0) पर

इसलिए आप इन्हें व्यक्तिगत परीक्षण के रूप में लिखना शुरू करते हैं:

@Test
public void canFindSimpleRoot() {
  assertEquals(2, squareRoot(4), epsilon);
}

ओह, यह परीक्षण पहले से ही विफल है:

java.lang.AssertionError: Use assertEquals(expected, actual, delta) to compare floating-point numbers

आप फ़्लोटिंग पॉइंट अंकगणित के बारे में भूल गए। ठीक है, तुम परिचय double epsilon=0.01और जाओ:

@Test
public void canFindSimpleRootToEpsilonPrecision() {
  assertEquals(2, squareRoot(4), epsilon);
}

और अन्य परीक्षण जोड़ें: अंत में

@Test
@ExpectedException(IllegalArgumentException.class)
public void throwsExceptionOnNegativeInput() {
  assertEquals(-1, squareRoot(-1), epsilon);
}

और उफ़, फिर से:

java.lang.AssertionError: expected:<-1.0> but was:<NaN>

आपको परीक्षण करना चाहिए:

@Test
public void returnsNaNOnNegativeInput() {
  assertEquals(Double.NaN, squareRoot(-1), epsilon);
}

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

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

@Test
public void throwsNoExceptionOnNegativeInput() {
  assertNotNull(squareRoot(-1)); // Shouldn't this fail?
}

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

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


1

जब मैं लिखने के मामलों (प्रिंटर के लिए) का परीक्षण करता हूं, तो मैं प्रत्येक छोटे घटकों के बारे में सोचने की कोशिश करता हूं .... और संभवतः इसे तोड़ने के लिए मैं क्या कर सकता हूं। तो उदाहरण के लिए स्कैनर यह बताने देता है कि वह किस कमांड का उपयोग करता है (pjl प्रिंटर-जॉब-भाषा में) मैं हर कार्यक्षमता का परीक्षण करने के लिए क्या लिख ​​सकता हूं .... ठीक है अब मैं क्या करने की कोशिश कर सकता हूं और इसे तोड़ सकता हूं।

मैं प्रत्येक प्रमुख घटकों के लिए ऐसा करने की कोशिश करता हूं, लेकिन जब सॉफ्टवेयर की बात आती है और इतना हार्डवेयर नहीं कि आप प्रत्येक विधि / फ़ंक्शन को देखना चाहते हैं और सीमाओं और इस तरह की जाँच कर सकते हैं।


1

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

यह TDD नहीं होगा क्योंकि आपने पहले परीक्षण नहीं लिखा था, लेकिन आप स्थिति को सुधार सकते हैं। आप स्टब्स के साथ परीक्षण के तहत वस्तुओं की एक प्रति भी बनाना चाह सकते हैं ताकि कोड विफल होने पर आपके परीक्षण ठीक से काम कर सकें।

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