मॉकिंग क्या है? ।
मॉकिंग क्या है? ।
जवाबों:
प्रस्तावना: यदि आप शब्दकोष में संज्ञा का मजाक उड़ाते हैं , तो आप पाएंगे कि शब्द की परिभाषाओं में से एक नकल के रूप में बनाई गई है ।
मॉकिंग का उपयोग मुख्य रूप से इकाई परीक्षण में किया जाता है। परीक्षण के तहत एक वस्तु में अन्य (जटिल) वस्तुओं पर निर्भरता हो सकती है। उस वस्तु के व्यवहार को अलग करने के लिए जिसे आप अन्य वस्तुओं को नकली द्वारा प्रतिस्थापित करना चाहते हैं जो वास्तविक वस्तुओं के व्यवहार का अनुकरण करते हैं। यह उपयोगी है अगर वास्तविक वस्तुएं इकाई परीक्षण में शामिल करने के लिए अव्यावहारिक हैं।
संक्षेप में, मॉकिंग उन वस्तुओं का निर्माण कर रहा है जो वास्तविक वस्तुओं के व्यवहार का अनुकरण करते हैं।
स्टबिंग के विपरीत कई बार आप मॉकिंग में अंतर करना चाहते हैं । इस विषय में कुछ असहमति हो सकती है लेकिन एक स्टब की मेरी परिभाषा "न्यूनतम" सिम्युलेटेड ऑब्जेक्ट है। स्टब परीक्षण को निष्पादित करने के लिए परीक्षण के तहत वस्तु की अनुमति देने के लिए सिर्फ पर्याप्त व्यवहार को लागू करता है।
एक मॉक एक ठूंठ की तरह है लेकिन परीक्षण यह भी सत्यापित करेगा कि परीक्षण के तहत वस्तु उम्मीद के अनुसार मॉक कहती है। परीक्षण का एक हिस्सा सत्यापित कर रहा है कि नकली का सही इस्तेमाल किया गया था।
एक उदाहरण देने के लिए: आप रिकॉर्ड को संग्रहीत करने के लिए एक सरल-इन-मेमोरी संरचना को लागू करके डेटाबेस को स्टब कर सकते हैं। परीक्षण के तहत वस्तु तब डेटाबेस स्टुब के रिकॉर्ड को पढ़ सकती है और उसे लिख सकती है ताकि वह परीक्षण को निष्पादित कर सके। यह डेटाबेस से संबंधित वस्तु के कुछ व्यवहार का परीक्षण कर सकता है और डेटाबेस स्टब को केवल परीक्षण चलाने के लिए शामिल किया जाएगा।
यदि आप इसके बजाय यह सत्यापित करना चाहते हैं कि परीक्षण के अंतर्गत ऑब्जेक्ट डेटाबेस के लिए कुछ विशिष्ट डेटा लिखता है, तो आपको डेटाबेस को मॉक करना होगा। आपका परीक्षण तब डेटाबेस मॉक को जो लिखा गया था, उसके बारे में अभिकथन शामिल करेगा।
अन्य उत्तर बताते हैं कि मॉकिंग क्या है। विभिन्न उदाहरणों के साथ आपको इसके माध्यम से चलता हूं । और मेरा विश्वास करो, यह वास्तव में आपके विचार से कहीं अधिक सरल है।
tl; dr यह मूल वर्ग का एक उदाहरण है। इसमें अन्य डेटा इंजेक्ट किया गया है ताकि आप इंजेक्ट किए गए भागों के परीक्षण से बचें और पूरी तरह से अपने वर्ग / कार्यों के कार्यान्वयन विवरणों के परीक्षण पर ध्यान केंद्रित करें।
एक सरल उदाहरण:
class Foo {
func add (num1: Int, num2: Int) -> Int { // Line A
return num1 + num2 // Line B
}
}
let unit = Foo() // unit under test
assertEqual(unit.add(1,5),6)
जैसा कि आप देख सकते हैं, मैं LineA का परीक्षण नहीं कर रहा हूँ अर्थात मैं इनपुट मापदंडों को मान्य नहीं कर रहा हूँ। मैं यह देखने के लिए मान्य नहीं हूं कि क्या num1, num2 एक पूर्णांक है। मेरे पास इसके खिलाफ कोई जोर नहीं है।
मैं केवल यह देखने के लिए परीक्षण कर रहा हूं कि क्या लाइनबी (मेरे कार्यान्वयन ) ने नकली मान दिया है 1
और 5
जैसा मैं उम्मीद करता हूं वैसा ही कर रहा हूं।
स्पष्ट रूप से वास्तविक शब्द में यह बहुत अधिक जटिल हो सकता है। पैरामीटर एक व्यक्ति, कस्टम, या कार्यान्वयन विवरण की तरह एक कस्टम ऑब्जेक्ट हो सकता है एक से अधिक हो सकता है +
। लेकिन परीक्षण का तर्क समान होगा।
मान लें कि आप एक ऐसी मशीन बना रहे हैं जो हवाई अड्डे की सुरक्षा के लिए इलेक्ट्रॉनिक उपकरणों के प्रकार और ब्रांड नाम की पहचान करती है। यह मशीन अपने कैमरे से जो कुछ भी देखती है उसे प्रोसेस करके करती है।
अब आपका प्रबंधक द्वार पर चलता है और आपसे इकाई-परीक्षण के लिए कहता है।
फिर आप एक डेवलपर के रूप में आप या तो 1000 वास्तविक वस्तुओं को ला सकते हैं, जैसे मैकबुक प्रो, गूगल नेक्सस, एक केला, एक iPad आदि इसके सामने और परीक्षण करें और देखें कि क्या यह सब काम करता है।
लेकिन आप नकली वस्तुओं का भी उपयोग कर सकते हैं, जैसे एक समान दिखने वाली मैकबुक प्रो (बिना किसी वास्तविक आंतरिक भाग के) या उसके सामने एक प्लास्टिक केला। आप 1000 असली लैपटॉप में निवेश करने और केले को सड़ने से बचा सकते हैं।
मुद्दा यह है कि आप परीक्षण करने की कोशिश नहीं कर रहे हैं कि केला नकली है या नहीं। न ही यह परीक्षण करना कि लैपटॉप नकली है या नहीं। यदि आप एक बार एक मशीन को केले की तरह देखते हैं not an electronic device
और मैकबुक प्रो के लिए कहते हैं, तो यह सब आप परीक्षण कर रहे हैं Laptop, Apple
। मशीन के लिए, इसके पता लगाने का परिणाम नकली / नकली इलेक्ट्रॉनिक्स और वास्तविक इलेक्ट्रॉनिक्स के लिए समान होना चाहिए
ऊपर उल्लिखित तर्क वास्तविक कोड के यूनिट-परीक्षण पर भी लागू होता है। यह एक फ़ंक्शन है जिसे आपको वास्तविक इनपुट (और इंटरैक्शन) या नकली से प्राप्त वास्तविक मूल्यों के साथ काम करना चाहिएमान जो आप इकाई-परीक्षण के दौरान इंजेक्ट करते हैं। और जैसे आप यूनिट-टेस्ट (और मॉकिंग) के साथ वास्तविक केले या मैकबुक का उपयोग करने से खुद को कैसे बचाते हैं, आप अपने आप को कुछ ऐसा करने से बचाते हैं जिससे आपका सर्वर 500, 403, 200 आदि का स्टेटस कोड वापस कर देता है। 500 को ट्रिगर करने के लिए आपका सर्वर केवल तभी होता है जब सर्वर डाउन होता है, जबकि 200 तब होता है जब सर्वर ऊपर होता है। 100 नेटवर्क केंद्रित परीक्षणों को चलाना मुश्किल हो जाता है यदि आपको सर्वर के ऊपर और नीचे स्विच करने के बीच लगातार 10 सेकंड इंतजार करना पड़ता है)। इसलिए इसके बजाय आप स्टेटस कोड 500, 200, 403 आदि के साथ प्रतिक्रिया को इंजेक्ट / मॉक करते हैं और इंजेक्शन / नकली मान के साथ अपनी यूनिट / फ़ंक्शन का परीक्षण करते हैं।
मान लीजिए कि आप एक iOS एप्लिकेशन लिख रहे हैं और आपके पास नेटवर्क कॉल है । आपका काम आपके आवेदन का परीक्षण करना है। यह जांचने / पहचानने के लिए कि क्या नेटवर्क कॉल अपेक्षित रूप से काम करता है या नहीं, आपकी जवाबदेही नहीं है। यह परीक्षण करने के लिए एक अन्य पार्टी (सर्वर टीम) की जिम्मेदारी है। आपको इस (नेटवर्क) निर्भरता को दूर करना होगा और फिर भी अपने सभी कोड का परीक्षण करना जारी रखना चाहिए जो इसके आसपास काम करता है।
एक JSON प्रतिक्रिया के साथ एक नेटवर्क कॉल विभिन्न स्थिति कोड 404, 500, 200, 303 आदि वापस कर सकता है।
आपका ऐप उन सभी के लिए काम करने के लिए माना जाता है (त्रुटियों के मामले में, आपके ऐप को अपनी अपेक्षित त्रुटि फेंकनी चाहिए)। आप जो मजाक उड़ाते हैं, क्या आप 'काल्पनिक-वास्तविक के समान' नेटवर्क प्रतिक्रियाएं बनाते हैं (जैसे JSON फ़ाइल के साथ 200 कोड) और वास्तविक नेटवर्क कॉल करने और अपने नेटवर्क की प्रतिक्रिया की प्रतीक्षा किए बिना अपने कोड का परीक्षण करें । आप सभी प्रकार के नेटवर्क प्रतिक्रियाओं के लिए मैन्युअल रूप से हार्डकोड / नेटवर्क प्रतिक्रिया लौटाते हैं और देखते हैं कि आपका ऐप आपकी अपेक्षा के अनुरूप काम कर रहा है या नहीं। (आप कभी भी गलत डेटा के साथ 200 का अनुमान / परीक्षण नहीं करते हैं, क्योंकि यह आपकी ज़िम्मेदारी नहीं है, आपकी ज़िम्मेदारी आपके ऐप को एक सही 200 के साथ परीक्षण करना है , या 400, 500 के मामले में, आप परीक्षण करते हैं कि क्या आपका ऐप सही त्रुटि फेंकता है)
यह काल्पनिक-वास्तविक के समान है जिसे मॉकिंग के रूप में जाना जाता है।
ऐसा करने के लिए, आप अपने मूल कोड का उपयोग नहीं कर सकते (आपके मूल कोड में पूर्व-सम्मिलित प्रतिक्रियाएं नहीं हैं, ठीक है?)। आपको इसमें कुछ जोड़ना होगा , उस डमी डेटा को इंजेक्ट / इंसर्ट करना होगा जिसकी सामान्य रूप से आवश्यकता नहीं है (या आपकी कक्षा का एक हिस्सा)।
तो अगर आप एक उदाहरण मूल वर्ग बना सकते हैं और जोड़ने के जो भी आप यह करने की जरूरत है और फिर परीक्षण (यहाँ नेटवर्क HttpResponse, डेटा या विफलता के मामले में किया जा रहा है, तो आपको सही ErrorString, HttpResponse पारित) मज़ाक उड़ाया वर्ग।
लंबी कहानी छोटी, मज़ाक करना आसान है और सीमित करें कि आप क्या परीक्षण कर रहे हैं और आपको यह भी खिलाता है कि कक्षा क्या निर्भर करती है। इस उदाहरण में आप नेटवर्क कॉल का परीक्षण करने से बचते हैं , और इसके बजाय परीक्षण करते हैं कि आपका ऐप काम करता है या नहीं, जैसा कि आप इंजेक्ट किए गए आउटपुट / प्रतिक्रियाओं के साथ उम्मीद करते हैं - - मॉकिंग क्लासेस द्वारा
कहने की जरूरत नहीं है, आप प्रत्येक नेटवर्क प्रतिक्रिया का अलग से परीक्षण करते हैं।
अब एक सवाल जो मेरे दिमाग में हमेशा था, वह था: अनुबंध / अंतिम बिंदु और मूल रूप से मेरे एपीआई की JSON प्रतिक्रिया लगातार अपडेट होती रहती है। मैं यूनिट परीक्षण कैसे लिख सकता हूं जो इसे ध्यान में रखते हैं?
इस पर और अधिक विस्तार करने के लिए: मान लें कि मॉडल को नाम की एक कुंजी / फ़ील्ड की आवश्यकता है username
। आप इसे टेस्ट करते हैं और आपका टेस्ट पास हो जाता है। 2 सप्ताह बाद बैकएंड कुंजी का नाम बदल देता है id
। आपके परीक्षण अभी भी गुजरते हैं। सही? या नहीं?
क्या मोक्स को अपडेट करने के लिए बैकएंड डेवलपर की जिम्मेदारी है। क्या यह हमारे समझौते का हिस्सा होना चाहिए कि वे अपडेटेड मोक्स प्रदान करें?
उपरोक्त समस्या का उत्तर यह है कि: एक ग्राहक-पक्ष डेवलपर के रूप में इकाई विकास + आपकी विकास प्रक्रिया को पुराने नकली प्रतिक्रिया को पकड़ना / पकड़ना चाहिए। अगर आप मुझसे पूछें कि कैसे? अच्छी तरह से जवाब है:
अपडेट किए गए API का उपयोग किए बिना हमारा वास्तविक ऐप विफल हो जाएगा (या अभी तक असफल व्यवहार नहीं है) ... इसलिए यदि वह विफल रहता है ... तो हम अपने विकास कोड में बदलाव करेंगे। जो फिर से हमारे परीक्षणों को विफल करता है .... जिसे हमें इसे सही करना होगा। (वास्तव में अगर हमें टीडीडी प्रक्रिया को सही तरीके से करना है तो हमें क्षेत्र के बारे में कोई भी कोड नहीं लिखना है जब तक कि हम इसके लिए परीक्षण न लिखें ... और इसे विफल देखें और तब जाकर इसके लिए वास्तविक विकास कोड लिखें।)
यह सब मतलब है कि बैकएंड को यह कहने की ज़रूरत नहीं है: "अरे हमने मक्स को अपडेट किया" ... यह अंततः आपके कोड विकास / डिबगिंग के माध्यम से होता है। क्योंकि यह सभी विकास प्रक्रिया का हिस्सा है! यद्यपि यदि बैकएंड आपके लिए नकली प्रतिक्रिया प्रदान करता है तो यह आसान है।
इस पर मेरा पूरा कहना यह है कि (यदि आप अपडेट की गई एपीआई प्रतिक्रिया को स्वचालित रूप से अपडेट नहीं कर सकते हैं तो) कुछ मानव संपर्क की आवश्यकता है यानी जेएनएस के मैनुअल अपडेट और यह सुनिश्चित करने के लिए छोटी बैठकें करना कि उनके मूल्य आपकी प्रक्रिया का हिस्सा बन जाएंगे।
यह खंड हमारे कोकोहाइड मीटअप समूह में एक सुस्त चर्चा के लिए धन्यवाद लिखा गया था
केवल iOS देवों के लिए:
मॉकिंग का एक बहुत अच्छा उदाहरण नताशा मुर्सचेव की यह प्रैक्टिकल प्रोटोकॉल-ओरिएंटेड बात है । बस 18:30 मिनट पर छोड़ें, हालांकि स्लाइड वास्तविक वीडियो के साथ सिंक से बाहर हो सकते हैं
मुझे वास्तव में प्रतिलेख से यह हिस्सा पसंद है:
क्योंकि यह परीक्षण कर रहा है ... हम यह सुनिश्चित करना चाहते हैं कि
get
फ़ंक्शनGettable
को कहा जाता है, क्योंकि यह वापस आ सकता है और फ़ंक्शन सैद्धांतिक रूप से कहीं से भी खाद्य पदार्थों की एक सरणी असाइन कर सकता है । हमें यह सुनिश्चित करने की आवश्यकता है कि इसे कहा जाता है;
मॉकिंग के बारे में वेब पर SO और अच्छे पोस्ट पर बहुत सारे उत्तर हैं। एक जगह जिसे आप देखना शुरू करना चाहते हैं वह मार्टिन फाउलर मोक्स आर स्टब्स नहीं है जहां वह मॉकिंग के विचारों पर बहुत चर्चा करता है।
एक पैराग्राफ में - निर्भरता पर निर्भर होने के साथ कोड की एक इकाई के परीक्षण की अनुमति देने के लिए मॉकिंग एक कण तकनीक है। सामान्य तौर पर, अन्य तरीकों से मॉकिंग करने में जो अंतर होता है, वह यह है कि कोड निर्भरता को बदलने के लिए उपयोग की जाने वाली नकली वस्तुएं अपेक्षाओं को स्थापित करने की अनुमति देंगी - एक नकली वस्तु को पता चलेगा कि आपके कोड द्वारा कैसे कॉल किया जाना है और कैसे प्रतिक्रिया देना है।
आपके मूल प्रश्न में टाइपमॉक का उल्लेख किया गया है, इसलिए मैंने अपना उत्तर उस नीचे छोड़ दिया है:
टाइपमॉक एक वाणिज्यिक मॉकिंग फ्रेमवर्क का नाम है ।
यह राइनोमॉक्स और Moq जैसे मुफ्त मॉकिंग फ्रेमवर्क की सभी विशेषताओं के साथ-साथ कुछ और अधिक शक्तिशाली विकल्प प्रदान करता है।
आपको टाइपमॉक की आवश्यकता है या नहीं, यह अत्यधिक बहस का विषय है - आप सबसे अधिक ऐसा मजाक कर सकते हैं, जिसे आप कभी भी फ्री मॉकिंग लाइब्रेरी के साथ चाहते हैं, और कई लोग तर्क देते हैं कि टाइपमॉक द्वारा पेश की जाने वाली क्षमताएं अक्सर आपको अच्छी तरह से समझाया डिजाइन से दूर ले जाएंगी।
जैसा कि एक अन्य उत्तर में कहा गया है कि 'टाइपमॉकिंग' वास्तव में एक परिभाषित अवधारणा नहीं है, लेकिन इसका मतलब यह निकाला जा सकता है कि टाइपमॉक टाइप करने के लिए, टाइपिंग के लिए सीएलआर प्रोफाइलर का उपयोग करते हुए। रनटाइम के दौरान .Net कॉल, नकली वस्तुओं को अधिक क्षमता प्रदान करना (आवश्यकताएं नहीं)। जैसे कि जरूरत इंटरफेस या वर्चुअल तरीके)।
मॉक एक विधि / वस्तु है जो नियंत्रित तरीकों में एक वास्तविक विधि / वस्तु के व्यवहार को अनुकरण करती है। इकाई परीक्षण में नकली वस्तुओं का उपयोग किया जाता है।
अक्सर एक परीक्षण के तहत एक विधि अन्य बाहरी सेवाओं या तरीकों को अपने भीतर बुलाती है। इन्हें निर्भरता कहा जाता है। एक बार मजाक उड़ाए जाने के बाद, निर्भरताएं हमारे व्यवहार को परिभाषित करती हैं।
मोक्स द्वारा नियंत्रित निर्भरता के साथ, हम उस पद्धति के व्यवहार का आसानी से परीक्षण कर सकते हैं जिसे हमने कोडित किया था। यह यूनिट परीक्षण है।
मॉकिंग छद्म वस्तुओं को उत्पन्न कर रहा है जो परीक्षणों के लिए वास्तविक वस्तुओं के व्यवहार का अनुकरण करते हैं
एक विशिष्ट इकाई को परीक्षण को अलग करने के लिए प्रकारों को मॉक करने का उद्देश्य निर्भरता को कम करना है। स्टब्स सरल सरोगेट हैं, जबकि मोज़ेक सरोगेट हैं जो उपयोग को सत्यापित कर सकते हैं। एक मॉकिंग फ्रेमवर्क एक उपकरण है जो आपको स्टब्स और मॉक उत्पन्न करने में मदद करेगा।
संपादित करें : मूल शब्द "टाइप मॉकिंग" के बाद से मुझे यह धारणा मिली कि यह टाइपमॉक से संबंधित है। मेरे अनुभव में सामान्य शब्द "मॉकिंग" है। कृपया नीचे दी गई जानकारी को विशेष रूप से टाइपमॉक पर अवहेलना करने के लिए स्वतंत्र महसूस करें।
टाइपमॉक आइसोलेटर अधिकांश अन्य मॉकिंग फ्रेमवर्क से अलग है जिसमें यह मक्खी पर मेरे संशोधित आईएल का काम करता है। यह प्रकार और उदाहरणों को मॉक करने की अनुमति देता है जो अधिकांश अन्य फ्रेमवर्क मॉक नहीं कर सकते हैं। इन प्रकारों / उदाहरणों को अन्य ढाँचों के साथ मॉक करने के लिए आपको अपने स्वयं के सार प्रदान करने होंगे और इनका मज़ाक करना होगा।
टाइपमॉक एक स्वच्छ रनटाइम वातावरण की कीमत पर महान लचीलापन प्रदान करता है। TypeMock के परिणामों के साइड इफेक्ट के रूप में, इसके परिणाम आपको कभी-कभी TypeMock का उपयोग करते समय बहुत ही अजीब परिणाम प्राप्त होंगे।
मुझे लगता है कि टाइपमॉक आइसोलेटर का उपयोग टाइपिंग के लिए किया जाएगा।
यह एक उपकरण है जो इकाई परीक्षणों में उपयोग के लिए नकली बनाता है, बिना आपके कोड को आईओसी को ध्यान में रखते हुए लिखने की आवश्यकता के बिना।
यदि आपके मॉक में नेटवर्क अनुरोध शामिल है, तो हिट करने के लिए वास्तविक परीक्षण सर्वर के लिए एक और विकल्प है। अपने परीक्षण के लिए अनुरोध और प्रतिक्रिया उत्पन्न करने के लिए आप इस सेवा का उपयोग कर सकते हैं। http://testerurl.com/