विफलता पर फेंकने वाले एक समारोह का परीक्षण करना

विफलता पर फेंकने वाले फ़ंक्शन का परीक्षण करने का सबसे अच्छा तरीका क्या है? या एक ऐसे फ़ंक्शन का परीक्षण करना जो विफलता के लिए काफी प्रतिरक्षा है?

उदाहरण के लिए; मेरे पास एक I / O प्राप्ति पोर्ट वर्ग है जो कन्स्ट्रक्टर में फेंकता है यदि यह पोर्ट को सही ढंग से प्रारंभ नहीं कर सकता है। यह आरंभकर्ता सूची में CreateIoCompletionPort के Win32 फ़ंक्शन का उपयोग करता है। यदि हैंडल सही ढंग से सेट नहीं है - एक गैर-शून्य मान - तो निर्माता एक अपवाद फेंक देगा। मैंने कभी यह फ़ंक्शन असफल नहीं देखा है।

मुझे पूरा यकीन है कि यह (और मेरे कोड में अन्य कार्यों जैसे) यदि वे असफल होते हैं तो वे सही तरीके से व्यवहार करेंगे, कोड 50 लाइन लंबी है जिसमें व्हाइट स्पेस भी शामिल है, इसलिए मेरे प्रश्न हैं

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

बी के लिए) मैंने CreateIoCompletionPort को ओवरराइड करने और मूल्यों को पार करने के बारे में सोचा था। यूनिट टेस्ट में इसे ओवरराइड करें और जब कोई निश्चित मान पास हो जाता है तो उसे 0 वापस लौटाया जाता है। हालांकि, इसका उपयोग कन्स्ट्रक्टर में किया जाता है, इसलिए इसे स्थिर होना चाहिए। क्या यह मान्य लगता है या नहीं?

0
ro fr bn

4 उत्तर

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

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

public class MyClass {
    public MyClass() throws MyClassException {
        // Whatever, including a call to invokeCreateIoCompletionPort
    }

    protected int invokeCreateIoCompletionPort(String str, int i) {
        return StaticClass.createIoCompletionPort(str, i);
    }
}

public class MyTest {
    public void myTest() {
        try {
            new MyClass();
            fail("MyClassException was not thrown!");
        } catch (MyClassException e) {
        }
    }

    private static class MyClassWrapper extends MyClass {
        @Override
        protected int invokeCreateIoCompletionPort(String str, int i) {
            throw new ExpectedException();
        }
    }
}

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

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

0
जोड़ा

यदि आप .NET में ऐसा कर रहे हैं, तो एक ExpectException विशेषता है जिसे आप अपने परीक्षण में जोड़ सकते हैं:

[Test, ExpectedException(typeof(SpecificException), "Exception's specific message")]
public void TestWhichHasException()
{
    CallMethodThatThrowsSpecificException();
}

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

0
जोड़ा

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

AFAIK निर्भरता को कम करने के लिए इकाई परीक्षण करते समय बाहरी संसाधनों का नकल करना एक आम प्रथा है।

0
जोड़ा

मेरे लिए सी ++ की तरह ध्वनि। Win32 फ़ंक्शंस को मजाक करने के लिए आपको एक सीम की आवश्यकता है। जैसे अपनी कक्षा में आप एक संरक्षित विधि CreateIoCompletionPort() बनायेंगे जो :: CreateIoCompletionPort() कहता है और आपके परीक्षण के लिए आप एक कक्षा बनाते हैं जो आपके द्वारा I / O प्राप्ति पोर्ट से प्राप्त होता है कक्षा और ओवरराइड <कोड> CreateIoCompletionPort() कुछ भी करने के लिए नहीं बल्कि NULL लौटाएं। आपकी उत्पादन कक्षा अभी भी व्यवहार कर रही है जैसे कि इसे डिज़ाइन किया गया था लेकिन अब आप CreateIoCompletionPort() फ़ंक्शन में विफलता अनुकरण करने में सक्षम हैं।

यह तकनीक माइकल फेदर्स पुस्तक "लीगेसी कोड के साथ प्रभावी ढंग से काम करना" से है।

0
जोड़ा
QAIndia
QAIndia
160 प्रतिभागियों की

QA India ! Unite Here we share job postings , prepare for interviews and share tips/techniques in QA. Please follow following guideline while sharing any job ... QA job # location : # title Company : Title : Requirement: Responsibility: Apply: