2009-07-03 10 views
13

मैं वर्तमान में एक छोटी पुस्तकालय के लिए यूनिट परीक्षणों का एक कम या कम सेट सेट बनाने की कोशिश कर रहा हूं। चूंकि हम विभिन्न कार्यान्वयनों को अस्तित्व में रखने की अनुमति देना चाहते हैं, हम चाहते हैं कि यह परीक्षण सामान्य (ए) सामान्य हो, ताकि हम विभिन्न कार्यान्वयन और (बी) जितना संभव हो सके पूर्ण परीक्षण करने के लिए इसका पुन: उपयोग कर सकें। (बी) भाग के लिए मैं जानना चाहता हूं कि एनम प्रकारों के परीक्षण के लिए वहां कोई सर्वोत्तम अभ्यास है या नहीं। तो उदाहरण के लिए मेरे पास एक enum है:enum प्रकारों का परीक्षण कैसे करें?

public enum Month { 
    January, 
    February, 
    ... 
    December; 
} 

यहां मैं यह सुनिश्चित करना चाहता हूं कि सभी enum प्रकार वास्तव में मौजूद हैं। क्या यह भी जरूरी है? वर्तमान में मैं Hamcrests उपयोग कर रहा हूँ assertThat निम्नलिखित उदाहरण की तरह:

assertThat(Month.January, is(notNullValue())); 

एक लापता "जनवरी" enum एक संकलन समय त्रुटि जो एक निर्माण लापता enum प्रकार से ठीक कर सकते हैं में परिणाम होगा।

मैं जावा यहाँ का उपयोग कर रहा हूँ, लेकिन मुझे कोई आपत्ति नहीं है, तो आपका जवाब एक अलग भाषा के लिए है ..

संपादित करें:

mkato और मार्क हीथ के रूप में दोनों ने बताया है परीक्षण enums हो सकता है जरूरी नहीं है क्योंकि संकलक संकलित नहीं करेंगे जब आप एक एनम प्रकार का उपयोग कर रहे हैं जो वहां नहीं है। लेकिन मैं अभी भी उन enums का परीक्षण करना चाहता हूं क्योंकि हम एक अलग टीकेसी की तरह test.jar बनाना चाहते हैं जो विभिन्न कार्यान्वयन पर एक ही परीक्षण चलाएगा। तो मेरा सवाल इस तरह से अधिक था: enum प्रकारों का परीक्षण करने का सबसे अच्छा तरीका क्या है?

इस बारे में सोच करने के बाद थोड़ा और मैं करने के लिए ऊपर Hamcrest बयान बदल दिया है:

assertThat(Month.valueOf("January"), is(notNullValue())); 

यह बयान अब एक एनपीई फेंकता है जब जनवरी वहाँ नहीं है (अभी तक)। क्या इस दृष्टिकोण में कुछ गड़बड़ है?

उत्तर

17

enums के लिए, मैं केवल तभी परीक्षण करता हूं जब उनके पास वास्तव में विधियां हों। यदि यह आपके उदाहरण की तरह एक शुद्ध मूल्य-केवल enum है, तो मैं कहूंगा कि परेशान मत हो।

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

+0

मेरे पास एक enum है जिसमें एक तरीका है जिसे मैं परीक्षण करना चाहता हूं, मैं यूनिट परीक्षण में रूकी हूं और उस विधि के लिए टेस्ट केस लिखने का कोई तरीका नहीं समझ सकता, क्या आप कृपया मुझे एक उदाहरण प्रदान कर सकते हैं या इसे करने में मदद कर सकते हैं । – dirtydexter

+0

यदि "जोर दें (माह। जनवरी, है (नहीं NullValue());" ओपी के प्रश्न में आपके लिए एक उदाहरण पर्याप्त नहीं है, मुझे लगता है कि आप इसे एक अलग प्रश्न के रूप में पूछने से बेहतर हैं और आप जो परीक्षण करने की कोशिश कर रहे हैं उसका एक उदाहरण प्रदान कर रहे हैं। मुझे लगता है जैसे आपको जुनीट के साथ मदद की आवश्यकता हो सकती है। – aberrant80

+0

हाँ सही, बहुत बहुत धन्यवाद। – dirtydexter

3

यदि आप अपने कोड में सभी महीनों का उपयोग करते हैं, तो आपका आईडीई आपको संकलित करने नहीं देगा, इसलिए मुझे लगता है कि आपको इकाई परीक्षण की आवश्यकता नहीं है।

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

+0

यूनिट परीक्षणों का कोई ज्ञान नहीं है कि आपके महीनों का उपयोग कैसे किया जाएगा और भविष्य में उनका उपयोग कैसे किया जा सकता है इसके बारे में भी कम ज्ञान। इसका तात्पर्य है कि आपको उनके लिए यूनिट परीक्षण शामिल करना चाहिए, भले ही एप्लिकेशन वर्तमान में संकलित नहीं होगा यदि सभी महीने मौजूद नहीं हैं। चेतावनी: सुनिश्चित करें कि सरल जटिलताओं (जैसे कि विधियों के साथ enums) के बारे में चिंता करने से पहले अपनी जटिल वस्तुओं को यूनिट परीक्षणों द्वारा सही ढंग से कवर किया जाता है। –

4

आमतौर पर मैं कहूंगा कि यह अधिक है, लेकिन कई बार एनम्स के लिए यूनिट परीक्षण लिखने के कारण हैं।

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

8

मैं aberrant80 से सहमत हूं।

enums के लिए, मैं केवल तभी परीक्षण करता हूं जब उनके पास वास्तव में विधियां हों। यदि यह आपके उदाहरण की तरह एक शुद्ध मूल्य-केवल enum है, तो मैं कहूंगा कि परेशान नहीं है।

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

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

और सभी टेस्ट संचालित विकास के साथ, एम्स के तरीके के आसपास के परीक्षण आपके कोड बेस में बग की संख्या को कम करते हैं।

सरल उदाहरण

public enum Multiplier { 
    DOUBLE(2.0), 
    TRIPLE(3.0); 

    private final double multiplier; 

    Multiplier(double multiplier) { 
     this.multiplier = multiplier; 
    } 

    Double applyMultiplier(Double value) { 
     return multiplier * value; 
    } 

} 

public class MultiplierTest { 

    @Test 
    public void should() { 
     assertThat(Multiplier.DOUBLE.applyMultiplier(1.0), is(2.0)); 
     assertThat(Multiplier.TRIPLE.applyMultiplier(1.0), is(3.0)); 
    } 
} 
+0

मेरे पास एक enum है जिसमें एक तरीका है जिसे मैं परीक्षण करना चाहता हूं, मैं यूनिट परीक्षण में रूकी हूं और उस विधि के लिए टेस्ट केस लिखने का कोई तरीका नहीं समझ सकता, क्या आप कृपया मुझे एक उदाहरण प्रदान कर सकते हैं या इसे करने में मदद कर सकते हैं । – dirtydexter

+0

@dirtydexter उदाहरण के साथ अद्यतन उत्तर देखें। –

2

हैं, वास्तव में कुछ मान हैं उदाहरण के द्वारा आप परीक्षण कर सकते हैं:

for(MyBoolean b : MyBoolean.values()) { 
    switch(b) { 
    case TRUE: 
     break; 
    case FALSE: 
     break; 
    default: 
     throw new IllegalArgumentException(b.toString()); 
} 

for(String s : new String[]{"TRUE", "FALSE" }) { 
    MyBoolean.valueOf(s); 
} 

कोई निकाल देता है या एक मूल्य जोड़ देता है तो परीक्षण के कुछ विफल रहता है।

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