2010-03-22 9 views
39

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

public void testSomething() throws Exception 

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

+1

यदि कोई अपवाद होता है तो जुनीट परीक्षण में विफल नहीं होता है? – brian

+0

@brian, स्पष्टीकरण के लिए, हाँ, जुनीट विफल रहता है अगर कोई अपवाद अपवाद होता है, लेकिन मेरा मतलब मेरे कोड द्वारा फेंकने वाले अपवादों को पकड़ने के संदर्भ में था। –

उत्तर

50

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

दूसरी ओर, यदि आप एक परीक्षण है कि एक अपवाद को गति प्रदान करना है, तो आप या तो JUnit 4 एनोटेशन के @Test(expected=IllegalArgumentException.class) विविधता या के अधिक सामान्य JUnit 3 मुहावरा उपयोग करना चाहते हैं लिख रहे हैं, तो:

try { 
    target.someMethodToTest(); 
    fail("Should have gotten an exception"); 
} catch (IllegalStateException ise) { 
    //expected, it's all good 
} 
+4

यह सबसे अच्छा जवाब है। मैं जोड़ूंगा कि मुझे लगता है कि यहां सवाल शैली में से एक है: पकड़ो और असफल हो या फेंक दें? आम तौर पर, सर्वोत्तम अभ्यास "अपवाद फेंकता" से बचाता है। इसका कारण यह है कि यह एपीआई उपयोगकर्ता के लिए अपवाद हैंडलिंग बनाता है। लेकिन यहां कोई ऐसा उपयोगकर्ता नहीं है। तो "अपवाद फेंकता है" सही अभ्यास है। –

3

मुख्य लाभ यह है जब आप कुछ

परिदृश्य है कि एक अपवाद उत्पन्न करने की आवश्यकता है (उदाहरण के लिए अं-r हैंडलिंग) आप JUnit4 में की तरह कुछ का उपयोग कर सकते परीक्षण कर रहे हैं शामिल है: @Test (उम्मीद = ArithmeticException.class), लेकिन कुछ लोगों को लगता है कि एक स्पष्ट प्रयास {} पकड़ (अपवाद ई) ब्लॉक की तुलना में पढ़ने/कम इरादा प्रकट करने के लिए कठिन होना चाहिए, और यदि आप राज्य की जांच करना चाहते हैं (कुछ नकली वस्तु के बारे में कहें, या यह देखने के लिए कि अपवाद को फेंक दिया गया था या नहीं सही स्थान, या लॉग, या जैसा)

3

यदि कोई अपवाद फेंक दिया गया है, और आप इसकी अपेक्षा नहीं कर रहे हैं, तो परीक्षण विफल होना चाहिए।

यदि यह एक अनचेक अपवाद है तो मैं अपवाद को फेंकने की अनुमति देता हूं और जुनीट परीक्षण में विफल रहता है।

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

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

+0

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

+0

एक @ अनुमानित एनोटेशन है जिसका उपयोग किया जाना चाहिए यदि "मुझे यह अपवाद देखना चाहिए।" – duffymo

10

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

+5

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

संबंधित मुद्दे