2015-06-03 10 views
9

टेस्टएनजी को यह जांचने की संभावना क्यों है कि कई अपवादों में से एक को फेंक दिया गया है? जहां तक ​​मुझे पता है, जुनीट केवल एक अपेक्षित अपवाद का समर्थन करता है। निम्नलिखित TestNG डमी उदाहरण हैं, जहां दोनों परीक्षणों पारित करेंगे पर विचार करें:टेस्टएनजी कई अपेक्षित अपवादों की अनुमति क्यों देता है?

@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class }) 
public void throwsNullPointer() { 
    throw new NullPointerException(); 
} 

@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class }) 
public void throwsIllegalArgument() { 
    throw new IllegalArgumentException(); 
} 

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

क्या यह शायद यादृच्छिक सुविधाओं के साथ कोड का परीक्षण करने के लिए समर्थन करता है जिसे मजाक नहीं किया जा सकता है? क्या किसी के पास कोई विचार है, और अधिमानतः वास्तविक जीवन परिदृश्य है?

उत्तर

4

टेस्टएनजी कई अपेक्षित अपवादों की अनुमति क्यों देता है?

मुझे लगता है कि सबसे संभावित कारण यह है कि लोगों ने सुविधा के लिए कहा ... और यह एक उचित बात है।

मैं कुछ उपयोग-मामलों के बारे में सोच सकता हूं।

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

  • एपीआई के कई कार्यान्वयन का परीक्षण करते समय इसकी आवश्यकता हो सकती है जो अलग-अलग अपवादों को अलग-अलग wrt व्यवहार कर सकती है। कार्यान्वयन एक ही कक्षा के विभिन्न वर्ग या विभिन्न संस्करण हो सकते हैं।

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

  • एपीआई के "ब्लैक बॉक्स" परीक्षण करते समय इसकी आवश्यकता हो सकती है जहां इंटरफ़ेस विनिर्देश अस्पष्ट है।


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

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

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

+0

ठीक है, कोड_ से _Diveive शायद मेरे द्वारा खराब रूप से तैयार किया गया था। बेशक, अनुबंध का परीक्षण करने के लिए परीक्षणों को कोड किया जाना चाहिए। मैंने शायद इसे ऐसा कहा है, क्योंकि ज्यादातर समय मैं अपने कोड के लिए यूनिट परीक्षण लिखता हूं। सभी निष्पक्ष और मान्य अंक, +1 और सबसे अधिक संभावना है कि मैं जल्द ही आपका उत्तर स्वीकार करूंगा। – Magnilex

4

कोड के लिए सक्षम होना असामान्य नहीं है जो कारण हैं जिनकी वजह यह एक catch बयान में ऐसे अपवादों संक्षिप्त करने के लिए संभव है में से एक है अपवाद के कई प्रकार, फेंक:

catch(IOException | InterruptedException ex) { 

इसलिए, यह मेरे लिए प्राकृतिक महसूस किया expectedExceptions कई अपवाद के लिए कोई अनुमति देने के लिए।

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

+0

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

+2

ठीक है, हाँ, मैंने टेस्टएनजी बनाया :-) आज, मैं केवल एक अपवाद की अनुमति दूंगा और उपयोगकर्ताओं को परीक्षण के लिए प्रति अपवाद एक टेस्ट विधि लिखने दूंगा। –

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