JUnit Java और Kotlin इकोसिस्टम में यूनिट परीक्षण के लिए एक मानक फ्रेमवर्क है, जिसका उपयोग Android विकास में पृथक घटकों के स्तर पर व्यावसायिक तर्क की जांच के लिए किया जाता है। फ्रेमवर्क एनोटेशन, assertion विधियों और टेस्ट रनर का एक सेट प्रदान करता है जो स्वचालित रूप से परीक्षणों का पता लगाता और उन्हें निष्पादित करता है। JUnit.org के अनुसार, लाइब्रेरी JVM इकोसिस्टम में यूनिट परीक्षण के लिए सबसे लोकप्रिय समाधान बनी हुई है: 70% से अधिक Java प्रोजेक्ट किसी भी संस्करण में JUnit का उपयोग करते हैं।
मुख्य बिंदु
JUnit Java और Kotlin में दोहराए जाने योग्य यूनिट टेस्ट लिखने और चलाने के लिए एक ओपन-सोर्स फ्रेमवर्क है। यह xUnit इकोसिस्टम का हिस्सा है — Kent Beck और Erich Gamma की आर्किटेक्चर पर आधारित फ्रेमवर्क का एक परिवार — और Android Studio और IntelliJ IDEA में मानक परीक्षण उपकरण है।
JUnit का मुख्य कार्य कोड के एक छोटे टुकड़े (विधि, वर्ग) को अलग करना और नियंत्रित परिस्थितियों में उसके व्यवहार की जांच करना है। परीक्षण एनोटेशन के साथ सामान्य Java/Kotlin वर्गों के रूप में लिखे जाते हैं, और फ्रेमवर्क परीक्षण खोज, जीवनचक्र प्रबंधन और निष्पादन आँकड़ा संग्रह का ध्यान रखता है।
JUnit का पहला संस्करण 1997 में सामने आया और Test-Driven Development (TDD) प्रथाओं को लोकप्रिय बनाकर विकास दृष्टिकोण में मौलिक परिवर्तन लाया। आज, JUnit 5 (Jupiter) वर्तमान संस्करण है, जो Java 8+ और एक्सटेंशन का समर्थन करने वाली मॉड्यूलर आर्किटेक्चर के साथ पूरी तरह से पुनः डिज़ाइन किया गया है।
JUnit निष्पादन का तंत्र Test Runner पैटर्न पर आधारित है, जो classpath को स्कैन करता है, @Test एनोटेशन वाली विधियों को ढूँढता है, परीक्षण वर्ग का एक इंस्टेंस बनाता है और विधियों को एक विशिष्ट क्रम में चलाता है। Test Runner जीवनचक्र का प्रबंधन करता है: BeforeAll → BeforeEach → Test → AfterEach → AfterAll।
JUnit प्रत्येक परीक्षण विधि को एक अलग वर्ग इंस्टेंस में लपेटता है, जो परीक्षणों के बीच पृथक्करण सुनिश्चित करता है। इसका मतलब है कि वर्ग के फ़ील्ड विभिन्न @Test विधियों के बीच स्थिति बनाए नहीं रखते — प्रत्येक परीक्षण एक साफ़ ऑब्जेक्ट से शुरू होता है।
JUnit में सबसे सरल परीक्षण @Test एनोटेशन वाली एक विधि है जो परीक्षण के तहत कोड को कॉल करती है और assertion के माध्यम से परिणाम की जांच करती है। यदि assertion विफल होता है, तो परीक्षण विफल माना जाता है और JUnit त्रुटि की रिपोर्ट करता है।
@Test
void additionShouldReturnCorrectSum() {
var calculator = new Calculator();
var result = calculator.add(2, 3);
assertEquals(5, result);
}
Test Runner स्वचालित रूप से ऐसी विधि ढूँढता है, उसे चलाता है और परिणाम की रिपोर्ट करता है। यदि विधि कोई अपवाद नहीं फेंकती — परीक्षण पास होता है (green). यदि कोई assertion विफल होता है — परीक्षण फेल होता है (red).
JUnit में एनोटेशन यह निर्धारित करते हैं कि परीक्षण कोड कब और कैसे निष्पादित होना चाहिए। JUnit 5 में, एनोटेशन org.junit.jupiter.api पैकेज में स्थित हैं और सभी चरणों को कवर करते हैं: डेटा तैयारी, परीक्षण निष्पादन, संसाधन सफाई।
| एनोटेशन | उद्देश्य | निष्पादन |
|---|---|---|
| @Test | परीक्षण विधि को चिह्नित करता है | प्रति कॉल एक बार |
| @BeforeEach | प्रत्येक परीक्षण से पहले सेटअप | प्रत्येक @Test से पहले |
| @BeforeAll | एक बार वर्ग आरंभीकरण | सभी परीक्षणों से पहले एक बार |
| @AfterEach | प्रत्येक परीक्षण के बाद सफाई | प्रत्येक @Test के बाद |
| @AfterAll | एक बार वर्ग समापन | सभी परीक्षणों के बाद एक बार |
| @DisplayName | मानव-पठनीय परीक्षण नाम | सजावट |
एक उचित जीवनचक्र वाली पूर्ण परीक्षण वर्ग पर विचार करें। setUp विधि प्रत्येक परीक्षण से पहले Calculator का एक नया इंस्टेंस बनाती है, और tearDown संसाधनों को मुक्त करती है — उदाहरण के लिए, फ़ाइल डिस्क्रिप्टर या डेटाबेस कनेक्शन बंद करना।
class CalculatorTest {
private Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
void subtractionShouldReturnCorrectResult() {
int result = calculator.subtract(10, 4);
assertEquals(6, result);
}
@AfterEach
void tearDown() {
calculator.reset();
}
}
Assertions स्थैतिक विधियाँ हैं जो वास्तविक परिणाम की अपेक्षित परिणाम से तुलना करती हैं और बेमेल होने पर अपवाद फेंकती हैं। JUnit 5 org.junit.jupiter.api.Assertions वर्ग प्रदान करता है जिसमें विभिन्न जांच परिदृश्यों के लिए 25 से अधिक विधियाँ हैं — सरल मान तुलना से लेकर टाइमआउट जांच और समूहित assertions तक।
assertThrows विधि विशेष ध्यान देने योग्य है, जो यह जांचने की अनुमति देती है कि कोड त्रुटि स्थितियों — शून्य से भाग, null पास करना, सीमा से अधिक — को सही ढंग से संभालता है।
@Test
void divisionByZeroShouldThrowException() {
Calculator calc = new Calculator();
ArithmeticException exception = assertThrows(
ArithmeticException.class,
() -> calc.divide(10, 0)
);
assertEquals("Cannot divide by zero", exception.getMessage());
}
पैरामीटराइज्ड टेस्ट एक ही परीक्षण विधि को तर्कों के विभिन्न सेटों के साथ चलाने की अनुमति देते हैं। JUnit 5 में, यह @ParameterizedTest एनोटेशन को डेटा स्रोत — @ValueSource, @CsvSource, @MethodSource या @EnumSource — के साथ संयोजित करके किया जाता है।
यह दृष्टिकोण कोड पुनरावृत्ति को मौलिक रूप से कम करता है: विभिन्न मानों के लिए दस समान परीक्षणों के बजाय, एक पैरामीटराइज्ड विधि लिखी जाती है। Google Testing Blog के अनुसार, पैरामीटराइजेशन कवरेज खोए बिना परीक्षण कोड की मात्रा को 40–60% तक कम कर देता है।
@CsvSource एनोटेशन परीक्षण में अल्पविराम-पृथक कई पंक्तियाँ भेजता है। प्रत्येक पंक्ति एक परीक्षण रन के अनुरूप होती है। JUnit स्वचालित रूप से स्ट्रिंग मानों को आवश्यक प्रकारों — int, long, String और अन्य — में परिवर्तित करता है।
@ParameterizedTest
@CsvSource({
"1, 1, 2",
"2, 3, 5",
"10, 20, 30",
"-1, 1, 0"
})
void additionWithMultipleInputs(int a, int b, int expected) {
assertEquals(expected, a + b);
}
जब इनपुट डेटा सरल संख्याओं या स्ट्रिंग्स से अधिक जटिल होता है, तो @MethodSource का उपयोग किया जाता है। यह एक स्थैतिक विधि को संदर्भित करता है जो तर्कों का Stream लौटाती है — उदाहरण के लिए, Arguments का Stream या DAO परत के परीक्षण के लिए User ऑब्जेक्ट्स का Stream।
Android विकास में, JUnit का उपयोग AndroidX Test के साथ किया जाता है, जो Activity, Content Provider और अन्य Android घटकों के परीक्षण के लिए एक्सटेंशन प्रदान करता है। JUnit बिना एमुलेटर के JVM पर निष्पादित यूनिट टेस्ट संभालता है, जबकि AndroidX Test डिवाइस पर इंस्ट्रुमेंटेड टेस्ट संभालता है।
Android प्रोजेक्ट में JUnit 5 जोड़ने के लिए, मॉड्यूल-स्तरीय build.gradle में org.junit.jupiter:junit-jupiter निर्भरता शामिल करना पर्याप्त है। AGP Gradle प्लगइन मानक Test Runner के माध्यम से JVM पर JUnit 5 परीक्षण चलाने का समर्थन करता है।
// build.gradle.kts
android {
testOptions {
unitTests.isIncludeAndroidResources = true
}
}
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.11.0")
testImplementation("androidx.test:core-ktx:1.6.1")
}
व्यवहार में, JUnit का उपयोग अक्सर ViewModel और रिपॉजिटरी — उन परतों के परीक्षण के लिए किया जाता है जिन्हें Android संदर्भ या एमुलेटर की आवश्यकता नहीं होती। ऐसा परीक्षण मिलीसेकंड में चलता है और समय बर्बाद किए बिना सैकड़ों बार निष्पादित किया जा सकता है।
JUnit 5 (Jupiter) केवल एक नया संस्करण नहीं है, बल्कि एक पूरी तरह से पुनः डिज़ाइन किया गया प्लेटफ़ॉर्म है जो तीन मॉड्यूल में विभाजित है: JUnit Platform (JVM पर परीक्षण निष्पादन), JUnit Jupiter (परीक्षण लिखने के लिए API), और JUnit Vintage (JUnit 4 के साथ पिछड़ी संगतता)। यह मॉड्यूलरिटी विभिन्न Test Engine — उदाहरण के लिए, Kotlin के लिए Spek या TestNG — को जोड़ने की अनुमति देती है।
| विशेषता | JUnit 4 | JUnit 5 |
|---|---|---|
| पैकेज | org.junit | org.junit.jupiter |
| मूल एनोटेशन | @Test (junit.framework से) | @Test (org.junit.jupiter.api से) |
| Before/After | @Before, @After, @BeforeClass | @BeforeEach, @AfterEach, @BeforeAll |
| पैरामीटराइज्ड | @RunWith(Parameterized.class) | @ParameterizedTest + @ValueSource |
| एक्सटेंशन | @Rule, @ClassRule | @ExtendWith, अधिक लचीला API |
| Java न्यूनतम | Java 5 | Java 8+ |
JUnit 4 से JUnit 5 में माइग्रेट करने के लिए सभी परीक्षणों को फिर से लिखने की आवश्यकता नहीं है — बस JUnit Vintage Engine जोड़ें और पुराने परीक्षण काम करते रहेंगे। नए परीक्षणों को JUnit 5 के साथ लिखने की सिफारिश की जाती है ताकि एक्सटेंशन, लैम्ब्डा assertions और अंतर्निहित पैरामीटराइजेशन समर्थन का लाभ उठाया जा सके।
अक्सर पूछे जाने वाले प्रश्न
JUnit परीक्षण लिखने और चलाने के लिए एक फ्रेमवर्क है, जबकि Mockito मॉक ऑब्जेक्ट बनाने के लिए एक लाइब्रेरी है। इनका उपयोग एक साथ किया जाता है: JUnit परीक्षण निष्पादन का प्रबंधन करता है, और Mockito परीक्षण के तहत वर्ग की निर्भरताओं को बदलता है।
हाँ, JUnit 5 Android प्रोजेक्ट्स के साथ पूरी तरह से संगत है। यूनिट टेस्ट के लिए, build.gradle में junit-jupiter निर्भरता जोड़ना पर्याप्त है। इंस्ट्रुमेंटेड टेस्ट AndroidX Test Runner के माध्यम से काम करते रहते हैं।
न्यूनतम रूप में, विधि से पहले एक @Test एनोटेशन पर्याप्त है। आरंभीकरण और सफाई के लिए @BeforeEach और @AfterEach की अनुशंसा की जाती है, लेकिन वे अनिवार्य नहीं हैं।
Test Runner JUnit का एक घटक है जो classpath को स्कैन करता है, @Test एनोटेशन वाली विधियों को ढूँढता है, परीक्षण वर्गों के इंस्टेंस बनाता है और परीक्षण चलाता है। JUnit 5 में, यह भूमिका JUnit Platform द्वारा कनेक्टेड Test Engine के साथ निभाई जाती है।
assertThrows(Class, Executable) का उपयोग करें — यह अपेक्षित अपवाद प्रकार और विधि कॉल के साथ लैम्ब्डा लेता है। JUnit जांच करता है कि अपवाद वास्तव में फेंका गया था और आगे की जांच के लिए उसे लौटाता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें