एक अच्छा यूनिट टेस्ट क्या है? [बन्द है]


97

मुझे यकीन है कि आप में से अधिकांश बहुत सारे स्वचालित परीक्षण लिख रहे हैं और यह कि आप इकाई परीक्षण के दौरान कुछ सामान्य नुकसानों में भाग चुके हैं।

मेरा प्रश्न है कि क्या आप भविष्य में समस्याओं से बचने के लिए परीक्षण लिखने के लिए किसी भी तरह के आचरण का पालन करते हैं? अधिक विशिष्ट होने के लिए: अच्छी इकाई परीक्षणों के गुण क्या हैं या आप अपने परीक्षण कैसे लिखते हैं?

भाषा अज्ञेय सुझावों को प्रोत्साहित किया जाता है।

जवाबों:


93

मुझे प्लग-इन स्रोतों से शुरू करने दें - जावा में प्रोगैमैटिक यूनिट टेस्टिंग विथ जेयूनाइट (इसमें सी # के साथ एक वर्जन भी है -न्यूनिट भी है .. लेकिन मेरे पास यह एक है .. अधिकांश भाग के लिए इसका अज्ञेय अनुशंसित है।)

अच्छे टेस्ट ट्रिप होने चाहिए ( ब्रीफ काफी चिपचिपा नहीं है - मेरे पास किताब में चीटशीट का एक प्रिंटआउट है जिसे मुझे यह सुनिश्चित करने के लिए बाहर निकालना पड़ा कि मुझे यह अधिकार मिला है ..)

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

  • अच्छे टेस्ट फास्ट भी चलते हैं । किसी भी परीक्षा को चलाने में आधा सेकंड से अधिक समय लगता है .. इस पर काम करने की आवश्यकता है। परीक्षण सूट एक रन के लिए अधिक समय लेता है .. कम बार इसे चलाया जाएगा। जितने अधिक बदलाव देव रन के बीच में घुसने की कोशिश करेंगे .. अगर कुछ भी टूटता है .. तो यह पता लगाने में अधिक समय लगेगा कि कौन सा बदलाव अपराधी था।

अद्यतन 2010-08:

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

इनके अलावा, अधिकांश अन्य ऐसे दिशानिर्देश हैं जो कम-लाभ वाले कार्यों में कटौती करते हैं: उदाहरण के लिए 'कोड का परीक्षण न करें जो आपके पास नहीं है' (जैसे तृतीय-पक्ष DLL)। परीक्षण गेटर्स और सेटर के बारे में मत जाना। लागत-से-लाभ अनुपात या दोष संभावना पर नज़र रखें।


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

मैं इसे एक जवाब के रूप में टक्कर दूँगा, क्योंकि मुझे "A TRIP" संक्षिप्त रूप से उपयोगी लगता है।
Spoike

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

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

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

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

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

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

2
"यदि आप केवल अपने कुछ कोड के लिए परीक्षण लिखते हैं, तो यह शायद ही उपयोगी है।" क्या वास्तव में यह मामला है? मुझे 20% कोड कवरेज के साथ परियोजनाएं मिली हैं (क्षेत्रों को विफल करने के लिए महत्वपूर्ण / प्रवण) और उन्होंने मुझे बड़े पैमाने पर मदद की, और परियोजनाएं भी ठीक हैं।
डॉ। बुराई

1
मैं स्लो से सहमत हूं। यहां तक ​​कि अगर कुछ ही परीक्षण हैं, तो उन्हें अच्छी तरह से लिखा और अलग-थलग किया जाता है, वे बहुत मदद करेंगे।
23

41

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

वाम्प के 5 टेस्ट लिखने के नियम:


1. लंबे, वर्णनात्मक परीक्षण विधि नामों का उपयोग करें।

   - Map_DefaultConstructorShouldCreateEmptyGisMap()
   - ShouldAlwaysDelegateXMLCorrectlyToTheCustomHandlers()
   - Dog_Object_Should_Eat_Homework_Object_When_Hungry()

2. अपने परीक्षणों को एक अरेंज / एक्ट / एसर शैली में लिखें ।

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

3. हमेशा अपने असर्स के साथ एक विफलता संदेश प्रदान करें।

Assert.That(x == 2 && y == 2, "An incorrect number of begin/end element 
processing events was raised by the XElementSerializer");
  • एक सरल अभी तक पुरस्कृत अभ्यास जो आपके धावक आवेदन में स्पष्ट करता है कि क्या विफल रहा है। यदि आप एक संदेश प्रदान नहीं करते हैं, तो आपको आमतौर पर अपनी असफलता आउटपुट में "अपेक्षित सत्य, गलत था" जैसा कुछ मिलेगा, जो आपको वास्तव में गलत क्या है यह जानने के लिए परीक्षण पढ़ने के लिए जाना पड़ता है।

4. परीक्षण का कारण टिप्पणी करें - व्यवसाय की धारणा क्या है?

  /// A layer cannot be constructed with a null gisLayer, as every function 
  /// in the Layer class assumes that a valid gisLayer is present.
  [Test]
  public void ShouldNotAllowConstructionWithANullGisLayer()
  {
  }
  • यह स्पष्ट लग सकता है, लेकिन यह अभ्यास उन लोगों से आपके परीक्षणों की अखंडता की रक्षा करेगा जो पहले स्थान पर परीक्षण के पीछे का कारण नहीं समझते हैं। मैंने देखा है कि कई परीक्षण निकाले गए या संशोधित किए गए, जो पूरी तरह से ठीक थे, सिर्फ इसलिए कि व्यक्ति उन मान्यताओं को नहीं समझ पाया था जो परीक्षण सत्यापित कर रहे थे।
  • यदि परीक्षण तुच्छ है या विधि नाम पर्याप्त रूप से वर्णनात्मक है, तो टिप्पणी को छोड़ना अनुमत हो सकता है।

5. प्रत्येक परीक्षण को हमेशा किसी भी संसाधन की स्थिति को वापस लेना चाहिए जिसे वह छूता है

  • वास्तविक संसाधनों से निपटने के लिए जहां संभव हो वहां मॉक का उपयोग करें।
  • सफाई का परीक्षण स्तर पर किया जाना चाहिए। निष्पादन के आदेश पर परीक्षणों का कोई भरोसा नहीं होना चाहिए।

2
बिंदु 1, 2 और 5 के कारण +1 महत्वपूर्ण हैं। 3 और 4 यूनिट परीक्षणों के लिए बहुत अधिक प्रतीत होते हैं, यदि आप पहले से ही वर्णनात्मक परीक्षण विधि के नाम का उपयोग कर रहे हैं, लेकिन मैं परीक्षण के प्रलेखन की सिफारिश करता हूं यदि वे दायरे में बड़े हैं (कार्यात्मक या स्वीकृति परीक्षण)।
स्पिकाइ

+1 डाउन-टू-अर्थ और व्यावहारिक ज्ञान और उदाहरण के लिए
फिल

17

इन लक्ष्यों को ध्यान में रखें (पुस्तक XUnit टेस्ट पैटर्न से Meszaros द्वारा अनुकूलित)

  • टेस्ट में जोखिम कम करना चाहिए, न कि इसे लागू करना चाहिए।
  • टेस्ट को चलाना आसान होना चाहिए।
  • टेस्ट को बनाए रखना आसान होना चाहिए क्योंकि सिस्टम उनके आसपास विकसित होता है

इसे आसान बनाने के लिए कुछ बातें:

  • टेस्ट केवल एक कारण से फेल होना चाहिए।
  • टेस्ट केवल एक चीज का परीक्षण करना चाहिए
  • परीक्षण निर्भरता कम करें (डेटाबेस, फ़ाइलों, यूआई आदि पर निर्भरता नहीं)

यह मत भूलो कि आप अपने एक्सयूनिट ढांचे के साथ इंटरग्रेशन परीक्षण भी कर सकते हैं लेकिन इंटरग्रेशन टेस्ट और यूनिट टेस्ट अलग रखें


मुझे लगता है कि आपका मतलब है कि आप जेरार्ड मेस्जारोस की पुस्तक "एक्सयूनिट टेस्ट पैटर्न" से अनुकूलित हैं। xunitpatterns.com
स्पाइक

हाँ, तुम सही हो। मैं स्पष्ट करूंगा कि पोस्ट में
Mendelt

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

9

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


9

महान इकाई परीक्षणों के कुछ गुण:

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

  • जब आप रिफ्लेक्टर करते हैं, तो कोई भी परीक्षण विफल नहीं होना चाहिए।

  • टेस्ट इतनी तेजी से चलने चाहिए कि आप उन्हें चलाने में कभी संकोच न करें।

  • सभी परीक्षण हमेशा पास होने चाहिए; कोई गैर-नियतात्मक परिणाम नहीं।

  • यूनिट टेस्ट आपके प्रोडक्शन कोड की तरह ही अच्छी तरह से होने चाहिए।

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


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

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

[TestFixture]
public class StackTests
{
    [TestFixture]
    public class EmptyTests
    {
        Stack<int> _stack;

        [TestSetup]
        public void TestSetup()
        {
            _stack = new Stack<int>();
        }

        [TestMethod]
        [ExpectedException (typeof(Exception))]
        public void PopFails()
        {
            _stack.Pop();
        }

        [TestMethod]
        public void IsEmpty()
        {
            Assert(_stack.IsEmpty());
        }
    }

    [TestFixture]
    public class PushedOneTests
    {
        Stack<int> _stack;

        [TestSetup]
        public void TestSetup()
        {
            _stack = new Stack<int>();
            _stack.Push(7);
        }

        // Tests for one item on the stack...
    }
}

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

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

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

7

परीक्षण के बाद कक्षा के व्यवहारों के परिसीमन के बाद आप क्या कर रहे हैं।

  1. अपेक्षित व्यवहारों का सत्यापन।
  2. त्रुटि मामलों का सत्यापन।
  3. कक्षा के भीतर सभी कोड रास्तों का कवरेज।
  4. कक्षा के भीतर सभी सदस्य कार्यों का अभ्यास करना।

मूल आशय वर्ग के व्यवहार में आपके आत्मविश्वास को बढ़ा रहा है।

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

HTH।

चियर्स,

लूटना


रोब - यांत्रिक यह अच्छा है, लेकिन यह इरादे को याद करता है। आपने यह सब क्यों किया? इस तरह से सोचने से दूसरों को टीडीडी के रास्ते में मदद मिल सकती है।
मार्क लेविसन

7

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


@Rismo प्रति से अनन्य नहीं है। परिभाषा के अनुसार, यहाँ जो क्वारेलसोम ने लिखा है, वह "टेस्ट फर्स्ट" पद्धति के लिए विशिष्ट है, जो टीडीडी का हिस्सा है। टीडीडी खाते में रिफ्लेक्टरिंग भी करता है। मैंने जो सबसे "स्मार्ट पैंटी" परिभाषा पढ़ी है वह है TDD = Test First + Refactor।
स्पोइक

हाँ, यह TDD होना जरूरी नहीं है, बस यह सुनिश्चित करें कि आपका परीक्षण पहले विफल हो गया। फिर बाद में बाकी तार। यह आमतौर पर टीडीडी करते समय होता है, लेकिन जब आप टीडीडी का उपयोग नहीं करते हैं तब भी इसे लागू कर सकते हैं।
Quibblesome

6

मुझे राइट BICEP की पूर्वोक्त व्यावहारिक इकाई परीक्षण पुस्तक से संक्षिप्तता पसंद है :

  • सही : क्या परिणाम सही हैं ?
  • B : क्या सभी b oundary स्थितियां सही हैं?
  • मैं : हम जांच कर सकता है मैं रिश्तों nverse?
  • सी : हम कर सकते हैं c रॉस की जांच के परिणाम अन्य साधनों का उपयोग करते हुए?
  • E : क्या हम rror परिस्थितियों को होने के लिए मजबूर कर सकते हैं?
  • P : सीमा के भीतर p विरूपता विशेषताएँ हैं?

व्यक्तिगत रूप से मुझे लगता है कि आप जाँच करके बहुत दूर निकल सकते हैं कि आपको सही परिणाम मिलें (1 + 1 को अतिरिक्त फ़ंक्शन में 2 वापस करना चाहिए), आप उन सभी सीमाओं की कोशिश कर सकते हैं जो आप सोच सकते हैं (जैसे कि दो संख्याओं का उपयोग करना जिनमें से योग ऐड फंक्शन में पूर्णांक अधिकतम मान से अधिक है) और नेटवर्क विफलता जैसी त्रुटि की स्थिति को मजबूर करता है।


6

अच्छे परीक्षणों को बनाए रखने की आवश्यकता है।

मुझे पता नहीं चला कि जटिल वातावरण के लिए यह कैसे करना है।

जैसे ही आपका कोड आधार 1000 या लाखों की संख्या में कोड तक पहुँचना शुरू होता है, सभी पाठ्यपुस्तकों को अनियंत्रित होना शुरू हो जाता है।

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

अच्छा आर्किटेक्चर कुछ इंटरैक्शन विस्फोट को नियंत्रित कर सकता है, लेकिन अनिवार्य रूप से सिस्टम अधिक जटिल हो जाता है क्योंकि स्वचालित परीक्षण प्रणाली इसके साथ बढ़ती है।

यह वह जगह है जहाँ आप व्यापार-नापसंद से निपटने के लिए शुरू करते हैं:

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

आपको यह भी तय करना होगा:

आप अपने कोड आधार में परीक्षण मामलों को कहाँ संग्रहीत करते हैं?

  • आप अपने परीक्षण मामलों को कैसे दर्ज़ करते हैं?
  • परीक्षण परीक्षण रखरखाव को बचाने के लिए पुन: परीक्षण का उपयोग किया जा सकता है?
  • क्या होता है जब एक नाइटली टेस्ट केस का निष्पादन विफल हो जाता है? कौन करता है ट्राइएज?
  • आप नकली वस्तुओं को कैसे बनाए रखते हैं? अगर आपके पास 20 मॉड्यूल्स हैं, जो मॉक लॉगिंग एपीआई के अपने स्वयं के स्वाद का उपयोग करते हैं, तो एपीआई रिपल्स को जल्दी से बदलते हैं। न केवल परीक्षण के मामले बदलते हैं, बल्कि 20 नकली वस्तुएं बदलती हैं। उन 20 मॉड्यूल को कई अलग-अलग टीमों द्वारा कई वर्षों में लिखा गया था। यह एक क्लासिक फिर से उपयोग समस्या है।
  • व्यक्ति और उनकी टीमें स्वचालित परीक्षणों के मूल्य को समझती हैं, उन्हें यह पसंद नहीं है कि दूसरी टीम कैसे कर रही है। :-)

मैं हमेशा के लिए जा सकता था, लेकिन मेरी बात यह है कि:

टेस्ट को बरकरार रखने की जरूरत है।


5

मैंने इस MSDN पत्रिका लेख में कुछ समय पहले इन सिद्धांतों को कवर किया था जो मुझे लगता है कि किसी भी डेवलपर के लिए पढ़ना महत्वपूर्ण है।

जिस तरह से मैं "अच्छा" इकाई परीक्षणों को परिभाषित करता हूं, अगर वे निम्नलिखित तीन गुणों को रखते हैं:

  • वे पठनीय हैं (नामकरण, मुखर, चर, लंबाई, जटिलता ..)
  • वे बनाए रखने योग्य हैं (कोई तर्क नहीं, निर्दिष्ट से अधिक नहीं, राज्य-आधारित, refactored ..)
  • वे भरोसेमंद हैं (सही चीज़ का परीक्षण करें, पृथक, एकीकरण परीक्षण नहीं ..)

रॉय, मैं तहे दिल से सहमत हूं। ये चीजें एज केस कवरेज से बहुत अधिक महत्वपूर्ण हैं।
मैट हिंज

विश्वास योग्य - उत्कृष्ट बिंदु!
रतनकोल

4
  • यूनिट परीक्षण सिर्फ आपकी यूनिट के बाहरी एपीआई का परीक्षण करता है, आपको आंतरिक व्यवहार का परीक्षण नहीं करना चाहिए।
  • TestCase के प्रत्येक परीक्षण को इस API के अंदर एक (और केवल एक) विधि का परीक्षण करना चाहिए।
    • विफलता के मामलों के लिए सशर्त परीक्षण मामलों को शामिल किया जाना चाहिए।
  • अपने परीक्षणों के कवरेज का परीक्षण करें: एक बार जब एक इकाई का परीक्षण किया जाता है, तो इस इकाई के अंदर की 100% लाइनों को निष्पादित किया जाना चाहिए था।

2

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

सधन्यवाद


1

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


1

मैं "A TRIP" का उत्तर देता हूं, सिवाय इसके कि परीक्षण एक-दूसरे पर भरोसा करते हैं !!!

क्यों?

DRY - खुद को दोहराएं - परीक्षण पर भी लागू होता है! टेस्ट निर्भरता 1) सेटअप समय बचाने में मदद कर सकती है, 2) स्थिरता संसाधनों को बचा सकती है, और 3) विफलताओं को इंगित करता है। बेशक, केवल यह देखते हुए कि आपका परीक्षण ढांचा प्रथम श्रेणी की निर्भरता का समर्थन करता है। अन्यथा, मैं मानता हूं, वे बुरे हैं।

Http://www.iam.unibe.ch/~scg/Research/JExample/ का अनुसरण करें


मैं आपसे सहमत हूं। TestNG एक और ढांचा है जिसमें निर्भरता आसानी से दी जाती है।
डेविस

0

अक्सर यूनिट परीक्षण मॉक ऑब्जेक्ट या मॉक डेटा पर आधारित होते हैं। मुझे तीन तरह के यूनिट टेस्ट लिखना पसंद है:

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

बिंदु यह है कि हर कार्य को जांचने में सक्षम होने के लिए सब कुछ फिर से करने से बचें ।

  • मैं तीसरी तरह बहुत बार चलाता हूं क्योंकि सभी नकली वस्तुएं / डेटा पहले से ही हैं।
  • जब भी मेरा मॉडल बदलता है मैं दूसरी तरह का रन बनाता हूं।
  • मैं एक समय में एक बार बहुत ही बुनियादी कार्यों की जांच करने के लिए पहले एक को चलाता हूं, ताकि बुनियादी रजिस्ट्रियों की जांच कर सकूं।

0

2 प्रकार के परीक्षण के बारे में सोचें और उन्हें अलग तरह से व्यवहार करें - कार्यात्मक परीक्षण और प्रदर्शन परीक्षण।

प्रत्येक के लिए अलग-अलग इनपुट और मेट्रिक्स का उपयोग करें। आपको प्रत्येक प्रकार के परीक्षण के लिए विभिन्न सॉफ्टवेयर का उपयोग करने की आवश्यकता हो सकती है।


फिर यूनिट परीक्षण के बारे में क्या?
स्पोइक

0

मैं रॉय ओशेरोव के यूनिट टेस्ट नामकरण मानकों द्वारा वर्णित एक सुसंगत परीक्षण नामकरण सम्मेलन का उपयोग करता हूं , किसी दिए गए टेस्ट केस क्लास में प्रत्येक विधि में निम्नलिखित नामकरण शैली MethodUnderTest_Scenario_ExpectedResult है।

    पहला परीक्षण नाम अनुभाग परीक्षण के तहत प्रणाली में विधि का नाम है।
    अगला विशिष्ट परिदृश्य है जिसका परीक्षण किया जा रहा है।
    अंत में उस परिदृश्य का परिणाम है।

प्रत्येक अनुभाग अपर कैमल केस का उपयोग करता है और इसे एक अंडर स्कोर द्वारा सीमांकित किया जाता है।

मुझे यह उपयोगी लगा जब मैंने परीक्षण को चलाया तो परीक्षण को परीक्षण के तहत विधि के नाम से वर्गीकृत किया गया। और एक सम्मेलन में अन्य डेवलपर्स को परीक्षण के इरादे को समझने की अनुमति मिलती है।

यदि मैं परीक्षण के तहत विधि अतिभारित कर दिया गया है, तो मैं विधि नाम के मापदंडों को भी जोड़ता हूं।

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