दिलचस्प पोस्ट
उच्च स्मृति खपत के साथ Enumerable.Range? कैसे फेसबुक जावास्क्रिप्ट एपीआई काम में पेजिंग करता है? कैसे अजगर की सॉकेट recv विधि पर टाइमआउट सेट करने के लिए? फोकस प्राप्त होने पर टेक्स्टबॉक्स की सभी सामग्रियों का चयन करें (वेनिला जेएस या jQuery) कोड की किसी विशिष्ट पंक्ति के लिए एक विशेष चेकस्टाइल नियम को अक्षम कैसे करें? जीसीसी / सीएमके के साथ 64-बिट लिनक्स मशीन पर 32-बिट बाइनरी कैसे संकलित करें I टीएसक्यूएल – कास्ट स्ट्रिंग को पूर्णांक या डिफ़ॉल्ट मान वापस लौटाएं कैफ़े में मेरे अपने डेटासेट को प्रशिक्षण / परीक्षण कैसे करें? एंड्रॉइड लाइब्रेरी ग्रैड रिलीज जार सब कुछ एक अजगर में रूबी की तरह वस्तु है? अजगर नेस्टेड फ़ंक्शन बंद क्यों नहीं किए गए हैं? शुरू हो सकता है एक वादा-शैली कार्य पर नहीं बुलाया जा सकता है। अपवाद आ रहा है स्विंग में धीरे-धीरे एक छवि को कैसे घुमाएंगे? आईओएस के साथ मेरा 'क्लिक' फ़ंक्शन कैसे काम करे क्या आप एक एम्बेडेड नल के साथ एक std :: स्ट्रिंग का निर्माण करते हैं?

नकली, मजाक और बदमाश के बीच क्या अंतर है?

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

यहां मैं उनका उपयोग कैसे करता हूं:

नकली : एक वर्ग जो एक इंटरफ़ेस लागू करता है लेकिन इसमें निश्चित डेटा और कोई तर्क नहीं है। कार्यान्वयन के आधार पर बस "अच्छा" या "खराब" डेटा लौटाता है

नकली : एक वर्ग जो एक इंटरफ़ेस लागू करता है और विशिष्ट तरीकों से फेंकने के लिए / अपवादों को गतिशील रूप से मानों को सेट करने की क्षमता प्रदान करता है और यह देखने की क्षमता प्रदान करता है कि क्या विशेष विधियों को कॉल / बुलाया नहीं गया है

स्टब : एक नकली वर्ग की तरह, सिवाय इसके कि वह यह पुष्टि करने की क्षमता प्रदान नहीं करता कि तरीकों को बुलाया गया / नहीं कहा गया है

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

Solutions Collecting From Web of "नकली, मजाक और बदमाश के बीच क्या अंतर है?"

आप कुछ जानकारी प्राप्त कर सकते हैं:

माकन फोवेलर से मोक एंड स्टब के बारे में

नकली वस्तुएं वास्तव में कार्य करने के लिए काम करती हैं, लेकिन आम तौर पर कुछ शॉर्टकट लेती हैं जो उन्हें उत्पादन के लिए उपयुक्त नहीं बनाती

परीक्षण के दौरान किए गए कॉल के लिए स्टब्स डिब्बाबंद उत्तर प्रदान करते हैं, आमतौर पर परीक्षण के लिए प्रोग्राम किए गए प्रोग्राम के बाहर कुछ भी नहीं जवाब देना। स्टब्स कॉल के बारे में जानकारी भी रिकॉर्ड कर सकते हैं, जैसे कि एक ईमेल गेटवे स्टब जो संदेशों को 'भेजा' याद करता है, या हो सकता है कि यह केवल कितने संदेश भेजता है '

हम यहाँ क्या बात कर रहे हैं: ऑब्जेक्ट्स उन उम्मीदों से पूर्व प्रोग्राम है, जिनसे उन्हें प्राप्त होने की उम्मीद की जाती है।

एक्सटिटपटन से :

नकली : हम एक ही कार्यक्षमता के एक बहुत ही हल्के कार्यान्वयन को प्राप्त करते हैं या बनाते हैं जैसा कि एक घटक द्वारा प्रदान किया गया है जो एसयूटी पर निर्भर करता है और वास्तविक के बजाय इसका उपयोग करने के लिए SUT को निर्देश देता है।

स्टब : इस कार्यान्वयन को SUT से कॉलों (या अपवाद) के साथ कॉल करने के लिए कॉन्फ़िगर किया गया है जो SUT के भीतर अनचेस्टेड कोड (पृष्ठ X पर उत्पादन कीड़े देखें) का उपयोग करेगा। टेस्ट स्टब के उपयोग के लिए एक महत्वपूर्ण संकेत है, जो बिना परीक्षण किए गए कोड को एसयूटी के अप्रत्यक्ष इनपुट को नियंत्रित करने में असमर्थता के कारण होता है

नकली ऑब्जेक्ट जो ऑब्जेक्ट के रूप में एक ही इंटरफ़ेस लागू करता है, जिस पर SUT (सिस्टम अंडर टेस्ट) निर्भर करता है। हम एक अजीब वस्तु का उपयोग एक अवलोकन बिंदु के रूप में कर सकते हैं, जब हमें सतर्कता की आवश्यकता से बचने के लिए व्यवहार की जांच करने की जरूरत है (पृष्ठ X पर उत्पादन की बग देखें) SUT पर तरीकों को लागू करने के दुष्प्रभावों का पालन करने में असमर्थता।

व्यक्तिगत रूप से

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

स्टब – एक ऑब्जेक्ट जो विधि कॉल के पूर्वनिर्धारित उत्तर प्रदान करता है।

नकली – जिस ऑब्जेक्ट पर आप अपेक्षाओं को सेट करते हैं

नकली – सीमित क्षमता वाले एक ऑब्जेक्ट (परीक्षण के प्रयोजनों के लिए), जैसे नकली वेब सेवा

टेस्ट डबल ही स्टब, मोजे और नकली के लिए सामान्य शब्द है लेकिन अनौपचारिक रूप से, आप अक्सर लोगों को सिर्फ उन्हें मजाक कहेंगे।

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

"3.1 परिचय स्टाब" में एक ठूंठ को परिभाषित करता है:

एक स्टाब प्रणाली में मौजूदा निर्भरता (या सहयोगी) के लिए एक नियंत्रणीय प्रतिस्थापन है। एक स्टब का उपयोग करके, आप सीधे निर्भरता से निपटने के बिना अपने कोड का परीक्षण कर सकते हैं

और stubs और mocks के बीच अंतर को परिभाषित करता है:

मॉक बनाम स्टब के बारे में याद रखने वाली मुख्य बात यह है कि नकली स्टब की तरह ही हैं, लेकिन आप नकली वस्तु के खिलाफ दावा करते हैं, जबकि आप एक स्टब के खिलाफ नहीं बोलते हैं।

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

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

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

एक परीक्षण का उदाहरण जहां कक्षा FakeX को एक ठूंठ के रूप में प्रयोग किया जाता है:

const pleaseReturn5 = 5; var fake = new FakeX(pleaseReturn5); var cut = new ClassUnderTest(fake); cut.SquareIt; Assert.AreEqual(25, cut.SomeProperty); 

fake उदाहरण को एक ठूंठ के रूप में प्रयोग किया जाता है क्योंकि Assert fake सभी का उपयोग नहीं करता है।

एक परीक्षण का उदाहरण जहां टेस्ट वर्ग एक्स को नकली के रूप में प्रयोग किया जाता है:

 const pleaseReturn5 = 5; var fake = new FakeX(pleaseReturn5); var cut = new ClassUnderTest(fake); cut.SquareIt; Assert.AreEqual(25, fake.SomeProperty); 

इस मामले में Assert fake पर एक मूल्य की जांच करता है, fake बना रहा है।

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

मैं Osherove के साथ सहमत हूँ कि

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

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

मुझे एहसास है कि नकली के खिलाफ लिखने का दावा आम बात है, खासकर जब आप टीडीडी के एक नकली प्रकार के ग्राहक हैं मेरा मानना ​​है कि मैं क्लासिकिस्ट शिविर में मार्टिन फोवलर के साथ दृढ़ता से हूं (देखें मार्टिन फोॉल्जर के " मोक्स्स स्टैट्स नहीं हैं" ) और ओशरवेव की तरह इंटरैक्शन टेस्ट से बचने के लिए (जो केवल नकली के खिलाफ जोर देकर किया जा सकता है) जितना संभव होगा।

मजेदार पढ़ने के लिए, यहां पर परिभाषित किया गया है कि आपको "फोवेर नकली क्लासिक" के लिए Google को क्यों मुकाबला करना चाहिए। आपको बहुत अधिक राय मिलेगी

यह परीक्षाएं अभिव्यंजक बनाने की बात है अगर मैं परीक्षा को दो ऑब्जेक्ट्स के बीच संबंध का वर्णन करने के लिए चाहता हूं तो मैं एक नकली उम्मीदों को सेट करता हूं मैं रिबल्ट मूल्यों को ठुकराता हूं अगर मैं परीक्षण में दिलचस्प व्यवहार के लिए मुझे एक सहायक ऑब्जेक्ट सेट कर रहा हूं।

स्टब और मॉक के उपयोग को स्पष्ट करने के लिए, मैं रॉय ओशेरिव की " दी आर्ट ऑफ यूनिट टेस्टिंग " पर आधारित एक उदाहरण भी शामिल करना चाहूंगा।

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

यहां तर्क है कि हम लॉगअनलियेज़र के अंदर परीक्षण करना चाहते हैं:

 if(fileName.Length<8) { try { service.LogError("Filename too short:" + fileName); } catch (Exception e) { email.SendEmail("a","subject",e.Message); } } 

आप कैसे जांच करते हैं कि वेब एवलिएज़र ईमेल सेवा सही ढंग से कहता है जब वेब सेवा एक अपवाद फेंकता है? यहां जिन सवालों का हम सामना कर रहे हैं:

  • हम वेब सेवा को कैसे बदल सकते हैं?

  • हम वेब सेवा से अपवाद कैसे अनुकरण कर सकते हैं ताकि हम ईमेल सेवा को कॉल का परीक्षण कर सकें?

  • हम कैसे जानते होंगे कि ईमेल सेवा सही या बिल्कुल भी बुलायी गयी थी?

हम वेब सेवा के लिए एक स्टब का उपयोग करके पहले दो सवालों से निपट सकते हैं। तीसरी समस्या का समाधान करने के लिए, हम ईमेल सेवा के लिए नकली वस्तु का उपयोग कर सकते हैं

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

 [TestFixture] public class LogAnalyzer2Tests { [Test] public void Analyze_WebServiceThrows_SendsEmail() { StubService stubService = new StubService(); stubService.ToThrow= new Exception("fake exception"); MockEmailService mockEmail = new MockEmailService(); LogAnalyzer2 log = new LogAnalyzer2(); log.Service = stubService log.Email=mockEmail; string tooShortFileName="abc.ext"; log.Analyze(tooShortFileName); Assert.AreEqual("a",mockEmail.To); //MOCKING USED Assert.AreEqual("fake exception",mockEmail.Body); //MOCKING USED Assert.AreEqual("subject",mockEmail.Subject); } } 

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

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