उन घटनाओं का अनुकरण कैसे करें जो परीक्षण के प्रयास / अपवादों को पकड़ते हैं?


14

मैं समझता हूं कि अपवाद कैसे काम करते हैं और उन्हें C # में कैसे पकड़ना और संभालना है लेकिन मैं उन घटनाओं का अनुकरण कैसे कर सकता हूं जो यह सुनिश्चित करने के लिए अपवाद का कारण बन सकती हैं कि यह सही ढंग से पकड़ी गई है? उदाहरण के लिए, क्या एप्लिकेशन को एक प्रकार के परीक्षण बिस्तर में चलाना संभव है, जहां नेटवर्क समस्याओं, डेटाबेस समस्याओं, आदि का अनुकरण करना संभव है? उनकी प्रकृति द्वारा अपवादों को पुन: पेश करना कठिन लगता है और यह सुनिश्चित करना कठिन होता है कि आपका कोड उनके साथ सामना कर सके।

हालाँकि मैं मुख्य रूप से C # /। NET / Visual Studio का उपयोग कर विकसित करता हूं, अन्य भाषाओं से संबंधित उत्तर या संसाधन उपयोगी हो सकते हैं।


: एक अन्य संभावित समाधान इस MSDN आलेख में वर्णित किया गया है TestApi साथ फॉल्ट इंजेक्शन परीक्षण
Giorgi

जवाबों:


13

1) यदि आप निर्भरता इंजेक्शन मॉडल का पालन करते हैं, तो आप मोक्स के साथ कुछ हिस्सों के वास्तविक कार्यान्वयन को प्रतिस्थापित कर सकते हैं जो अपवादों को फेंकते हैं जैसा कि आपको उनकी आवश्यकता है। हालाँकि आपको शुरू में अपने आवेदन को एक विशिष्ट तरीके से डिजाइन करना होगा या इसे पूरी तरह से पुन: प्रस्तुत करना होगा।

पसंद:

public class SqlUsersRepository : IUsersRepository
{
    public void RegisterNewUser (User newUser)
    {
        throw new SqlException ("Connection timeout");
    }
}

हालांकि हमारे पास यह समस्या होगी कि उपभोक्ता कोड को ठोस क्रियान्वयन अपवादों से निपटने की चिंता नहीं करनी चाहिए।

2) एक और तरीका यह है कि अपने कस्टम रैपर के साथ कुछ विधि कॉल को बदलें।

के बजाय:

FileStream fs = File.OpenRead (path);

तुम इस्तेमाल:

FileStream fs = File.OpenRead_Test (path);

एक कस्टम एक्सटेंशन विधि प्रदान करके (बस एक त्वरित विचार):

public static FileStream OpenRead_Test (this System.IO.File file, string path)
{
    throw new FileNotFoundException ();
}

3

आपको मॉकिंग फ्रेमवर्क को देखने की जरूरत है।

इनके साथ आप असली के बजाय नकली डेटाबेस (कहते हैं) को कॉल करने के लिए निर्भरता इंजेक्शन का उपयोग करते हैं। इसका मतलब है कि आपके पास प्रत्येक कॉल के लिए वापस जाने पर कुल नियंत्रण है।

आप तब एक परीक्षण सेट करते हैं जिसे जब बुलाया जाता है तो केवल वांछित अपवाद फेंकता है:

public void Test1()
{
    throw new NullArgumentException();
}

जब आपका कोड इसे सही तरीके से हैंडल करता है तो आपका टेस्ट पास हो जाता है।


3

मॉकिंग और इंजेक्शन केवल आपको अभी तक मिल सकते हैं और कुछ मामलों में दृष्टिकोण में बड़े बदलाव की आवश्यकता होती है।

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

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


सहमत - कुछ मामलों में, आप अपने रिलीज़ कोड में निर्भरता इंजेक्शन से ओवरहेड्स को बर्दाश्त नहीं कर सकते, उदाहरण के लिए। हर रोज़ मुद्दा नहीं, लेकिन ऐसा हो सकता है।
स्टीव 314
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.