2013-02-15 40 views
9

मैंने अभी पढ़ना शुरू कर दिया है Professional Test Driven Development with C#: Developing Real World Applications with TDDस्टब्स, नकली और मोजे को समझना।

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

एक और चीज जो मुझे लगता है कि मैंने उठाया है यह है कि मैक्स किसी भी तरह निर्भरता इंजेक्शन से संबंधित हैं, एक अवधारणा जिसे मैं कल समझने में कामयाब रहा।

मुझे जो नहीं मिला वह है कि मैं वास्तव में उनका उपयोग क्यों करूंगा। मुझे ऑनलाइन कोई ठोस उदाहरण नहीं मिल रहा है जो उन्हें सही तरीके से समझाता है।

क्या कोई मुझे इस अवधारणाओं को समझा सकता है?

+2

पढ़ें इस http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html और इस http://martinfowler.com/articles/mocksArentStubs.html – blank

+1

और तुम पर हैं, जबकि यह आपको यह भी पढ़ सकता है http://www.mockobjects.com/files/mockrolesnotobjects.pdf – blank

+0

मुझे उम्मीद है कि आप वाणिज्यिक क्षमा करेंगे, लेकिन हमने एक संपूर्ण पुस्तक "ग्रोइंग ऑब्जेक्ट ओरिएंटेड सॉफ्टवेयर" लिखा है, जो प्रेरणा को संबोधित करता है मोजे का उपयोग करना –

उत्तर

19

मैंने पहले भी पढ़ा है के रूप में, यहाँ है कि मैं क्या मानना ​​है प्रत्येक शब्द

के लिए खड़ा है स्टब

यहाँ आप एक ज्ञात मूल्य के लिए एक विधि का परिणाम छोटा करते हैं, सिर्फ यह बताने के लिए कोड बिना मुद्दों के चलाते हैं। उदाहरण के लिए, मान लें कि आपके पास निम्न था:

public int CalculateDiskSize(string networkShareName) 
{ 
    // This method does things on a network drive. 
} 

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

sut.WhenCalled(() => sut.CalculateDiskSize()).Returns(10); 

नकली

एक नकली आप नकली डेटा लौट रहे हैं, या एक वस्तु का एक नकली उदाहरण बनाकर साथ:

तो आप की तरह कुछ कर रही अंत। एक क्लासिक उदाहरण भंडार वर्ग हैं। इस विधि को लें:

public int CalculateTotalSalary(IList<Employee> employees) { } 

आम तौर पर उपरोक्त विधि डेटाबेस से पढ़ने वाले कर्मचारियों का संग्रह पारित किया जाएगा। हालांकि आपके यूनिट परीक्षणों में आप डेटाबेस तक नहीं पहुंचना चाहते हैं।

IList<Employee> fakeEmployees = new List<Employee>(); 

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

Mocks

नकली वस्तुओं का उपयोग करते समय आप कुछ व्यवहार, या डेटा, उन नकली वस्तुओं पर सत्यापित करने के लिए करना चाहते हैं। उदाहरण:

आप सत्यापित करने के लिए एक विशिष्ट विधि एक परीक्षण चलाने के दौरान मार डाला गया था चाहते हैं, यहाँ Moq मजाक ढांचे का उपयोग कर एक सामान्य उदाहरण है:

public void Test() 
{ 
    // Arrange. 
    var mock = new Mock<ISomething>(); 

    mock.Expect(m => m.MethodToCheckIfCalled()).Verifiable(); 

    var sut = new ThingToTest(); 

    // Act. 
    sut.DoSomething(mock.Object); 

    // Assert 
    mock.Verify(m => m.MethodToCheckIfCalled()); 
} 

उम्मीद है कि इसके बाद के संस्करण चीज़ें थोड़ी स्पष्ट मदद करता है।

संपादित करें: रॉय ओशरोव टेस्ट संचालित विकास का एक अच्छी तरह से ज्ञात वकील है, और उसके पास इस विषय पर कुछ अच्छी जानकारी है।आप इसे बहुत उपयोगी हो सकते हैं:

http://artofunittesting.com/

+0

बहुत जानकारीपूर्ण। मैंने हमेशा सोचा कि नकली और मोजे अदला-बदले थे। मैं यहां हर दिन नई चीजें सीखता हूं :) +1 – bas

+0

मोक्स में 'एम' क्या है? और क्या हम जिस कक्षा का परीक्षण कर रहे हैं वह कुछ है? – fersarr

+0

'm' एक पैरामीटर है जो 'अपेक्षा()' फ़ंक्शन में पारित किया गया है। यह एक भेड़ का बच्चा अभिव्यक्ति है। इसे कहीं भी घोषित नहीं किया गया है, यह केवल 'उम्मीद()' लैम्ब्डा के अंदर मौजूद है। 'var mock = new mock (); 'का अर्थ है कि आप एक ऑब्जेक्ट बना रहे हैं जो' ISomething' लागू करता है, इसलिए' ISOMething' एक इंटरफ़ेस है, ऑब्जेक्ट नहीं। उदाहरण के लिए 'Expect()' फ़ंक्शन के माध्यम से, जब उन्हें कॉल किया जाता है तो विधियों को कैसे प्रतिसाद दिया जाता है, इसके बाद आप 'मॉक' का उपयोग कर सकते हैं। –

0

यह पीएचपी यूनिट मैनुअल मुझे परिचय के रूप में बहुत मदद की:

"कभी कभी यह परीक्षण (SUT) के तहत प्रणाली का परीक्षण करने के लिए सिर्फ सादा मुश्किल है क्योंकि यह निर्भर करता है अन्य घटकों पर जिन्हें परीक्षण पर्यावरण में उपयोग नहीं किया जा सकता है। ऐसा इसलिए हो सकता है क्योंकि वे उपलब्ध नहीं हैं, वे परीक्षण के लिए आवश्यक परिणामों को वापस नहीं करेंगे या क्योंकि उन्हें निष्पादित करने के लिए अवांछनीय दुष्प्रभाव होंगे। अन्य मामलों में, हमारी परीक्षण रणनीति की आवश्यकता होती है हमें एसयूटी के आंतरिक व्यवहार की अधिक नियंत्रण या दृश्यता प्राप्त करने के लिए। " अधिक: https://phpunit.de/manual/current/en/test-doubles.html

और मुझे "परीक्षण युगल" की तलाश करते समय बेहतर "परिचय" मिलते हैं क्योंकि मोक्स, नकली, स्टब्स और अन्य ज्ञात हैं।

3

वे टेस्ट डबल के सभी बदलाव हैं। http://xunitpatterns.com/Test%20Double.html

इसके अलावा, मार्टिन फाउलर की पद से: http://martinfowler.com/articles/mocksArentStubs.html

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

  1. डमी वस्तुओं: चारों ओर पारित कर रहे हैं, लेकिन वास्तव में इस्तेमाल कभी नहीं किया। आमतौर पर वे पैरामीटर सूचियों को भरने के लिए उपयोग किए जाते हैं।
  2. नकली वस्तुओं में वास्तव में कार्यान्वयन कार्यरत हैं, लेकिन आमतौर पर कुछ शॉर्टकट लेते हैं जो बनाता है जो उन्हें उत्पादन के लिए उपयुक्त नहीं है (स्मृति डेटाबेस में एक अच्छा उदाहरण है)।
  3. स्टब्स परीक्षण के दौरान किए गए कॉल के डिब्बाबंद उत्तर प्रदान करते हैं, आमतौर पर परीक्षण के लिए में प्रोग्राम किए गए किसी भी चीज़ के जवाब में प्रतिक्रिया नहीं दे रहा है। स्टब्स कॉल के बारे में जानकारी रिकॉर्ड कर सकते हैं, जैसे एक ईमेल गेटवे स्टब जो इसे भेजे गए संदेशों को याद करता है, या शायद केवल कितने संदेश भेजे गए हैं।
  4. मैक्स हम यहां किस बारे में बात कर रहे हैं: ऑब्जेक्ट्स पूर्व-प्रोग्राम किए गए उम्मीदों के साथ पूर्व-प्रोग्राम किए गए हैं जो कॉल की विनिर्देशन की अपेक्षा करते हैं।

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