2011-07-15 15 views
6

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

+0

क्षमा करें, बस स्पष्टीकरण के लिए - आपके पास ऑब्जेक्ट ए के तहत परीक्षण है, और ऑब्जेक्ट ए ऑब्जेक्ट बी पर निर्भर करता है ताकि आप ऑब्जेक्ट बी का आंशिक नकली बनाना चाहते हैं? –

+0

नहीं, ऑब्जेक्ट ए का आंशिक नकली बनाना ए –

+0

आपको [Powermock] (http://code.google.com/p/powermock/) की आवश्यकता है। इसके साथ आप स्थैतिक तरीकों, निजी विधियों, रचनाकारों का नकल कर सकते हैं, आप वास्तव में कोई जादू कर सकते हैं क्योंकि यह कक्षाओं के बाइटकोड को बदल देता है। यह वही है जो आपको चाहिए। – edutesoy

उत्तर

1

निकालें और ओवरराइड तकनीक रॉय Osherove के यूनिट टेस्टिंग की कला के अध्याय 3 में वर्णित परीक्षण के अंतर्गत वर्ग की नकली हिस्सा करने के लिए एक तरीका हो प्रतीत होता है (पीपी। 71-77)। ओशरोव इस प्रश्न के कुछ अन्य उत्तरों में उठाई गई चिंताओं को संबोधित नहीं करता है।

इसके अलावा, माइकल फेदर्स में इस पर चर्चा करता है विरासत संहिता के साथ प्रभावी ढंग से कार्य करना। वह परिणामी वर्ग को परीक्षण उपclass (227) और तकनीक उपclass और ओवरराइड विधि (401) का संदर्भ देता है। अब, दिया गया है, पंख नए कोड पर अनुशंसित प्राचीन तकनीकों का प्रदर्शन नहीं कर रहे हैं। लेकिन वह अभी भी एक संभावित सहायक तकनीक के रूप में गंभीर उपचार देता है।

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

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

+0

[ओशरोव का अध्याय 3 ऑनलाइन है] (http://www.manning.com/osherove/SampleChapter3.pdf) (पीडीएफ) –

3

ऑब्जेक्ट्स जो आप करना चाहते हैं, वे बहुत सी चीजों को करने की कोशिश कर रहे हैं। विशेष रूप से, यदि आपके पास बाहरी निर्भरता है, तो आप आम तौर पर उस निर्भरता को अलग करने के लिए एक वस्तु बनाते हैं। Façade पैटर्न इसका एक उदाहरण है। अगर आपकी वस्तुओं को दिमाग में टेस्टेबिलिटी के साथ डिजाइन नहीं किया गया था तो आपको कुछ रिफैक्टरिंग करना पड़ सकता है। Michael Feathers' PDF on working with legacy code (पीडीएफ) पर एक नज़र डालें। उनके पास एक ही शीर्षक से एक पुस्तक है जो अधिक विस्तार से जाती है।

+0

+1 - यह एक अच्छी किताब है! – TrueWill

0

इस तरह की चीजों को सुविधाजनक बनाने के लिए कुछ वाकई अच्छे पैकेज हैं। उदाहरण के लिए, Mockito docs से:

//You can mock concrete classes, not only interfaces 
LinkedList mockedList = mock(LinkedList.class); 

//stubbing 
when(mockedList.get(0)).thenReturn("first"); 

कुछ असली जादू है कि पहली बार में विश्वास करने के लिए मुश्किल है नहीं करता है। जब आप

String firstMember = mockedList.get(0); 

आपको "कब" कथन में जो कहा गया है, उसके कारण आप "पहले" वापस आ जाएंगे।

1

यदि आप जिस विधि को नकली बनाना चाहते हैं वह आभासी है (जैसा कि स्थिर नहीं है और अंतिम नहीं है), तो आप अपने ऑब्जेक्ट को अपने परीक्षण में उपclass कर सकते हैं, सबक्लास में विधि को ओवरराइड कर सकते हैं, और परीक्षण में उप-वर्ग का प्रयोग कर सकते हैं। कोई नकली वस्तु पुस्तकालयों की आवश्यकता नहीं है।

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

2

यह एक एक दूसरे के परीक्षण के लिए कक्षा के नकली/नकली हिस्से के लिए बहुत बुरा विचार है।

ऐसा करने से, आप परीक्षण नहीं कर रहे हैं कि परीक्षण के तहत स्थितियों में असली कोड अविश्वसनीय परीक्षण परिणामों की ओर अग्रसर करता है।

यह कक्षा के भाग्यशाली हिस्से के रखरखाव बोझ को भी बढ़ाता है। यदि यह पूरे परीक्षण कार्यक्रम के लिए प्रभावी है, तो नकली कार्यान्वयन भी नकली विधि पर अन्य परीक्षणों को कठिन बनाता है।

आपको खुद से पूछना होगा कि आपको परीक्षण के तहत भाग को नकली करने की आवश्यकता क्यों है।

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

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

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

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

आप विशेष किनारे के मामलों का परीक्षण करने के लिए कार्यान्वयन विवरण के ज्ञान का उपयोग कर सकते हैं, लेकिन मुख्य एपीआई के माध्यम से उनको ट्रिगर कर सकते हैं, कार्यान्वयन विस्तार को नहीं बढ़ाकर।

उदाहरण के लिए, मान लीजिए कि आपने std :: vector :: को() पर फिक्र किया है लेकिन कार्यान्वयन ऑपरेटर [] के बजाय स्विच किया गया है। आपका परीक्षण टूट जाएगा या चुपचाप पास होगा।

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