दो मुद्दों पर हमें यहाँ देखना है।
पहला यह है कि आप इकाई परीक्षण के नजरिए से अपने सभी परीक्षणों को देख रहे हैं। यूनिट परीक्षण अत्यंत मूल्यवान हैं, लेकिन केवल प्रकार के परीक्षण नहीं हैं। टेस्ट को वास्तव में कई अलग-अलग परतों में विभाजित किया जा सकता है, बहुत तेज इकाई परीक्षणों से लेकर कम तेजी से एकीकरण परीक्षणों तक भी धीमी स्वीकृति परीक्षणों के लिए । ( कार्यात्मक परीक्षणों की तरह और भी अधिक परतें टूट सकती हैं ।)
दूसरा यह है कि आप अपने व्यावसायिक तर्क के साथ थर्ड-पार्टी कोड में कॉल मिला रहे हैं, परीक्षण चुनौतियां पैदा कर रहे हैं और संभवतः आपके कोड को अधिक भंगुर बना रहे हैं।
यूनिट परीक्षण तेज होना चाहिए और अक्सर चलाया जाना चाहिए। मॉकिंग निर्भरताएं इन परीक्षणों को तेजी से चालू रखने में मदद करती हैं, लेकिन अगर निर्भरता में बदलाव होता है और मॉक नहीं होता है तो संभवतः कवरेज में छेद कर सकते हैं। आपका कोड तब भी तोड़ा जा सकता है जब आपके परीक्षण अभी भी हरे चल रहे हों। यदि कुछ निर्भरता का इंटरफ़ेस बदलता है, तो कुछ मॉकिंग लाइब्रेरी आपको सतर्क कर देगी।
दूसरी ओर, एकीकरण परीक्षण, तीसरे पक्ष के पुस्तकालयों सहित घटकों के बीच बातचीत का परीक्षण करने के लिए डिज़ाइन किए गए हैं। परीक्षण के इस स्तर पर मोक्स का उपयोग नहीं किया जाना चाहिए क्योंकि हम यह देखना चाहते हैं कि वास्तविक वस्तु एक साथ कैसे बातचीत करते हैं। क्योंकि हम वास्तविक वस्तुओं का उपयोग कर रहे हैं, ये परीक्षण धीमे होंगे, और हम उन्हें लगभग उतनी बार नहीं चलाएंगे, जितनी अक्सर हमारी इकाई परीक्षण करते हैं।
स्वीकृति परीक्षण एक और भी उच्च स्तर पर देखते हैं, परीक्षण करते हैं कि सॉफ्टवेयर की आवश्यकताएं पूरी होती हैं। ये परीक्षण संपूर्ण, पूर्ण प्रणाली के खिलाफ चलते हैं जो कि तैनात हो जाते हैं। एक बार फिर, किसी भी मजाक का इस्तेमाल नहीं किया जाना चाहिए।
एक दिशानिर्देश लोगों ने नकली के बारे में मूल्यवान पाया है कि आप स्वयं के प्रकारों का मजाक न करें । अमेज़न S3 के लिए एपीआई का मालिक है, इसलिए वे यह सुनिश्चित कर सकते हैं कि यह उनके नीचे नहीं बदलता है। दूसरी ओर, आपके पास ये आश्वासन नहीं हैं। इसलिए, यदि आप अपने परीक्षणों में एस 3 एपीआई का मजाक उड़ाते हैं, तो यह आपके कोड को बदल सकता है और तोड़ सकता है, जबकि आपके परीक्षण सभी को हरा दिखाते हैं। तो हम तीसरे पक्ष के पुस्तकालयों का उपयोग करने वाले कोड का परीक्षण कैसे करते हैं?
खैर, हम नहीं करते। यदि हम दिशानिर्देश का पालन करते हैं, तो हम उन वस्तुओं का मजाक नहीं उड़ा सकते, जिनके हम मालिक नहीं हैं। लेकिन ... यदि हम अपनी प्रत्यक्ष निर्भरता के मालिक हैं, तो हम उनका मजाक उड़ा सकते हैं। पर कैसे? हम S3 API के लिए अपना स्वयं का रैपर बनाते हैं। हम इसे S3 API की तरह बना सकते हैं, या हम इसे अपनी आवश्यकताओं को और अधिक बारीकी से (पसंदीदा) फिट कर सकते हैं। हम इसे थोड़ा और सार भी बना सकते हैं, एक के PersistenceService
बजाय कहें AmazonS3Bucket
। PersistenceService
विधियों के साथ एक इंटरफ़ेस होगा #save(Thing)
और #fetch(ThingId)
, हमारे द्वारा देखे जा सकने वाले तरीकों के प्रकार (ये उदाहरण हैं, आप वास्तव में विभिन्न तरीकों को चाहते हैं)। अब हम अपने कॉलिंग कोड से PersistenceService
S3 API (कहते हैं S3PersistenceService
) के आसपास इसे लागू कर सकते हैं ।
अब उस कोड को जो S3 API को कॉल करता है। हमें उन कॉल को किसी PersistenceService
ऑब्जेक्ट से बदलने की आवश्यकता है । हम ऑब्जेक्ट में हमारे पास करने के लिए निर्भरता इंजेक्शन का उपयोग PersistenceService
करते हैं। यह महत्वपूर्ण है कि एक के लिए नहीं पूछें S3PersistenceService
, लेकिन एक के लिए पूछने के लिए PersistenceService
। यह हमारे परीक्षणों के दौरान कार्यान्वयन को स्वैप करने की अनुमति देता है।
सभी कोड जो एस 3 एपीआई का उपयोग करते थे PersistenceService
, अब सीधे हमारा उपयोग करते हैं , और हमारा S3PersistenceService
अब एस 3 एपीआई के लिए सभी कॉल करता है। हमारे परीक्षणों में, हम इसका मजाक उड़ा सकते हैं PersistenceService
, क्योंकि हम इसके मालिक हैं, और यह सुनिश्चित करने के लिए कि हमारा कोड सही कॉल करता है, मॉक का उपयोग करें। लेकिन अब वह परीक्षण करना छोड़ देता है S3PersistenceService
। इसमें पहले जैसी ही समस्या है: हम बाहरी सेवा पर कॉल किए बिना इसे टेस्ट नहीं कर सकते। इसलिए ... हम इसे परीक्षण नहीं करते हैं। हम S3 एपीआई निर्भरता का मजाक उड़ा सकते हैं , लेकिन इससे हमें कोई अतिरिक्त विश्वास नहीं होगा। इसके बजाय, हमें इसे उच्च स्तर पर परीक्षण करना होगा: एकीकरण परीक्षण।
यह कहने में थोड़ी परेशानी हो सकती है कि हमें अपने कोड के एक भाग का परीक्षण नहीं करना चाहिए, लेकिन आइए देखें कि हमने क्या पूरा किया। हमारे पास सभी जगह कोड का एक गुच्छा था जिसे हम इकाई परीक्षण नहीं कर सकते थे कि अब इकाई के माध्यम से परीक्षण किया जा सकता है PersistenceService
। हमारे पास हमारी तृतीय-पक्ष लाइब्रेरी की गड़बड़ी एकल कार्यान्वयन वर्ग तक ही सीमित है। उस वर्ग को एपीआई का उपयोग करने के लिए आवश्यक कार्यक्षमता प्रदान करनी चाहिए, लेकिन उसके पास कोई बाहरी व्यावसायिक तर्क नहीं है। इसलिए, एक बार लिखे जाने के बाद, यह बहुत स्थिर होना चाहिए और इसे बहुत बदलना नहीं चाहिए। हम धीमे परीक्षणों पर भरोसा कर सकते हैं कि हम अक्सर नहीं चलते क्योंकि कोड स्थिर है।
अगले चरण के लिए एकीकरण परीक्षण लिखना है S3PersistenceService
। इन्हें नाम या फ़ोल्डर से अलग किया जाना चाहिए ताकि हम इन्हें अपने तेज़ इकाई परीक्षणों से अलग से चला सकें। एकीकरण परीक्षण अक्सर यूनिट परीक्षणों के रूप में एक ही परीक्षण ढांचे का उपयोग कर सकते हैं यदि कोड पर्याप्त जानकारीपूर्ण है, इसलिए हमें एक नया टूल सीखने की आवश्यकता नहीं है। एकीकरण परीक्षण का वास्तविक कोड वह है जो आप अपने विकल्प 1 के लिए लिखेंगे।