2010-09-09 11 views
13

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

इस विषय पर इससे संबंधित एक ब्लॉग पोस्ट: http://konigsberg.blogspot.com/2007/11/testng-and-expectedexceptions-ive.html

उत्तर

21

@Test(expectedExceptions) सबसे आम मामलों के लिए उपयोगी है:

  • आप उम्मीद एक विशिष्ट अपवाद उत्पन्न किए जाने की
  • आपको लगता है कि अपवाद के संदेश की जरूरत विशिष्ट शब्दों

प्रलेखन प्रति शामिल करने के लिए यदि कोई expectedException फेंक दिया गया है तो एक परीक्षण विफल हो जाएगा:

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

यहां कुछ परिदृश्य हैं जहां @Test(expectedExceptions) पर्याप्त नहीं है:

  • आपका परीक्षा पद्धति कई बयान है और उनमें से केवल एक
  • फेंकने के लिए आप अपवाद का अपना स्वयं का प्रकार फेंक रहे हैं और उम्मीद है आप आप सिर्फ पारंपरिक (पूर्व TestNG) पैटर्न पर वापस लौटने चाहिए यकीन है कि यह एक निश्चित कसौटी

से मेल खाता है ऐसे मामलों में बनाने की जरूरत है,:

try { 
    // your statement expected to throw 
    fail(); 
} 
catch(<the expected exception>) { 
    // pass 
} 
0

आप ट्राई/असफल/कैच पैटर्न ब्लॉग पोस्ट से लिंक में वर्णित का प्रयोग क्यों नहीं करते?

+0

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

+0

टेस्टएनजी ब्रैग ऐसा करने के बारे में नहीं है। – djechlin

1

मुझे नियोजित परीक्षण तकनीकों की प्रकृति पर आलेख से असहमत होना है। समाधान एक गेट को नियोजित करता है, यह सत्यापित करने के लिए कि परीक्षण सफल होना चाहिए या मध्यवर्ती चरण में विफल होना चाहिए।

मेरी राय में, Guard Assertions को विशेष रूप से ऐसे परीक्षणों के लिए नियोजित करना बेहतर है (मानते हैं कि परीक्षण लंबे समय तक चलने वाला और जटिल नहीं है, जो स्वयं में एक विरोधी पैटर्न है)। गार्ड-दावे का उपयोग करने से आप निम्न तरीकों से एसयूटी को डिज़ाइन करने के लिए मजबूर कर सकते हैं:

  • इस तरीके को निष्पादन या उत्तीर्ण होने के परिणामस्वरूप पर्याप्त जानकारी प्रदान करने के लिए विधि को डिज़ाइन करें। कभी-कभी, ऐसा नहीं किया जा सकता क्योंकि डिजाइनर के इरादे से परिणाम नहीं लौटाया जाता है, और इसके बजाय अपवाद फेंक दिया जाता है (इसे दूसरे मामले में संभाला जा सकता है)।
  • एसयूटी डिज़ाइन करें ताकि प्रत्येक महत्वपूर्ण विधि आमंत्रण के बाद state can be verified हो।

लेकिन इससे पहले कि हम ऊपर संभावनाओं पर विचार निम्नलिखित स्निपेट पर एक नज़र फिर से है:

plane.bookAllSeats(); 
plane.bookPlane(createValidItinerary(), null); 

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

+1

क्रिस्टोफर से जुड़े आलेख को देखें। वह लेख बताता है कि इसमें क्या गलत है। असल में यह है कि आप नहीं जानते कि अपेक्षित अपवाद कहाँ फेंक दिया गया था। –

+0

@ थॉमस, धन्यवाद। मुझे यह देखने के लिए एक बार फिर से पढ़ना पड़ा। –

+0

मैं अभी भी इकाई परीक्षण के लिए काफी नया हूं, इसलिए मैं गार्ड के दावों की अवधारणा से अनजान था। लिंक के लिए धन्यवाद! –

0

catch-exception शायद अपेक्षित अपवादों के परीक्षण के लिए आपको जो कुछ भी चाहिए, प्रदान करता है।

2
@Test(expectedExceptions = AnyClassThatExtendsException.class, expectedExceptionsMessageRegExp = "Exception message regexp") 

या यदि आप अपवाद संदेश के लिए जाँच करने के लिए नहीं करना चाहते, केवल नीचे पर्याप्त

@Test(expectedExceptions = AnyClassThatExtendsException.class) 

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

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