2012-10-20 18 views
18

तो, विधि तर्कों की जांच के लिए गुवा के पास अभी तक उपयोगी Preconditions है। लेकिन मुझे लगता है कि "पोस्टकंडिशन" कक्षा भी उचित होगी। या यह सिर्फ इसलिए है क्योंकि जावा दावा प्रदान करता है?गुवा के पास पोस्टकंडीशन क्यों नहीं है? इसके बजाय मैं क्या उपयोग कर सकता हूं?

चूंकि इस तरह की कक्षा मौजूद नहीं है, इसलिए मैथोड रिटर्न से पहले पोस्टॉन्डिशन की जांच करने के लिए "सर्वश्रेष्ठ" (अभ्यास) वैकल्पिक तरीका क्या है?

+1

यूनिट परीक्षण या जावा के 'assert' कथन – Cephalopod

उत्तर

12

मैं पोस्टकंडिशन को एन्कोड करने के लिए विधि के भीतर जावा assert कीवर्ड का उपयोग करता हूं।

यूनिट टेस्ट या पोस्टकंडिशन?

यूनिट परीक्षण और पोस्टकंडिशन विभिन्न उद्देश्यों की सेवा करते हैं।

एक इकाई परीक्षण में एक अभिकथन एक इनपुट वेक्टर के लिए एक विधि के परिणाम पर एक चेक प्रदान करता है। यह एक विशिष्ट मामले के लिए अपेक्षित परिणाम निर्दिष्ट एक ऑरैकल है।

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

अमरूद पोस्टकंडिशन?

गुवा के पास पूर्व शर्त कक्षा क्यों है, लेकिन कोई पोस्टकंडीशन क्लास नहीं है, यहां मेरी समझ है।

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

पोस्टकंडिशन के लिए ऐसे कम आम मामले हैं। इसलिए विशिष्ट प्रकार के अपवादों को फेंकने के लिए शॉर्टेंड प्रदान करने की आवश्यकता कम है। एक असफल पोस्टकंडिशन एक HTTP 500 "आंतरिक सर्वर त्रुटि" की तरह है - हम सब जानते हैं कि हमारी विधि को निष्पादित करने में कुछ गड़बड़ हुई है।

(ध्यान दें कि पूर्ववर्ती की अमरूद की धारणा शुद्ध design-by-contract से काफी अलग है, जिसमें पूर्व शर्त मिलने पर कोई गारंटी नहीं है - यहां तक ​​कि उचित अपवाद भी नहीं दिया जाता है। गुवा की पूर्व शर्त कक्षा उपयोगी होती है एक सार्वजनिक एपीआई अधिक रक्षात्मक बनाने के लिए क्षमताओं)।

16

पोस्टिंग की स्थिति परीक्षण करना अनिवार्य होगा। जावा में पोस्ट-स्थितियों का परीक्षण करने का तरीका unit testing है।

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

+1

यूनिट परीक्षण का उपयोग मुख्य रूप से सार्वजनिक इंटरफ़ेस परीक्षण करता है। इसलिए उदाहरण के लिए निजी तरीकों का परीक्षण करना इतना सुविधाजनक नहीं होगा। उस मामले में मुझे लगता है कि पोस्टकंडिशन का कुछ रूप आसान होगा। ऐसा लगता है कि मुझे मूल जावा "जोर" का उपयोग करना है। –

+1

एक प्रश्न है * अगर * आपको [चाहिए] (http://stackoverflow.com/questions/3299405/how-should-i-test-private-methods-in-java#answer-3299443) परीक्षण 'निजी' विधियों में प्रथम स्थान। एक विकल्प दृश्यता को बदलना है, उदाहरण के लिए, 'संरक्षित' का उपयोग करना। –

+0

http://programmers.stackexchange.com/questions/153350/are-too-many-assertions-code-smell –

9

पूर्व शर्त और पोस्टकंडिशन बहुत अलग उद्देश्यों को पूरा करते हैं।

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

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

+0

गुवा पूर्व शर्त रिपोर्ट क्लाइंट (विधि उपयोगकर्ता) को बताते हुए अपवादों के संदर्भ में असफलताओं की रिपोर्ट करती है कि ग्राहक ने क्या गलत किया (अवैध तर्क, शून्य सूचक, सीमाओं से बाहर सूचकांक, अवैध राज्य)। जैसा कि आप कहते हैं, एक असफल पोस्टकंडिशन, इसके विपरीत, एक संकेत है कि विधि/सर्वर में कुछ गलत हो गया है। सबसे अधिक संभावना है कि, अलग-अलग अपवादों को फेंकने की आवश्यकता होगी, गुवा के उपयोग को प्रस्तुत करना। पोस्टकंडिशन की जांच के लिए प्रीकंडिशन कम उपयोगी है। – avandeursen

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

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