बनाएं JUnit उदाहरण के साथ टेस्ट सूट: @RunWith @SuiteClasses

⚡ स्मार्ट सारांश

JUnit टेस्ट सूट कई क्लासों से टेस्ट केसों को एकत्रित करते हैं ताकि वे एक ही पास में एक साथ चल सकें, जो @RunWith(Suite.class) और @SuiteClasses एनोटेशन द्वारा संचालित होते हैं और एक सामान्य टेस्ट रनर क्लास के माध्यम से लॉन्च किए जाते हैं।

  • 🔘 उद्देश्य: कई क्लासों के ग्रुप टेस्ट को अलग-अलग लॉन्च करने के बजाय एक ही चलाने योग्य यूनिट में शामिल करें।
  • एनोटेशन @RunWith(Suite.class) निष्पादन को सौंपता है, जबकि @SuiteClasses उन सभी क्लासों को सूचीबद्ध करता है जिन्हें सूट को चलाना आवश्यक है।
  • चरण: टेस्ट क्लास लिखें, दोनों एनोटेशन वाली एक होल्डर क्लास जोड़ें, फिर इसे चलाएं। JUnitकोर रनर।
  • 🧪 उदाहरण: JunitTest.java फ़ाइल SuiteTest1 और SuiteTest2 को समूहबद्ध करती है, और कंसोल तीन सफल परीक्षणों की रिपोर्ट करता है।
  • JUnit 5: Jupiter प्लेटफॉर्म सूट इंजन पर रनर को @Suite के साथ-साथ @SelectClasses या @SelectPackages से बदल देता है।
  • 📌 नुकसान: खाली सुइट्स, छूटे हुए इंपोर्ट और एक सुइट क्लास जिसमें खुद के @Test मेथड होते हैं, अधिकांश विफलताओं का कारण बनते हैं।

बनाना JUnit @RunWith और @SuiteClasses एनोटेशन के साथ टेस्ट सूट

In JUnitएक टेस्ट सूट हमें सभी को एकत्रित करने की अनुमति देता है। परीक्षण के मामलों कई कक्षाओं को एक ही स्थान पर एकत्रित करें और उन्हें एक साथ चलाएं।

सूट टेस्ट चलाने के लिए, आपको नीचे दिए गए एनोटेशन का उपयोग करके एक क्लास को एनोटेट करना होगा:

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.class, test2.class…) या @Suite.SuiteClasses({test1.class, test2.class…})

उपरोक्त एनोटेशन के साथ, सूट में मौजूद सभी टेस्ट क्लास एक-एक करके चलने लगेंगी। सूट क्लास स्वयं खाली रहती है: यह केवल एनोटेशन के लिए एक होल्डर है, और रनर इन एनोटेशन को पढ़कर तय करता है कि क्या चलाना है।

टेस्ट सूट और टेस्ट रनर बनाने के चरण

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

चरण 1) एक सरल टेस्ट क्लास (जैसे MyFirstClassTest) बनाएं और उसमें एक मेथड जोड़ें जिस पर यह एनोटेशन लगा हो। @परीक्षा.

पहली क्लास में एक खाली टेस्ट मेथड है, जो यह साबित करने के लिए पर्याप्त है कि सूट इसे उठा लेता है:

MyFirstClassTest क्लास में Eclipse @Test एनोटेटेड myFirstMethod की घोषणा करना

चरण 2) जोड़ने के लिए एक और टेस्ट क्लास बनाएं (उदाहरण के लिए MySecondClassTest) और @Test एनोटेशन से युक्त एक मेथड बनाएं।

दूसरी श्रेणी का आकार बिल्कुल समान है, इसलिए इस सूट में एकत्रित करने के लिए दो अलग-अलग श्रेणियां हैं:

MySecondClassTest क्लास में Eclipse @Test एनोटेटेड mySecondMethod की घोषणा करना

चरण 3) टेस्टसुइट बनाने के लिए आपको सबसे पहले क्लास को @RunWith(Suite.class) और @SuiteClasses(class1.class, class2.class…) से एनोटेट करना होगा।

ध्यान दें कि टेस्टसुइटएक्ज़ैमल नामक सूट क्लास स्वयं कोई टेस्ट विधि घोषित नहीं करती है - सारी जानकारी दो एनोटेशन में ही निहित है:

TestSuiteExample को @RunWith(Suite.class) और @SuiteClasses एनोटेशन के साथ एनोटेट किया गया है, जिसमें MyFirstClassTest और MySecondClassTest नाम दिए गए हैं।

चरण 4) नीचे दिए गए अनुसार हमारे टेस्ट सूट को चलाने के लिए एक टेस्ट रनर क्लास बनाएं:

धावक एक साधारण है Java एक क्लास जिसमें एक मुख्य विधि है जो सूट क्लास को सौंपती है JUnitकोर:

टेस्ट रनर क्लास कॉलिंग JUnitTestSuiteExample पर Core.runClasses का उपयोग करना और विफलता सूची को प्रिंट करना

Code स्पष्टीकरण:

  • Code रेखा 8: क्लास टेस्ट के मुख्य मेथड को घोषित करना जो हमारे कोड को चलाएगा JUnit परीक्षण.
  • Code रेखा 9: टेस्ट केस निष्पादित करना JUnitCore.runClasses जो टेस्ट क्लास का नाम पैरामीटर के रूप में लेता है (ऊपर दिए गए उदाहरण में, आप चरण 3 में दिखाए गए TestSuiteExample.class का उपयोग कर रहे हैं)।
  • Code रेखा 11: परिणाम को फॉर लूप का उपयोग करके संसाधित करना और असफल परिणाम को प्रिंट करना।
  • Code रेखा 13: सफल परिणाम का मुद्रण करना।

आउटपुट: यह आउटपुट एक सफल परीक्षण को दर्शाता है जिसमें कोई विफलता नहीं है। tracजैसा कि नीचे दिया गया है:

Eclipse JUnit टेस्टसुइटउदाहरण के लिए शून्य त्रुटियों और शून्य विफलताओं के साथ 2/2 रन की रिपोर्टिंग देखें

हरी पट्टी इस बात की पुष्टि करती है कि सूट किस लिए है: एक लॉन्च, एक परिणाम दृश्य, और दोनों क्लासों की रिपोर्ट सूट नोड के अंतर्गत दी जाती है, न कि दो अलग-अलग रन में।

JUnit टेस्ट सूट उदाहरण

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

JunitTest.जावा

JunitTest.java एक साधारण क्लास है जिस पर निम्नलिखित एनोटेशन लगे हैं: @साथ चलाएं और @सूट एनोटेशन। आप सूट में कितनी भी क्लास को पैरामीटर के रूप में सूचीबद्ध कर सकते हैं, जैसा कि नीचे दिया गया है:

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.जावा

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

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.जावा

SuiteTest2.जावा यह एक और परीक्षण वर्ग है, जो इसके समान है। SuiteTest1.जावाइस क्लास में नीचे दिए गए संदेश को प्रिंट करने के लिए एक टेस्ट मेथड है। आप इस क्लास को सूट मेंबर के रूप में उपयोग करेंगे। JunitTest.जावा.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

उत्पादन

क्रियान्वित करने के बाद जूनिटटेस्ट.java फ़ाइल, जिसमें एक सूट शामिल है SuiteTest1.जावा और SuiteTest2.जावाआपको नीचे दिया गया आउटपुट मिलेगा। कंसोल दोनों क्लास द्वारा उत्पन्न संदेशों को प्रिंट करता है:

Eclipse JunitTest समाप्त होने के बाद दोनों सूट क्लास से प्रिंट किए गए संदेशों को कंसोल पर दिखाया गया है।

RSI JUnit यह व्यू, सूट क्लास के अंतर्गत समूहीकृत तीन सफल परीक्षण विधियों के समान रन को रिकॉर्ड करता है:

Eclipse JUnit SuiteTest1 और SuiteTest2 के विस्तार के साथ JunitTest के लिए रिपोर्टिंग रन 3/3 हरे रंग में दिखाई दे रहे हैं।

नोट: इस उदाहरण में कंसोल लेबल एक दूसरे के ऊपर हैं — SuiteTest1 द्वारा प्रिंट की गई स्ट्रिंग "Suite Test 2" है और SuiteTest2 द्वारा प्रिंट की गई स्ट्रिंग "Suite Test 1" है। मूल सूचियाँ अपरिवर्तित रूप से पुन: प्रस्तुत की गई हैं, इसलिए लेबल वैसे ही हैं जैसे लेखक ने लिखे थे; कक्षा का नाम पढ़ें। JUnit आउटपुट को स्रोत से मिलाते समय मुद्रित लेबल के बजाय दृश्य का उपयोग करें।

टेस्ट सूट कैसे बनाएं JUnit 5

JUnit 5 रनर्स को पूरी तरह से हटा देता है, इसलिए @RunWith(Suite.class) org.junit.jupiter पैकेज में मौजूद नहीं है। सूट्स को स्थानांतरित कर दिया गया है। JUnit प्लेटफ़ॉर्म, जो उन्हें एक अलग वस्तु में भेजता है जिसे कहा जाता है junit-प्लेटफ़ॉर्म-सूट-इंजनउस डिपेंडेंसी को जोड़ें, फिर एक क्लास को @Suite और सेलेक्टर एनोटेशन में से किसी एक के साथ एनोटेट करें।

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

चयनकर्ता एनोटेशन एकल @SuiteClasses सूची को विकल्पों के एक छोटे समूह से प्रतिस्थापित करते हैं:

टिप्पणी यह क्या चुनता है
@SelectClasses व्यक्तिगत परीक्षण वर्ग जिन्हें एक-एक करके नाम दिया जाता है, जो @SuiteClasses का सीधा प्रतिस्थापन है।
@SelectPackages नामित पैकेज और उसके सभी उप-पैकेजों में मौजूद प्रत्येक परीक्षण वर्ग।
@IncludeClassNamePatterns चयनित भाग के ऊपर एक नियमित अभिव्यक्ति फ़िल्टर लागू किया गया है।
@SuiteDisplayName रिपोर्ट में क्लास के नाम के स्थान पर एक पठनीय नाम दिखाया जाएगा।

व्यवहार में दो और अंतर महत्वपूर्ण हैं। JUnit 5 सूट क्लास @BeforeSuite और @AfterSuite विधियों को घोषित कर सकती है, जो पूरे सूट में एक बार चलती हैं, और JUnit ऊपर दिया गया उदाहरण 4 अभी भी निष्पादित होता है JUnit यह प्लेटफॉर्म पुराने इंजन के माध्यम से काम करता है, इसलिए इसे चालू रखने के लिए इस पृष्ठ पर मौजूद मूल कोड को दोबारा लिखने की आवश्यकता नहीं है।

लाभ और सीमाएँ JUnit टेस्ट सूट

एक सुइट एक समूह हैping तंत्र, न कि परीक्षण ढांचा इसकी अपनी विशेषताएं हैं, और यही बात इसे निर्धारित करती है कि यह किन कार्यों में अच्छा है और किन क्षेत्रों में यह उपयोगी नहीं रह जाता है।

फायदे

  • एक लॉन्च संबंधित कक्षाओं को एक साथ चलाता है, इसलिए एक स्मोक सेट या एक प्रतीपगमन सेट कमांड एक ही कमांड से शुरू होता है।
  • परिणाम दृश्य प्रत्येक वर्ग को एक ही सूट नोड के अंतर्गत समूहित करता है, जिससे साझा विफलता का पता लगाना आसान हो जाता है।
  • सदस्यता सूची कोड में मौजूद होती है, इसलिए इसकी समीक्षा और संस्करण किसी अन्य स्रोत फ़ाइल की तरह ही किया जाता है।
  • एक ही सूट क्लास को IDE से, या किसी रनर से लॉन्च किया जा सकता है। JUnitकोर से, या किसी बिल्ड टूल से।

सीमाओं

  • @SuiteClasses एक हार्ड-कोडेड सूची है, इसलिए जब तक कोई व्यक्ति सूट को संपादित नहीं करता, तब तक एक नई परीक्षण क्लास को चुपचाप छोड़ दिया जाता है।
  • यह सुइट कक्षाओं की सूची में दिए गए क्रम के अलावा किसी भी प्रकार की क्रम-निर्धारण गारंटी नहीं देता है।
  • सदस्य वर्गों के बीच कुछ भी साझा नहीं किया जाता है, इसलिए एक सुइट फिक्स्चर या बेस क्लास का विकल्प नहीं है।
  • बिल्ड टूल्स पहले से ही नामकरण परंपरा के आधार पर टेस्ट क्लास का पता लगा लेते हैं, जिससे कई परियोजनाओं में एक सूट की आवश्यकता नहीं रह जाती है।

बनाते समय होने वाली सामान्य त्रुटियाँ JUnit परीक्षण सूट

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

संदेश या लक्षण कारण फिक्स
आरंभीकरण त्रुटि: कोई चलाने योग्य विधियाँ नहीं हैं यह क्लास एक सामान्य टेस्ट क्लास की तरह चलती है, लेकिन इसमें केवल एनोटेशन होते हैं। @RunWith(Suite.class) जोड़ें ताकि डिफ़ॉल्ट रनर के बजाय सूट रनर कार्यभार संभाल ले।
प्रतीक नहीं मिल सका: क्लास Suite सूट का आयात अनुपस्थित है। Import org.junit.runners.Suite alongside org.junit.runner.RunWith.
सूट चलता है, लेकिन एक क्लास छूट जाती है। इस क्लास को कभी भी @SuiteClasses सूची में नहीं जोड़ा गया था। क्लास को स्पष्ट रूप से जोड़ें, या इसे @SelectPackages में ले जाएं। JUnit 5.
कंपाइलर द्वारा क्लास का नाम स्वीकार नहीं किया जाता है। @Runwith या @suiteClasses को गलत केसिंग के साथ टाइप किया गया था। Java एनोटेशन केस-सेंसिटिव होते हैं: @RunWith और @SuiteClasses को बिल्कुल वैसे ही लिखें।
सूट क्लास में मौजूद टेस्ट कभी नहीं चलते। सूट होल्डर में एक @Test विधि जोड़ी गई। होल्डर को खाली रखें और टेस्ट मेथड को एक मेंबर क्लास में ले जाएं।

एक बार पूरा लेख लिखें और उसे रखें।ping सटीक होना ही असली काम है। यदि सूची डिस्क पर मौजूद कक्षाओं से दूर चली जाती है, तो सूट हरे रंग की रिपोर्ट करता है जबकि उसका एक हिस्सा अध्याय परीक्षा सेट कभी निष्पादित ही नहीं होता, जो विफलता के सबसे शांत तरीकों में से एक है। सॉफ्टवेयर परिक्षण.

अक्सर पूछे जाने वाले प्रश्न

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

जी हां। रनर के लिए, सूट क्लास एक सामान्य क्लास ही होती है, इसलिए इसे किसी अन्य @SuiteClasses सूची में नाम देने से सूट आपस में जुड़ जाते हैं। छोटे मॉड्यूल सूट से बने शीर्ष-स्तरीय रिग्रेशन सूट के लिए नेस्टिंग उपयोगी होती है।

एआई सहायक डिस्क पर मौजूद परीक्षण कक्षाओं को पढ़ते हैं, उनकी तुलना @SuiteClasses सूची से करते हैं और उन कक्षाओं को चिह्नित करते हैं जिन्हें कभी जोड़ा ही नहीं गया। वे बार-बार होने वाली विफलताओं को भी समूहित करते हैं। tracमूल कारण के आधार पर विश्लेषण करने से, जब किसी मामले में एक साथ कई लाल चेतावनी रिपोर्ट आती हैं तो छंटनी की प्रक्रिया छोटी हो जाती है।

सह पायलट यह एनोटेशन जोड़ी को जल्दी से लिखता है, लेकिन यह अक्सर गड़बड़ कर देता है JUnit 4 और JUnit एक ही फ़ाइल में 5 इंपोर्ट। सुनिश्चित करें कि org.junit.runners.Suite और org.junit.platform.suite.api.Suite कभी भी एक साथ दिखाई न दें, क्योंकि इनमें से केवल एक ही आपके रनर से मेल खाता है।

टेस्ट स्कोप में junit-platform-suite-engine जोड़ें। @Suite और @SelectClasses एनोटेशन junit-platform-suite-api में मौजूद हैं, जिसे यह इंजन आर्टिफैक्ट ट्रांजिटिवली पुल करता है, इसलिए आमतौर पर एक ही डिपेंडेंसी पर्याप्त होती है।

आमतौर पर नहीं। पक्का और Gradle टेस्ट टास्क पहले से ही नामकरण पैटर्न द्वारा टेस्ट क्लास का पता लगाता है और उन सभी को चलाता है। एक सूट तब उपयोगी होता है जब आप किसी नाम वाले उपसमूह, जैसे कि स्मोक सेट, को चलाना चाहते हैं जो पूरे रन से छोटा हो।

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

एक चयन सूची के अंदर नहीं। इसे रखें JUnit विंटेज इंजन पर 4 श्रेणियां हैं और उनमें से एक का चयन करें। JUnit पैकेज के अनुसार 5 सूट, इसलिए दोनों इंजन एक ही प्रणाली के अंतर्गत चलते हैं JUnit एनोटेशन परिवारों को आपस में मिलाए बिना प्लेटफ़ॉर्म लॉन्च किया गया।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: