2010-03-03 10 views
11

अक्सर यह कहा जाता है कि इंटरफेस मॉकिंग और यूनिट परीक्षण को एक आसान प्रक्रिया बनाते हैं। इंटरफेस इस के साथ कैसे मदद करते हैं?इंटरफेस यूनिट परीक्षण और मॉकिंग को आसान कैसे बनाते हैं?

+0

गतिशील मोक्स के इस स्पष्टीकरण को देखें: http://stackoverflow.com/questions/1972831/to-mock-an-object-does-it-have-to-be-either-implementing-an-interface-or- चिह्नित/1973482 # 1973482 –

उत्तर

4

इंटरफेस की प्रकृति कई कार्यान्वयन प्रदान करती है, इस प्रकार का मज़ाक उड़ाती है।

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

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

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

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

इंटरफेस मदद नहीं करेगा अगर आपके ऑब्जेक्ट मॉडल जटिल और अव्यवस्थित है (जैसे कि आपका इंटरफ़ेस अन्य प्रकार/इंटरफेस पर काफी निर्भर करता); तो यह सब कार्यान्वित/मजाक करना दर्द है

2

यदि आप ठोस कार्यान्वयन के लिए बाध्य नहीं हैं, तो आप एक इंटरफ़ेस के पीछे व्यवहार स्विच कर सकते हैं।

यदि आपके वर्ग इंटरफेस को लागू करते हैं, तो व्यवहारों का मज़ाक उड़ाया जा सकता है।

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

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

3

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

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

3

आप एक वर्ग है, तो आप

  • इन्सेन कंस्ट्रक्टर्स तरह निर्भरता के बहुत सारे हो सकता है (तर्क के बहुत सारे है, या यह कुछ अन्य वर्ग जो एक तृतीय श्रेणी के जो चौथी कक्षा जो करने की जरूरत की जरूरत की जरूरत की जरूरत है एक वैध डेटाबेस कनेक्शन)

  • किसी भी तरह से वर्ग का उपयोग करने के लिए, आप इसे सही ढंग से प्रारंभ करना चाहिए (उदाहरण के लिए, आप इसे कुछ अन्य वस्तुओं है कि वैध होना चाहिए, गुजरना होगा भी)

  • वर्ग एक है राज्य। यह राज्य कुछ कारणों से परीक्षण के दौरान बदल सकता है।

  • वर्ग है या स्थिर क्षेत्रों

ये निर्भरता आमतौर पर अपने परीक्षण के कई दौरान अप्रासंगिक हैं का उपयोग करें और अगर आप उन्हें से निपटने के लिए नहीं चाहते हैं हो सकता है।

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

तो उदाहरण के लिए, यदि आपकी कक्षा को डेटाबेस से रिकॉर्ड पढ़ने की आवश्यकता है, तो आप इसके बजाय ResultSet का नकल कर सकते हैं जो पंक्तियों को वापस लौटाता है। इसलिए आपके पास वास्तविक डेटाबेस नहीं है, आपको कनेक्शन बनाने की आवश्यकता नहीं है (जो धीमा है और कई कारणों से विफल हो सकता है), आपको डेटाबेस में डेटा की परवाह नहीं है (इसलिए आप डॉन करते हैं टेबल को हटाने/ड्रॉप करने और परीक्षण डेटा के साथ उन्हें फिर से भरना नहीं है), आदि

0

जब पोर्ट को पार करने वाले व्यवहार का परीक्षण करते हैं, तो एडाप्टर के लिए इंटरफेस रखने से परीक्षण के दौरान एक अलग कार्यान्वयन को इंजेक्ट करने में मदद मिलती है (यानी test double)।

उदाहरण के लिए, एक डीएओ जो डेटाबेस या वेब सेवा को कॉल करता है उसे एक कार्यान्वयन द्वारा प्रतिस्थापित किया जा सकता है जो स्टब किए गए डेटा को लौटाता है।

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