Java मध्ये युनिट चाचणी म्हणजे काय?
Java मध्ये JUnit शिकण्याआधी, युनिट चाचणी म्हणजे काय आणि ते इतके लोकप्रिय का आहे याचे थोडक्यात विहंगावलोकन करूया (जर तुम्हाला ही सामग्री आधीच माहित असेल तर, 'मी Java मध्ये JUnit चाचणी कशी लिहू?') वर जा. Java मधील युनिट चाचणी मोठ्या प्रमाणात सॉफ्टवेअर विकास अधिक कार्यक्षम आणि सहज बनवते. हे दोन्ही व्यक्तींना आणि कार्यसंघांना डीबगिंगपासून अगणित तास कमी करण्यास मदत करू शकते आणि सहयोग प्रक्रिया मोठ्या प्रमाणात सुव्यवस्थित करते.
https://junit.org/junit4/
युनिट टेस्टिंगची अत्यावश्यक कल्पना अशी आहे: वैयक्तिक वैशिष्ट्यांच्या अणु चाचण्या लिहा (ज्याला युनिट चाचण्या म्हणतात) आणि चाचणी केल्यानंतर आणि मागील कार्यांची खात्री केल्यावर हळूहळू अधिक वैशिष्ट्ये जोडा. ही एक अत्यंत सोपी पण शक्तिशाली कल्पना आहे. ही प्रक्रिया कशी दिसते याचे उदाहरण म्हणून, कल्पना करा की तुम्ही आभासी वैज्ञानिक कॅल्क्युलेटर तयार करत आहात.
+
स्पष्ट अंकगणित ऑपरेटर ( ,
-
,
x
, ) च्या वर
%
, या कॅल्क्युलेटरमध्ये प्रगत वैशिष्ट्ये असतील ज्यात कार्य करण्यासाठी इतर उप-वैशिष्ट्ये आवश्यक आहेत. घातांकांची गणना करण्यासाठी, तुमचा कॅल्क्युलेटर योग्यरित्या गुणाकार करण्यास सक्षम असणे आवश्यक आहे. म्हणून हे कॅल्क्युलेटर तयार करण्यासाठी आणि चाचणी करण्यासाठी एक युनिट चाचणी दृष्टीकोन असेल:
- अतिरिक्त कार्य लिहा. त्याची काळजीपूर्वक चाचणी करा, ते बदला, ते कार्य करेपर्यंत पुनरावृत्ती करा.
- वजाबाकी, गुणाकार, भागाकार कार्यांसाठी तेच करा.
- घातांकांसारखी अधिक प्रगत ऑपरेटर फंक्शन्स लिहिण्यासाठी हे बेस ऑपरेटर वापरा, नंतर त्या फंक्शन्सची चाचणी घ्या.
हे सुनिश्चित करते की इतर लहान उप-वैशिष्ट्ये तयार करणारी वैशिष्ट्ये केवळ त्यांच्या स्वत: च्या अधिकारात योग्यरित्या कार्य करत नाहीत परंतु त्यामध्ये दोषपूर्ण उपवैशिष्ट्ये नसतात. उदाहरणार्थ, मी घातांक फंक्शनची चाचणी करत असल्यास आणि काहीतरी चूक होत असल्यास, मला माहित आहे की बग बहुधा गुणाकार उपविशिष्टात नाही, कारण गुणाकार फंक्शन आधीच विस्तृतपणे तपासले गेले होते. हे मला बग शोधण्यासाठी बॅकट्रेस आणि तपासणी करण्यासाठी आवश्यक असलेल्या कोडची एकूण रक्कम काढून टाकते. आशेने, हे क्षुल्लक उदाहरण हे स्पष्ट करते की युनिट चाचणीच्या आसपासची विचार प्रक्रिया कशी तयार केली जाते. परंतु युनिट चाचणी उर्वरित सॉफ्टवेअर विकास प्रक्रियेशी कसा संवाद साधते? तुमच्याकडे आणखी गुंतागुंतीची वैशिष्ट्ये असल्यास, ज्यांना एकत्र काम करण्यास आणि संप्रेषण करण्यास सक्षम असणे आवश्यक आहे? अशी जटिल वैशिष्ट्ये एकत्रितपणे योग्यरित्या कार्य करू शकतात याची खात्री करण्यासाठी युनिट चाचणी अपुरी आहे. खरं तर, सॉफ्टवेअर चाचणीच्या चार स्तरांची ही फक्त पहिली पायरी आहे (मी कॅपिटल अक्षरे वापरतो कारण मी उद्योग मानक किंवा सॉफ्टवेअर चाचणीसाठी सर्वात सामान्य दृष्टीकोन संदर्भित करतो). शेवटचे तीन टप्पे आहेत
इंटिग्रेशन टेस्टिंग ,
सिस्टम टेस्टिंग आणि
स्वीकृती टेस्टिंग. या सर्वांचा अर्थ कदाचित तुम्हाला ते काय वाटते तेच आहे, परंतु मी स्पष्ट करू: वर नमूद केल्याप्रमाणे, “जटिल वैशिष्ट्य”, एकमेकांशी योग्यरित्या संवाद साधण्याची खात्री देण्यासाठी आम्ही काय करणार आहोत हे एकीकरण चाचणी आहे. (उदा., कॅल्क्युलेटर “3 + 7 * 4 - 2” हाताळू शकतो याची खात्री करणे) सिस्टम चाचणी विशिष्ट प्रणालीच्या एकूण डिझाइनची चाचणी करत आहे; उत्पादनामध्ये बर्याचदा जटिल वैशिष्ट्यांच्या अनेक प्रणाली एकत्रितपणे कार्यरत असतात, त्यामुळे तुम्ही या प्रणालींमध्ये गटबद्ध करा आणि त्यांची वैयक्तिकरित्या चाचणी करा. (उदा. जर तुम्ही आलेख कॅल्क्युलेटर बनवत असाल, तर तुम्ही प्रथम अंकगणितीय 'सिस्टम' तयार कराल जेणेकरुन संख्या हाताळा, ते इच्छेनुसार कार्य करेपर्यंत चाचणी करा, आणि नंतर पैसे काढण्यासाठी तुम्ही ग्राफिंग 'सिस्टम' तयार कराल आणि चाचणी कराल, जसे ते अंकगणित प्रणालीपासून तयार होईल). स्वीकृती चाचणी ही वापरकर्ता-स्तरीय चाचणी आहे; वापरकर्त्यांद्वारे (उदा., कॅल्क्युलेटरची चाचणी करणारे वापरकर्ते) स्वीकारण्यासाठी तयार उत्पादन तयार करण्यासाठी सर्व प्रणाली समक्रमितपणे कार्य करू शकतात का ते पाहत आहे. सॉफ्टवेअर डेव्हलपर काहीवेळा प्रक्रियेच्या या अंतिम टप्प्याकडे दुर्लक्ष करू शकतात, कारण कंपन्यांनी अनेकदा इतर कर्मचारी वापरकर्ता (बीटा) चाचण्या स्वतंत्रपणे तैनात केल्या आहेत.
मी Java मध्ये JUnit चाचणी कशी लिहू?
आता तुम्हाला युनिट चाचणीचे फायदे आणि मर्यादा यांची स्पष्ट कल्पना आहे, चला काही कोड पाहू! आम्ही JUnit नावाची एक लोकप्रिय Java चाचणी फ्रेमवर्क वापरणार आहोत (दुसरा लोकप्रिय आहे TestNG, जो तुम्हाला आवडल्यास तुम्ही देखील वापरू शकता. ते अगदी सारखेच आहेत, सिंटॅक्टिकली; TestNG JUnit द्वारे प्रेरित आहे).
आपण येथे JUnit डाउनलोड आणि स्थापित करू शकता . या उदाहरणाच्या कोडसाठी, आम्ही 'सायंटिफिक कॅल्क्युलेटर'चे उदाहरण पुढे चालू ठेवू ज्याचा मी आधी उल्लेख केला होता; आपले डोके गुंडाळणे खूप सोपे आहे आणि चाचणी कोड अतिशय सोपा आहे. पारंपारिक सराव म्हणजे तुमच्या प्रत्येक वर्गासाठी स्वतंत्र चाचणी वर्ग लिहिणे, म्हणजे आम्ही तेच करू. चला असे गृहीत धरू की या टप्प्यावर, आपल्याकडे
Math.java
सर्व गणित फंक्शन्स असलेली फाईल आहे (यासह
Math.add
), आणि आपण एक लिहित आहोत.
MathTests.java
त्याच पॅकेजमध्ये फाइल. आता इम्पोर्ट स्टेटमेंट्स आणि क्लास बॉडी सेट करूया: (संभाव्य ज्युनिट इंटरव्ह्यू प्रश्न: तुम्हाला तुमची ज्युनिट चाचणी कोठे ठेवावी आणि तुम्हाला तुमच्या स्त्रोत फाइल्स इंपोर्ट कराव्या लागतील की नाही हे विचारले जाईल. जर तुम्ही तुमचे चाचणी वर्ग त्याच पॅकेजमध्ये लिहित असाल तर तुमचे मुख्य वर्ग, नंतर तुम्हाला चाचणी वर्गातील तुमच्या स्रोत फाइल्ससाठी कोणत्याही आयात विधानांची आवश्यकता नाही. अन्यथा, तुम्ही तुमच्या स्रोत फाइल्स आयात करत असल्याची खात्री करा!)
import org.junit.jupiter.Test; //gives us the @Test header
import static org.junit.jupiter.api.Assertions.assertEquals; //less typing :)
public class MathTests {
//...
}
प्रथम आयात विधान आम्हाला
@Test
शीर्षलेख देते.
@Test
आम्ही प्रत्येक चाचणी फंक्शनच्या व्याख्येच्या शीर्षस्थानी थेट ' ' लिहितो , जेणेकरून JUnit ला कळेल की ही एकवचनी चाचणी आहे जी स्वतंत्रपणे चालविली जाऊ शकते. नंतर, मी तुम्हाला या शीर्षलेखाचा वापर करून विशिष्ट युनिट चाचण्या कशा चालवू शकता हे दर्शवेल. दुसरे इंपोर्ट स्टेटमेंट आम्हाला थोडेसे टाइपिंग वाचवते. आमच्या फंक्शन्सची चाचणी करण्यासाठी आम्ही जे प्राथमिक JUnit फंक्शन वापरतो ते आहे
Assert.assertEquals()
, जे दोन पॅरामीटर्स (वास्तविक मूल्य आणि अपेक्षित मूल्य) घेते आणि ते समान असल्याची खात्री करते.
assertEquals(...
हे दुसरे इंपोर्ट स्टेटमेंट असल्याने आम्हाला ते कोणत्या पॅकेजचा भाग आहे हे प्रत्येक वेळी निर्दिष्ट करण्याऐवजी फक्त ' ' टाईप करू देते . आता 2 + 2 खरोखर 4 आहे हे सत्यापित करण्यासाठी एक अतिशय सोपी चाचणी केस लिहूया!
import org.junit.jupiter.Test; // gives us the @Test header
import static org.junit.jupiter.api.Assertions.assertEquals; // less typing :)
public class MathTests {
@Test
public void add_twoPlusTwo_returnsFour(){
final int expected = 4;
final int actual = Math.add(2, 2);
assertEquals(“2+2 is 4”, actual, expected);
}
}
टेस्ट फंक्शनच्या प्रत्येक पाच ओळी आणि ते काय करतात ते पाहू या: ओळ 5: हे
@Test
हेडर स्पष्ट करते की खालील फंक्शनची व्याख्या
add_twoPlusTwo_returnsFour()
खरोखरच एक चाचणी फंक्शन आहे जी JUnit स्वतंत्रपणे चालवू शकते. ओळ 6: आमच्या चाचणी केससाठी ही फंक्शन स्वाक्षरी आहे. चाचणी प्रकरणे नेहमीच एकवचनी असतात; ते फक्त एक विशिष्ट उदाहरण तपासतात, जसे की 2+2=4. तुम्ही चाचणी करत असलेल्या फंक्शनचे नाव
[function]_[params]_returns[expected]()
कुठे आहे, तुम्ही चाचणी करत असलेल्या विशिष्ट उदाहरण पॅरामीटर्स आहेत आणि फंक्शनचे अपेक्षित रिटर्न व्हॅल्यू आहे. चाचणी फंक्शन्समध्ये जवळजवळ नेहमीच ' ' हा रिटर्न प्रकार असतो कारण संपूर्ण फंक्शनचा मुख्य मुद्दा म्हणजे चालवणे
[function]
[params]
[expected]
void
assertEquals
, जे तुमची चाचणी उत्तीर्ण झाली किंवा नाही हे कन्सोलवर आउटपुट करेल; तुम्हाला कोठेही परत करण्यासाठी इतर कोणत्याही डेटाची आवश्यकता नाही. ओळ 7: आम्ही
final
रिटर्न प्रकाराचे '' व्हेरिएबल घोषित करतो
Math.add (int)
, आणि त्याला नियमानुसार 'अपेक्षित' असे नाव देतो. त्याचे मूल्य आपल्याला अपेक्षित असलेले उत्तर आहे (4). ओळ 8: आम्ही
final
रिटर्न प्रकाराचे ' ' व्हेरिएबल घोषित करतो
Math.add (int)
आणि त्याला नियमानुसार 'वास्तविक' असे नाव देतो. त्याचे मूल्य याचा परिणाम आहे
Math.add(2, 2)
. ओळ 9: सुवर्ण रेषा. ही ओळ आहे जी वास्तविक आणि अपेक्षित यांची तुलना करते आणि आम्हाला सांगते की आम्ही परीक्षा उत्तीर्ण झालो तरच ते समान असतील. पास झालेले पहिले पॅरामीटर “2+2 is 4” हे चाचणी कार्याचे वर्णन आहे.
माझ्या फंक्शनला अपवाद असेल तर?
जर तुमच्या विशिष्ट चाचणी उदाहरणाने वास्तविक आणि अपेक्षित मूल्य समान असल्याचे प्रतिपादन करण्याऐवजी अपवाद सोडला, तर JUnit कडे हेडरमध्ये हे स्पष्ट करण्याचा एक मार्ग आहे
@Test
. खाली एक उदाहरण पाहू.
Math.java
आमच्याकडे कॉल केलेले फंक्शन आहे असे गृहीत धरून
Math.divide
, आम्हाला हे सुनिश्चित करायचे आहे की इनपुट 0 ने विभाजित केले जाऊ शकत नाहीत. त्याऐवजी,
Math.divide(a, 0)
कोणत्याही 'a' मूल्यासाठी कॉल करण्याचा प्रयत्न केल्यास अपवाद (
ArithmeticException.class
) टाकला पाहिजे. आम्ही हेडरमध्ये असे नमूद करतो:
import org.junit.jupiter.Test; // gives us the @Test header
import static org.junit.jupiter.api.Assertions.assertEquals; // less typing :)
public class MathTests {
@Test (expectedExceptions = ArithmeticException.class)
public void divide_byZero_throwsException() throws ArithmeticException{
Math.divide(1, 0);
}
}
तुमच्याकडे एकापेक्षा जास्त अपवाद असू शकतात
expectedExceptions
, फक्त तुमच्या अपवाद वर्गांची यादी करण्यासाठी कंस आणि स्वल्पविराम वापरण्याची खात्री करा, जसे की:
expectedException = {FirstException.class, SecondException.class, … }
मी Java मध्ये माझ्या JUnit चाचण्या कशा चालवू?
IntelliJ मध्ये JUnit कसे जोडायचे:
https://stackoverflow.com/questions/19330832/setting-up-junit-with-intellij-idea तुम्ही तुमचा प्रकल्प सामान्यपणे चाचण्या चालवता त्याप्रमाणे चालवू शकता. चाचणी वर्गात सर्व चाचण्या चालवल्याने त्या वर्णक्रमानुसार चालतील. JUnit 5 मध्ये, तुम्ही टॅग जोडून चाचण्यांना प्राधान्य देऊ शकता
@Order
. एक उदाहरण:
@TestMethodOrder(OrderAnnotation.class)
public class Tests {
…
@Test
@Order(2)
public void a_test() { … }
@Test
@Order (1)
public void b_test() { … }
…
}
जरी वर्णक्रमानुसार आणि कोडमध्ये
a_test()
आधी आले असले तरी , येथे आधी चालेल , कारण 1 क्रमाने 2 च्या आधी येतो. तर ते सर्व JUnit च्या मूलभूत गोष्टींसाठी आहे. आता, JUnit मुलाखतीचे काही सामान्य प्रश्न सोडवू आणि पुढे JUnit बद्दल आणखी काही जाणून घेऊया!
b_test()
b_test()
a_test()
JUnit मुलाखत प्रश्न (अतिरिक्त माहिती)
येथे मी सर्वात लोकप्रिय JUnit मुलाखत प्रश्न गोळा केले आहेत. तुमच्याकडे काही जोडायचे असल्यास - खाली दिलेल्या टिप्पण्यांमध्ये ते मोकळ्या मनाने करा.
प्रश्न: चाचणी आपोआप नापास होण्यासाठी तुम्ही तुमच्या चाचणी पद्धतीमध्ये कोणती पद्धत कॉल करू शकता? अ: अयशस्वी ("येथे त्रुटी वर्णन!"); प्रश्न: तुम्ही कुत्र्याच्या वर्गाची चाचणी घेत आहात; डॉग ऑब्जेक्टची चाचणी घेण्यासाठी, तुम्ही त्यावर चाचण्या चालवण्यापूर्वी तुम्हाला ते इन्स्टंट करणे आवश्यक आहे. त्यामुळे तुम्ही डॉग इन्स्टंट करण्यासाठी सेटअप() फंक्शन लिहा. सर्व चाचणी दरम्यान तुम्हाला हे फंक्शन फक्त एकदाच चालवायचे आहे. तुम्ही सेटअप() फंक्शन स्वाक्षरीच्या वर थेट काय ठेवले पाहिजे जेणेकरुन JUnit ला चाचण्या चालवण्याआधी setUp() चालवायचे असेल? A: @BeforeClass (@BeforeAll JUnit 5 मध्ये) प्रश्न:वर वर्णन केलेल्या सेटअप() फंक्शनचे फंक्शन सिग्नेचर काय असावे? A: सार्वजनिक स्थिर शून्य. @BeforeClass (@BeforeAll in JUnit 5) किंवा @AfterClass (@AfterAll JUnit 5) सह कोणतेही कार्य स्थिर असणे आवश्यक आहे. प्रश्न: तुम्ही डॉग क्लासची चाचणी पूर्ण केली आहे. तुम्ही void tearDown() फंक्शन लिहा जे डेटा साफ करते आणि प्रत्येक चाचणीनंतर कन्सोलसाठी माहिती प्रिंट करते. तुम्हाला हे कार्य प्रत्येक चाचणीनंतर चालवायचे आहे. प्रत्येक चाचणी चालवल्यानंतर ज्युनिटला tearDown() रन करणे माहित आहे म्हणून तुम्ही tearDown() फंक्शन स्वाक्षरीच्या वर थेट काय ठेवले पाहिजे? A: @After (@AfterEach JUnit 5 मध्ये)
GO TO FULL VERSION