2009-07-14 18 views
21

मेरी सी परीक्षण इकाई के लिए सक्षम होने के लिए ++ कोड मैं आमतौर पर परीक्षण एक या कई वस्तुओं है कि या तो "उत्पादन कोड" या नकली/नकली वस्तुओं (चलो कॉल किया जा सकता है के तहत वर्ग के निर्माता को पारित करने के लिए इन इंजेक्शन ऑब्जेक्ट्स)। मैंने इसेइंटरफेस बनाम टेम्पलेट्स सी में निर्भरता इंजेक्शन ++

  1. एक इंटरफ़ेस बनाना है जो "उत्पादन कोड" वर्ग और नकली/नकली वर्ग दोनों विरासत में है।
  2. परीक्षण के अंतर्गत कक्षा एक टेम्पलेट वर्ग है कि टेम्पलेट पैरामीटर के रूप में इंजेक्शन वस्तुओं के प्रकार के निर्माता के लिए पैरामीटर के रूप में इंजेक्शन वस्तुओं के उदाहरण लेता है, और बनाना।

कुछ यादृच्छिक विचार:

  • जब तक हम अवधारणाओं (C++ 0x) है, केवल दस्तावेज और पैरामीटर नामकरण संकेत जाएगा कि (जब टेम्पलेट का उपयोग कर) परीक्षण के अंतर्गत वर्ग प्रदान करने के लिए।
  • यह हमेशा नहीं विरासत कोड के लिए इंटरफेस बनाने के लिए संभव है
  • इंटरफ़ेस मूल रूप से केवल निर्भरता इंजेक्शन
  • करने के लिए उसी तरह सक्षम होने के लिए बनाई गई है: templating परीक्षण के अंतर्गत वर्ग केवल निर्भरता इंजेक्शन सक्षम करने के लिए किया जाता है

आपके क्या विचार हैं? क्या इस समस्या के अन्य समाधान हैं?

उत्तर

4

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

+0

यह इतना आसान है, फिर भी वास्तव में शक्तिशाली है। मुझें यह पसंद है! –

+4

बस रिकार्ड के लिए, लोगों को बनाने के तरीकों आभासी (गैर आभासी इंटरफेस (NVI) मुहावरा देखें) –

+1

हाँ, कभी कभी इस दृष्टिकोण "puristic NVI" के साथ संघर्ष में आ सकता है के साथ मुद्दों देखते हैं कि बारे में पता होना चाहिए। कई मामलों में आप सिर्फ संरक्षित आभासी कार्यों मजाक के साथ भाग प्राप्त कर सकते हैं, लेकिन मुझे लगता है कि यह यह सार्वजनिक-आभासी बनाने के लिए और अभी भी NVI का उपयोग बहुत ज्यादा चोट नहीं पड़ता कि आप सार्वजनिक गैर आभासी इंटरफेस नकली करने की आवश्यकता है। एक इस मामले में सबसे अच्छा अभ्यास के कुछ संकलक प्रवर्तन खो करता है, लेकिन नहीं सबसे अच्छा अभ्यास ही। –

8

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

+1

सिद्धांत रूप में हाँ। लेकिन मुझे नहीं लगता कि यह अभ्यास में अच्छा होगा। जैसे जिस वर्ग में आप एक परीक्षण में नकल करना चाहते हैं, वह संभवतः किसी अन्य परीक्षण में परीक्षण किया जाएगा। तो फिर तुम हर टेस्ट स्वीट या ऐसा ही कुछ के लिए एक अलग परियोजना (वी.एस. परियोजना उदा) बनाने की आवश्यकता ... –

+1

सुंदर ज्यादा हाँ। मैं तो बस (जैसे इंटरफेस और डि हर जगह भी जब वे कोई वास्तविक बिंदु है के रूप में) महत्वपूर्ण कोड में परिवर्तन की दिशा में बहुत मजबूत घृणा केवल परीक्षण चौखटे को समायोजित करने के लिए है।किसी भी मामले में, मैं आपको बता सकता है कि इस योजना के व्यवहार में काम करता है (मैं इसे सफलतापूर्वक देखा है उत्पादन में इस्तेमाल), भले ही इसे और अधिक बॉयलरप्लेट की आवश्यकता होती है - लेकिन कम से कम यह कोड अपने आप में नहीं है! –

+0

मैं सहमत हूं। मुझे कुछ जांच करनी होगी कि हमारे लिए इसके क्या परिणाम होंगे। शायद इसे आसान बनाने के लिए वीएस परियोजनाओं पर कुछ जादू लागू किया जा सकता है। –

3

टेम्पलेट्स क्रम के लिए थोड़ा कम प्रदर्शन दंड (कम indirections, कम कॉल, अधिक इनलाइन अनुकूलन) होगा, लेकिन आप संकलन समय के लिए एक बहुत ही उच्च दंड भुगतना कर देगा ...

मुझे लगता है कि इस उद्देश्य के लिए , इंटरफेस बेहतर हैं (जब तक हम C++ 0x TR1 में अवधारणाओं है) ... जब तक कि अगर आप कुछ "टोंटी कोड" को धीमा नहीं कर सकते हैं। इंटरफेस रन-टाइम पर अधिक गतिशील और स्विच करने योग्य हैं।

याद रखें कि आप अपनी कक्षा को डिफ़ॉल्ट इंजेक्शन ऑब्जेक्ट्स (असली वाले) के साथ बना सकते हैं, लेकिन आपके पास कारखानियां हो सकती हैं जो आपके परीक्षणों पर नकली इंजेक्ट करती हैं ... आपको उप-वर्ग की आवश्यकता भी नहीं होती है।

+1

आप पिछले पैराग्राफ पर विस्तृत सकता है? नकली वस्तुओं को इंजेक्ट करने के लिए आप कारखानों का उपयोग कैसे करेंगे? –

+0

http://msdn.microsoft.com/en-us/magazine/cc163739.aspx –

+1

एक संक्षेप में: आप एक सिंगलटन कारखाना है कि आपके सभी आंतरिक आवश्यक वस्तुओं बनाता है हो सकता है, और आप एक साथ इस कारखाने की जगह ले सकता है कि नकली बनाता है आपके परीक्षण में वस्तुओं –

2

अगर यह मदद करता है जानते हैं, लेकिन आप टेम्पलेट कंस्ट्रक्टर्स हो सकता है:

struct Class_Under_Test 
{ 
    template <typename Injected> 
    Class_Under_Test() 
    { 
     ... 

    // and even specialize them 
    template <> 
    Class_Under_Test <A_Specific_Injection_Class> 
    { 
     ... 

केवल एक है कि वास्तव में प्रयोग किया जाता है शामिल हो जाएगा।

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