2009-09-03 15 views
28

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

उन सेटअप विधियों में, मुझे दावाों का उपयोग करना पसंद है: मुझे पता है कि मैं उन ऑब्जेक्ट्स में कौन से मूल्य देखना चाहता हूं, और मैं उस ज्ञान को एक दावे के माध्यम से दस्तावेज करना चाहता हूं।

stackoverflow पर यहाँ unit tests calling other unit tests पर हाल ही में पोस्ट में, सामान्य लग रहा है कि इकाई परीक्षण करना चाहिए नहीं कॉल अन्य परीक्षण हो रहा है:, उस प्रश्न का उत्तर है कि आप अपने सेटअप refactor चाहिए लगता है तो कि परीक्षण के मामले एक-दूसरे पर निर्भर नहीं हैं।

लेकिन "सेटअप-ए-आर्टर्ट्स" और यूनिट परीक्षण में अन्य यूनिट परीक्षणों को कॉल करने में बहुत अंतर नहीं है।

इसलिए मेरा प्रश्न: क्या सेटअप विधियों में दावा करने का अच्छा अभ्यास है?

संपादित करें:

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

+1

अच्छा यूनिट परीक्षण लिखने पर इस आलेख को पढ़ें: http://blog.codeville.net/2009/08/24/writing-great-unit-tests-best-and-worst-practises/ – Kane

+0

स्मार्ट प्रश्न के लिए +1 – KLE

उत्तर

14

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

मैंने देखा है कई फायदे:

  • सेटअप कम रहता है और ध्यान केंद्रित, पठनीयता के लिए।
  • दावे जो अधिक कुशल है केवल एक बार चलाए जा रहे हैं,।

उपयोग और चर्चा:

उदाहरण के लिए, मैं विधि testSetup नाम()।

इसका उपयोग करने के लिए, जब मुझे उस कक्षा में कुछ परीक्षण त्रुटियां हैं, तो मुझे पता है कि अगर testSetup() में कोई त्रुटि है, तो मुझे अन्य त्रुटियों से परेशान करने की आवश्यकता नहीं है, मुझे इसे पहले ठीक करने की आवश्यकता है।

कोई इस से परेशान है, और इस निर्भरता स्पष्ट बनाना चाहता है, तो testSetup() विधि सेटअप() में कहा जा सकता है। लेकिन मुझे नहीं लगता कि यह मायने रखता है।

  1. कुछ परीक्षण है कि स्थानीय कोड का परीक्षण,
  2. और कुछ परीक्षण है कि कॉल अधिक वैश्विक कोड है, जो परोक्ष रूप से कॉल: मेरा मुद्दा यह है कि, JUnit में, आप पहले से ही कुछ अपने परीक्षण के बाकी हिस्सों में समान हो सकती है पिछले परीक्षण के समान कोड।

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

+2

आज सुबह मैंने एक सहयोगी के साथ सवाल पर चर्चा की, और हम इस समाधान के साथ भी आए। यह सुनकर अच्छा लगा कि आपके पास सकारात्मक अनुभव है! – avandeursen

+0

@Kaka आपकी उत्सुक टिप्पणी के लिए धन्यवाद, और मजबूती के लिए आपकी प्रतिक्रिया प्रदान करता है। :-) – KLE

+0

@ केएलई: यह एक दिलचस्प और एक कुशल रणनीति है। लेकिन मुझे आश्चर्य है कि आप यह सुनिश्चित करते हैं कि जब आप फ़िल्टर के साथ परीक्षण निष्पादित करते हैं तो 'testSetup() 'निष्पादित किया जाता है (यानी' --gtest_filter')। – Sampath

9

वे अलग-अलग परिदृश्य हैं; मुझे समानता दिखाई नहीं दे रही है।

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

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

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

9

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

इस सवाल में एक बड़ा मुद्दा नहीं है: कि एक और परीक्षण कॉल के लिए एक परीक्षण, यह आपके परीक्षण में कुछ समस्या के लिए एक गंध है। प्रत्येक परीक्षण को आपके कोड के एक विशिष्ट पहलू का परीक्षण करना चाहिए और इसमें केवल एक या दो दावे होना चाहिए, इसलिए यदि आपका परीक्षण किसी अन्य परीक्षण को कॉल करता है तो आप उस परीक्षण में बहुत सी चीजों का परीक्षण कर सकते हैं। अधिक जानकारी के लिए पढ़ें: Unit Testing: One Test, One Assertion - Why It Works

+0

एक परीक्षण/एक दावे के लिए दिलचस्प सूचक, और मुझे आपके एक या दो में पुनः रिकॉर्ड करना पसंद है। – avandeursen

+1

यूआरएल टूट गया है। यहां एक अद्यतन एक है। [यूनिट परीक्षण: एक टेस्ट, एक दावा - यह क्यों काम करता है] (http://blog.astrumfutura.com/2009/02/unit-testing-one-test-one-assertion-why-it-works/) – James

3

अपने दिल/ब्लिंक निर्णयों का पालन करें। एक सेटअप विधि के भीतर आवेषण इरादा दस्तावेज कर सकते हैं; प्रत्यारोपण पठनीयता।तो व्यक्तिगत रूप से मैं आपको इस पर वापस ले जाऊंगा। जो बुरा है -
यह एक परीक्षण अन्य परीक्षण बुला से अलग है। कोई परीक्षण अलगाव नहीं। एक परीक्षण किसी अन्य परीक्षण के परिणाम को प्रभावित नहीं करना चाहिए।

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

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

+0

अच्छा अंक - धन्यवाद। इसका मतलब है कि दो अलग-अलग उद्देश्यों के लिए जुनीट आवेषण का उपयोग करना: (1) दस्तावेज़ का इरादा; (2) जांचें कि परिणाम अपेक्षित हैं। – avandeursen

3

मैं जावा का दावा है, बल्कि JUnit की तुलना में, ऐसे मामलों में जहां कुछ इस तरह के लिए आवश्यक है में इस्तेमाल करते हैं। जैसे जब आप परीक्षण डाटा .:

byte[] pkt = pktFactory.makePacket(TIME, 12, "23, F2"); 
assert pkt.length == 15; 

असफल निहितार्थ 'प्रणाली भी इस परीक्षण चलाने के लिए कोशिश करने के लिए एक राज्य में नहीं है' है स्थापित करने के लिए कुछ अन्य उपयोगिता वर्ग का उपयोग करें।

+0

मुझे यह विचार पसंद है। यह सामान्य सवाल उठाता है कि जावा आवेषण और जुनीट आर्टर्ट विधियों को मिश्रित करना अच्छा अभ्यास है, लेकिन मुझे आपकी तर्क पसंद है। – avandeursen