जोर बनाम बनाम जोर


85

आज मैंने JUnit परीक्षण के बजाय JUnit अभिकथन के साथ एक JUnit परीक्षण का मामला देखा — क्या एक से दूसरे को पसंद करने के लिए महत्वपूर्ण फायदे या नुकसान हैं?


JUnit मुखर और जावा 'मुखर' कीवर्ड के बीच बिल्कुल तथ्यात्मक अंतर हैं। यह एक राय-आधारित प्रश्न नहीं है।
थॉमस डब्ल्यू

जवाबों:


95

JUnit4 में एक JUnit मुखर द्वारा फेंका गया अपवाद (वास्तव में त्रुटि) जावा assertकीवर्ड (AssertionError) द्वारा फेंकी गई त्रुटि के समान है , इसलिए यह बिल्कुल वैसा ही है जैसा assertTrueऔर स्टैक के अलावा आप अंतर नहीं बता सकते।

कहा जा रहा है कि, जेवीएम में एक विशेष ध्वज के साथ चलने के लिए जोर दिया जाता है, जिससे कई परीक्षण सिर्फ पास हो जाते हैं क्योंकि कोई व्यक्ति उस ध्वज के साथ सिस्टम को कॉन्फ़िगर करना भूल जाता है जब JUnit परीक्षण चलाए गए थे - अच्छा नहीं।

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

जावा में मुखर कीवर्ड का वास्तविक उद्देश्य रनटाइम पेनल्टी के बिना इसे बंद करने में सक्षम होना है। यह इकाई परीक्षणों पर लागू नहीं होता है।


26

मैं JUnit के दावे को पसंद करता हूं क्योंकि वे बिल्ट-इन assertस्टेटमेंट की तुलना में अधिक समृद्ध एपीआई की पेशकश करते हैं और इससे भी महत्वपूर्ण बात यह है कि इसके विपरीत स्पष्ट रूप से सक्षम होने की आवश्यकता नहीं है assert, जिसके लिए -eaजेवीएम तर्क की आवश्यकता होती है।


1
-eaहमेशा इसके लिए सक्षम है mvn test, इसकी कोई आवश्यकता नहीं है -ea। अमीर आपी, अच्छी पकड़। कभी-कभी मुझे लगता है कि एपीआई का परीक्षण में दुरुपयोग किया जाता है क्योंकि यह एप्लिकेशन का हिस्सा नहीं है (एपी में), मैं इसे सिर्फ समृद्ध तरीके से कॉल करना पसंद करता हूं।
ग्रिम

19

जब एक परीक्षण विफल हो जाता है तो आप अधिक जानकारी प्राप्त कर सकते हैं।

assertEquals(1, 2); का परिणाम java.lang.AssertionError: expected:<1> but was:<2>

बनाम

assert(1 == 2); का परिणाम java.lang.AssertionError

यदि आप संदेश तर्क जोड़ते हैं तो आप और भी अधिक जानकारी प्राप्त कर सकते हैं assertEquals


9
कोशिश करो assert 1==2: "1 is not 2";
ग्रिम

@PeterRader -ea सक्षम नहीं होने पर मुखर कीवर्ड का प्रयास करें। या बेहतर अभी तक, JUnit अभिकथनों का उपयोग करें जो हमेशा काम करते हैं।
थॉमस डब्ल्यू

1
@ThomasW -ea के सक्षम नहीं होने पर इसका परीक्षण नहीं किया जाता है। JUnit के दावे हमेशा काम नहीं करते हैं, वे केवल तभी काम करते हैं जब आप JUnit का उपयोग करने का निर्णय लेते हैं, जो एक रूपरेखा है, और मावेन पर निर्भरता के मामले में, एक मावेन निर्भरता जो केवल टेस्ट-स्कोप में होनी चाहिए। हमारे यहां दो पक्ष हैं: आप क्या पसंद करते हैं? पहला पक्ष : केवल परीक्षण-दायरे में निर्भरता के रूप में एक फ्रेमवर्क का उपयोग करें, जिसे डाउनलोड किया जाना चाहिए, कि ग्रहण आपको उन कक्षाओं में उपयोग करने दें जो src / main-folder में नहीं हैं, लेकिन अभ्यस्त संकलित नहीं हैं क्योंकि maven ने परीक्षण में केवल जूनट किया है- स्कोप या दूसरा पक्ष : बिल्ड-इन सामान का उपयोग करें।
ग्रिम

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

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

8

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


0

मैं कहूंगा कि यदि आप JUnit का उपयोग कर रहे हैं तो आपको JUnit के दावे का उपयोग करना चाहिए। assertTrue()मूल रूप से एक ही है assert, अन्यथा क्यों JUnit का उपयोग करें?


4
आप परीक्षण चल रहे ढांचे के लिए JUnit का उपयोग करेंगे। जोर वास्तव में JUnit आपको देता है मूल्य का एक छोटा सा हिस्सा है। JUnit के बिना Assertअधिक बॉयलरप्लेट की आवश्यकता होगी। assertJUnit के बिना आपको एक पूरी रूपरेखा लिखने की आवश्यकता होगी।
यिशै

1
यदि आप टूल का उपयोग करने जा रहे हैं तो मैं और अधिक कह रहा था, टूल का उपयोग करें। JUnit परीक्षण मामलों में नियमित रूप से पुराने मुखर कथन मूर्खतापूर्ण लगते हैं। वे मेरी राय में वास्तविक कोड के साथ हैं।
चीज़पल्स

1
@CheesePls "नियमित रूप से पुराने मुखर बयान" वास्तव में JUnit मुखर की तुलना में अधिक हाल के हैं।
dolmen

0

यदि आप विशेष रूप से चमकदार और नए सामान का उपयोग करते हैं, तो यह लागू नहीं हो सकता है, लेकिन मुखर जावा में 1.4SE तक पेश नहीं किया गया था। इसलिए, यदि आपको पुरानी तकनीक वाले वातावरण में काम करना चाहिए, तो आप संगतता कारणों से JUnit की ओर झुक सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.