2010-05-25 16 views
7

मैं परीक्षण लिखने के तरीके सीखने की कोशिश कर रहा हूं। मैं भी जावा सीख रहा हूँ, मुझे बताया गया था मैं सीखना चाहिए/उपयोग/अभ्यास jMock, मैं कुछ लेख ऑनलाइन मिल गया है की तरह का विस्तार निश्चित करने के लिए कि मदद:परीक्षण के साथ कैसे शुरू करें (jMock)

http://www.theserverside.com/news/1365050/Using-JMock-in-Test-Driven-Development

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock

और सबसे लेख मैंने पाया कि परीक्षण संचालित विकास के बारे में था, पहले परीक्षण लिखें, फिर परीक्षण पास करने के लिए कोड लिखें। मैं इस समय की तलाश नहीं कर रहा हूं, मैं jmock के साथ पहले से मौजूद कोड के लिए परीक्षण लिखने की कोशिश कर रहा हूं।

official documentation मेरे लिए कम से कम और बहुत कठिन कहने के लिए अस्पष्ट है। क्या किसी को यह सीखने का बेहतर तरीका है। अच्छी किताबें/लिंक/ट्यूटोरियल मुझे बहुत मदद करेंगे। धन्यवाद

संपादित करें - अधिक ठोस सवाल:

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock - इस लेख

इस इस सरल वर्ग नकली करने की कोशिश की से:

import java.util.Map; 
    public class Cache { 
     private Map<Integer, String> underlyingStorage; 
     public Cache(Map<Integer, String> underlyingStorage) { 
      this.underlyingStorage = underlyingStorage; 
     } 
     public String get(int key) { 
      return underlyingStorage.get(key); 
     } 
     public void add(int key, String value) { 
      underlyingStorage.put(key, value); 
     } 
     public void remove(int key) { 
      underlyingStorage.remove(key); 
     } 
     public int size() { 
      return underlyingStorage.size(); 
     } 
     public void clear() { 
      underlyingStorage.clear(); 
     } 
    } 

यहाँ कैसे मैं करने की कोशिश की है एक परीक्षण/नकली बनाएं:

public class CacheTest extends TestCase { 

    private Mockery context; 
    private Map mockMap; 
    private Cache cache; 

    @Override 
    @Before 
    public void setUp() { 
     context = new Mockery() { 
      { 
       setImposteriser(ClassImposteriser.INSTANCE); 
      } 
     }; 

     mockMap = context.mock(Map.class); 
     cache = new Cache(mockMap); 
    } 

    public void testCache() { 
     context.checking(new Expectations() {{ 
      atLeast(1).of(mockMap).size(); 
      will(returnValue(int.class)); 
     }}); 

    } 
} 

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

+1

कोई जवाब नहीं है लेकिन: मैं यह जानने की सलाह दूंगा कि मैक्स में देखने से पहले परीक्षण कैसे लिखना है। मोक्स परीक्षण में एक उन्नत विषय हैं, आपको पहले मूल बातें मास्टर करना चाहिए। – Arne

+0

@Arne क्या आप मुझे ठोस जवाब दे सकते हैं जिसे मूल बातें माना जाता है? मैं एक त्वरित शिक्षार्थी हूं, यह नहीं कह रहा कि मैं अन्य लोगों की तुलना में अधिक बुद्धिमान हूं, मैं सीखने के लिए उत्सुक हूं और अपने हाथों पर काफी समय लेता हूं। तो अगर एक चीज उबाऊ हो जाती है तो मैं दूसरे साधारण/उन्नत पर जा सकता हूं, वास्तव में कोई फर्क नहीं पड़ता। tnx – London

+0

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

उत्तर

5

यहाँ JUnit और EasyMock (एक मजाक पुस्तकालय मैं व्यक्तिगत रूप से दूर JMock से उपयोग करने के लिए आसान लगता है) का उपयोग कर के बारे में एक ट्यूटोरियल है यहां तक ​​कि यदि आप जेएमॉक का उपयोग करने के लिए 100% समर्पित हैं, तो दोनों के बीच की अवधारणाएं समान हैं और इससे आपको उन्हें बेहतर समझने में मदद मिलनी चाहिए।

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

+0

क्या आप रचनाकारों का मज़ाक उड़ा सकते हैं क्योंकि वे विधियों नहीं हैं, मैं अभी भी सब कुछ समझने के लिए लड़ रहा हूं। – London

+0

कुछ पुस्तकालयों में वर्गों का मज़ाक उड़ाने के लिए समर्थन है, न केवल इंटरफेस (EasyMock 3.0 यह दावा करता है) लेकिन मैं इससे बहुत परिचित नहीं हूं। मॉकिंग चमकती है जब आपकी कक्षाएं एक * इंटरफ़ेस * और * कंक्रीट कक्षा * के आधार पर एक दूसरे पर निर्भरता व्यक्त करती हैं। –

1

मुझे नहीं पता कि परीक्षण में नकली वस्तुओं का उपयोग करने के बारे में सीखने के लिए आप कितने दूर गए हैं, इसलिए मैं एक संक्षिप्त विवरण लिखूंगा, फिर आपको उस लेख की दिशा में इंगित कर सकता हूं जो उपयोगी हो सकता है आप। मॉक ऑब्जेक्ट्स का उपयोग बाह्य निर्भरताओं को प्रतिस्थापित करने के लिए यूनिट परीक्षण में किया जाता है, जो उस स्थिति में शामिल होना कठिन होता है जिसे आप अपने परीक्षण के लिए चाहते हैं। मौजूद विभिन्न मॉकिंग फ्रेमवर्क आपको "नकली" ऑब्जेक्ट्स बनाने के लिए तंत्र प्रदान करते हैं जो इन निर्भरताओं की जगह लेते हैं। ये नकली वस्तुएं आपके कोड से आने वाली कॉल का ट्रैक रखती हैं और आपको बाद में इन इंटरैक्शन के बारे में दावा करने की अनुमति देती हैं। नकली वस्तुओं के बारे में एक प्रसिद्ध लेख है और वे कैसे "स्टब्स" से संबंधित हैं, बाहरी निर्भरताओं को सरल बनाने के लिए एक और आम परीक्षण रणनीति। यह मार्टिन Fowler द्वारा लिखा गया था और यहां पाया जा सकता: http://www.michaelminella.com/testing/unit-testing-with-junit-and-easymock.html

:

http://martinfowler.com/articles/mocksArentStubs.html

+0

क्या आप रचनाकारों का मज़ाक उड़ा सकते हैं क्योंकि वे विधियों नहीं हैं, मैं अभी भी सब कुछ समझने के लिए लड़ रहा हूं। – London

+0

नहीं, क्लास स्तर पर मॉकिंग किया जाता है, इसलिए मॉकिंग फ्रेमवर्क आपके लिए "प्रॉक्सी" (यानी, नकली) ऑब्जेक्ट बनाने में संभाल लेगा। ध्यान रखें कि यह ऑब्जेक्ट उस मकसद के व्यवहार को लागू नहीं करता है जो यह मजाक कर रहा है। इसका उद्देश्य है कि इसके साथ बातचीत का ट्रैक रखें और आपको इन इंटरैक्शन को सत्यापित करने दें, जैसा कि आपने उन्हें उम्मीद की थी। –

+0

आपकी व्याख्या के लिए धन्यवाद, मैं इन तरीकों में से कुछ का परीक्षण कैसे कर सकता हूं? – London

2

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

एक सीधे परीक्षण (मैं तुम्हें JUnit 4 का उपयोग कर रहे संभालने कर रहा हूँ हो सकता है - अपने कोड JUnit 3 का एक अजीब मिश्रण और 4

@Test 
public void sizeIs0WhenEmpty() 
{ 
    Map<Integer, String> map = Collections.emptyMap(); 
    Cache cache = new Cache(map) 
    assertEquals(0, cache.size()); 
} 
साथ मजाक उड़ाता है यह होगा

(यह मानते हुए नकली कोड है सही - मैं JMock का उपयोग नहीं करते)

@Test 
public void sizeIs0WhenEmpty() 
{ 
    context.checking(new Expectations() {{ 
        atLeast(1).of(mockMap).size(); 
        will(returnValue(0)); 
        }}); 
    assertEquals(0, cache.size()); 
} 

दोनों ही मामलों में आप सेटअप नक्शे की स्थापना गुण आप परीक्षण करने के लिए और उसके बाद जाँच लें कि कैश एक ही गुण है (के रूप में यह है चाहता हूँ के लिए कर प्रणाली एक सीधा प्रतिनिधि)

मैं आपको जारी रखने से पहले about JUnit पढ़ने की सलाह दूंगा।

4

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

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

किसी भी व्यक्ति को डिस्काउंट करें जो आपको बताता है कि यह फ़ाइल सिस्टम के खिलाफ परीक्षण करने के बारे में सब कुछ तेज़ी से बढ़ता है।

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