@BeforeClass एनोटेशन: जूनिट बनाम टेस्टएनजी

JUnit में @BeforeClass विधि static है, जबकि TestNG में non-static >? TestNG को JUnit पर सुधार के रूप में विकसित किया गया था, तो उन्होंने कार्यान्वयन के इस तरीके का चयन क्यों किया?

चूंकि @BeforeClass केवल एक बार चलता है, इसलिए इसे static इसे गैर स्थिर बनाने से अधिक समझ में आता है। टेस्टएनजी में भी, किस उदाहरण पर @BeforeClass विधि कहा जाता है? क्या कोई बेहतर समझने के लिए एक उदाहरण उद्धृत कर सकता है?

8
ध्यान दें कि टेस्टएनजी की एनोटेशन विकसित की गई थी पहले जुनीट; टेस्टएनजी जुनीट v3। * पर एक सुधार था, लेकिन वे अब लगभग बराबर लगते हैं कि जुनीट में एनोटेशन भी हैं (जुनीट <कोड> v4। * पर)।
जोड़ा लेखक jpaugh, स्रोत

2 उत्तर

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

जुनीट दृष्टिकोण सभी परीक्षण विधियों की स्वतंत्रता की गारंटी देता है। इससे कोई फर्क नहीं पड़ता, किस क्रम में वे दौड़ते हैं। इसके अतिरिक्त, सभी इंस्टेंस फ़ील्ड हमेशा प्रत्येक परीक्षण विधि के लिए समान होते हैं। डेटा शुरू करना, यह सभी परीक्षण विधियों के लिए आम है, कक्षा स्तर पर होना चाहिए, इस प्रकार यह स्थिर होना चाहिए। यही कारण है कि @BeforeClass विधि स्थिर क्यों होनी चाहिए।

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

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

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

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

एक विधि स्थैतिक बनाना इसे कक्षा के गैर स्थैतिक सदस्यों तक पहुंचने से रोकता है। लेकिन एक गैर स्थैतिक @BeforeClass विधि होने के साथ, आप वर्ग चरों तक पहुंचने के लिए आपको अधिक दायरा देकर, गैर स्थैतिक सदस्यों तक पहुंच सकते हैं। शायद यही कारण है कि testng ने @BeforeClass विधि को स्थिर होने के प्रतिबंध को हटा दिया।

1
जोड़ा
मेरा प्रश्न एक बार या उससे अधिक बार इसे आमंत्रित करने से संबंधित नहीं था। '@BeforeClass' परीक्षण केस (प्रत्येक टेस्ट केस नहीं) की शुरुआत में निष्पादित किया जाता है, इसलिए इसे किसी भी उदाहरण से जोड़ा नहीं जा सकता है। जुनीट प्रत्येक टेस्ट विधि के लिए कक्षा का एक नया उदाहरण बनाता है। चूंकि '@beforeclass' testNG में गैर स्थिर है, इसलिए इसे एक उदाहरण से जोड़ा जाना है। क्या इसका मतलब है कि testNG में, @beforeclass प्रत्येक परीक्षण के लिए निष्पादित किया जाता है? यदि नहीं, तो यह कैसे काम करता है?
जोड़ा लेखक dejavu, स्रोत
यह प्रत्येक परीक्षण मामले के लिए एक नया उदाहरण बनाता है: stackoverflow.com/a/3353183/808203
जोड़ा लेखक dejavu, स्रोत
@BeforeClass सिर्फ एक टिप्पणी है। जूनिट धावक को इस विधि के साथ एनोटेटेड सभी विधियों की सूची प्राप्त करने की आवश्यकता है और प्रत्येक परीक्षण को निष्पादित करने से पहले उन्हें निष्पादित करना होगा। Testng में भी @BeforeClass पूरे टेस्ट क्लास के लिए केवल एक बार निष्पादित किया जाता है। मेरे ज्ञान के लिए जुनीट @Test के साथ एनोटेटेड सभी विधियों को एकत्र करता है और उन्हें प्रतिबिंबित करता है। मुझे यकीन नहीं है कि क्या जूनिट वास्तव में हर टेस्ट केस के लिए एक नया उदाहरण बनाता है।
जोड़ा लेखक Shiva Kumar, स्रोत