इकाई परीक्षण कक्षाएं जिनकी ऑनलाइन कार्यक्षमता होती है


23

जब इकाई परीक्षण के कार्य एक ऐसे कार्य के लिए होते हैं जिसमें निजी कार्य होते हैं जिनके लिए ऑनलाइन कार्यक्षमता की आवश्यकता होती है। कोई इसके परीक्षण के बारे में कैसे जानेगा?

उदाहरण के लिए:

public class Foo
{
    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        CloudService c = new CloudService();
        int oval = c.getValueFromService();
        return oval;
    }
}

अगर मैं फ़ंक्शन का परीक्षण कर रहा था: 'मेथडए ()' यह 'goOnlineToGetVal ()' का उपयोग करने का प्रयास करेगा जो बदले में ऑनलाइन जाने का प्रयास करेगा, अगर यह परीक्षण बिना कार्यक्षमता के किया गया था। मैं ऑनलाइन जाने के बिना लगभग 100% वर्ग कवरेज कैसे करूंगा?


क्या आपका तरीका सिर्फ क्लाउड एपि कहलाता है, या यह अतिरिक्त काम भी करता है?
विंस्टन एवर्ट


4
निर्भरता अन्तःक्षेपण ?
फडफंक

जवाबों:


76

new CloudService()

और आपकी समस्या है।

आधुनिक OO डिज़ाइन की सलाह है कि इस प्रकार की निर्भरता को सीधे निर्माण के बजाय पारित किया जाए । यह फ़ंक्शन में या निर्माण के समय कक्षा में पास किया जा सकता है। यदि यह उस प्रकार की जटिलता के कारण वारंट हो जाता है, तो इसे कंट्रोल कंटेनर के व्युत्क्रम द्वारा पकड़ा या एकत्र किया जा सकता है।

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


7
मुझे लगता है कि मैं यह समझने के लिए बहुत करीब हूं कि हेक डिपेंडेंसी इंजेक्शन क्या है।
20

जहाँ मेरे आवेदन की जरूरत है कि सभी उदाहरण बनाने के लिए सबसे अच्छी जगह है? संभव के रूप में मेरे आवेदन के शीर्ष के करीब? आप केवल अब तक निर्भरता इंजेक्शन लागू कर सकते हैं; कुछ बिंदु पर आपको उन्हें तर्क के रूप में पारित करने के बजाय स्वयं उदाहरण बनाने की आवश्यकता होगी।
पॉल

3
@Paul - यह निर्भर करता है। मेरे अनुभव में, आवेदन बहुत बार बाइनरी पेड़ों की तरह दिखते हैं - कुछ अधिक जटिल व्यवहार प्रदान करने के लिए एक वर्ग / फ़ंक्शन / मॉड्यूल glues दो। उन "ग्लू" वर्गों में से एक वह है जो कंक्रीट के कार्यान्वयन को निर्दिष्ट करता है, जो बदले में कुछ के ऊपर से कुछ का उपयोग करता है जो इसे कुछ और के साथ glues करता है, जो बदले में ... जब तक आप अंततः अपने एंट्रीपॉइंट पर नहीं पहुंचते हैं जो बड़े टुकड़ों को एक साथ जोड़ते हैं जुड़कर। "सबसे अच्छा" स्थान वह स्थान है जो आपके कोड को वह करने देता है जो उसे करने की आवश्यकता होती है, बिना ऐसा किए या उन चीजों के बारे में जानना चाहिए जो इसे नहीं करना चाहिए। यह अलग-अलग होगा।
तेलस्टिन

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

@ पाओल आईओसी कंटेनरों जैसे किसल विंडसर, स्ट्रक्चुरपेज़, निनजेक्ट और यूनिटी पर एक नज़र डालें। वे किसी भी तरह से निर्भरता इंजेक्शन करने का एकमात्र तरीका नहीं हैं, लेकिन वे वस्तु ग्राफ के निर्माण के बारे में सोचने के मामले में बहुत जानकारीपूर्ण हो सकते हैं, ऊपर से नीचे
बेन आरोनसन

37

मैं इसे इस तरह लागू करूंगा:

public class Foo
{
    private ICloudService cloudService;

    public Foo(ICloudService s)
    {
       cloudService=s;
    }

    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        int oval = cloudService.getValueFromService();
        return oval;
    }
}

इंटरफ़ेस ICloudServiceया तो परीक्षण के लिए एक नकली के साथ लागू किया जा सकता है, या "वास्तविक" बादलों के साथ। जब new CloudService()हर कॉल के लिए तात्कालिकता अनिवार्य है getValueFromService, या CloudServiceएक 3 पार्टी एपीआई से है जिसे बदला नहीं जा सकता है, एक आवरण लागू करें, जिसमें से प्राप्त करना ICloudServiceऔर उचित कॉल करना है।


1
यह निश्चित रूप से जाने का रास्ता है। क्लास लाइब्रेरी हैं जो आपको परीक्षण का पूर्ण नियंत्रण देने वाले इंटरफ़ेस का मजाक उड़ा सकती हैं।
ग्रेग बरगार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.