mockito tutorial mockito framework
मॉकिटो फ्रेमवर्क के लिए एक पूर्ण गाइड: हैंड्स-ऑन मॉकिटो ट्यूटोरियल
एप्लिकेशन को इंस्टाग्राम पोस्ट को मुफ्त में शेड्यूल करें
इकाई परीक्षण एक सरल अभी तक प्रभावी तकनीक है जो कोड को भेजे जाने वाले विश्वास का एक अच्छा स्तर प्राप्त करने के लिए है।
इसके अलावा, यह कोड के हर टुकड़े के साथ प्रतिगमन के मुद्दों से बचता है जो चेक इन हो जाता है।
सूक्ष्म सेवाओं की तरह की वास्तुकला (और यहां तक कि बुनियादी डेटाबेस कॉलों को शामिल करने के लिए सरल संरचना के लिए), सीधी इकाई परीक्षण पर्याप्त नहीं है। हमें निर्भरता का मजाक उड़ाने और परीक्षण के तहत विधि के वास्तविक तर्क का परीक्षण करने की आवश्यकता है।
इस श्रृंखला में सभी मॉकिटो ट्यूटोरियल की सूची:
ट्यूटोरियल # 1: यूनिट टेस्टिंग में मॉकिंग के लिए मॉकिटो फ्रेमवर्क (यह ट्यूटोरियल)
ट्यूटोरियल # 2: मॉकिटो में मोक्स और स्पाइज बनाना
ट्यूटोरियल # 3: मॉकिटो द्वारा प्रदान किए गए विभिन्न प्रकार के मिलान
ट्यूटोरियल # 4: मॉकिटो का उपयोग करते हुए मॉकिंग प्राइवेट, स्टेटिक और शून्य तरीके
ट्यूटोरियल # 5: शीर्ष 12 मॉकिटो साक्षात्कार प्रश्न
******************************* *******************
इस मॉकिटो श्रृंखला में ट्यूटोरियल का अवलोकन
ट्यूटोरियल # | आप क्या सीखेंगे |
---|---|
ट्यूटोरियल # 1: | यूनिट टेस्टिंग में मॉकिंग के लिए मॉकिटो फ्रेमवर्क मॉकिटो के साथ मॉकिंग सीखें - कोड उदाहरणों के साथ शुरुआती के लिए एक व्यापक मॉकिटो ट्यूटोरियल। यूनिट टेस्टिंग में मॉकिंग के लिए मॉकिंग फ्रेमवर्क जानें। |
ट्यूटोरियल # 2: | मॉकिटो में मोक्स और स्पाइज बनाना मोक्स और जासूस टेस्ट डबल्स के प्रकार हैं, जो यूनिट टेस्ट लिखने में सहायक हैं। दोनों को इस मॉकिटो स्पाई ट्यूटोरियल में कोड उदाहरणों के साथ समझाया गया है। |
ट्यूटोरियल # 3: | मॉकिटो द्वारा प्रदान किए गए विभिन्न प्रकार के मिलान मॉकिटो द्वारा प्रदान किए गए विभिन्न प्रकार के मिलानों का उपयोग करना सीखें। माचिस वाइल्डकार्ड की तरह होते हैं जहां एक विशिष्ट इनपुट / आउटपुट के बजाय, आप इनपुट की एक श्रृंखला निर्दिष्ट करते हैं। मॉकिटो में तर्क और सत्यापन दो प्रकार के मिलान हैं जिन्हें यहां विस्तार से बताया गया है। |
ट्यूटोरियल # 4: | मॉकिटो का उपयोग करते हुए मॉकिंग प्राइवेट, स्टेटिक और शून्य तरीके उदाहरण के लिए मॉकिटो में मॉकिंग प्राइवेट, स्टेटिक और शून्य विधियां सीखें। यूनिट परीक्षण ढांचे PowerMockito द्वारा निजी और स्थैतिक तरीकों का मजाक बनाना सीखें। |
ट्यूटोरियल # 5: | शीर्ष 12 मॉकिटो साक्षात्कार प्रश्न नमूना कोड उदाहरणों के साथ मॉकिटो साक्षात्कार प्रश्न और उत्तर। यह आपको किसी भी मॉकिटो मॉकिंग फ्रेमवर्क साक्षात्कार को सफलतापूर्वक क्रैक करने में मदद करेगा। |
इस श्रृंखला में पहले ट्यूटोरियल के साथ शुरू करते हैं !!
आप क्या सीखेंगे:
- यूनिट परीक्षण में मॉकिंग
- टेस्ट डबल्स के प्रकार / श्रेणियां
- विभिन्न मॉकिंग फ्रेमवर्क
- सोर्स कोड
- निष्कर्ष
- अनुशंसित पाठ
यूनिट परीक्षण में मॉकिंग
मोक्स / स्टब्स एक ऐसा शब्द है जिसे लोग विशेष रूप से यूनिट टेस्ट बनाते समय सुनते हैं।
तो, अनिवार्य रूप से मॉकिंग क्या है? सरल शब्दों में, यह कुछ भी नहीं है लेकिन एक नियंत्रित उदाहरण या निर्भरता के कार्यान्वयन को प्रदान करता है कि परीक्षण के तहत कोड इसके मूल तर्क का परीक्षण करने के लिए निर्भर करता है।
मैंने इसे एक नियंत्रित उदाहरण के रूप में उल्लेख किया है कि परीक्षण के तहत विधि या प्रणाली के लिए निर्भरता के व्यवहार को प्रोग्राम या नियंत्रित किया जा सकता है।
इसे आरेखीय रूप से समझाने के लिए, आइए किसी भी व्यावसायिक या ईकॉमर्स एप्लिकेशन का उदाहरण लें। लगभग हर प्रकार के आवेदन में मुख्य रूप से 3 परतें होती हैं यानी यूजर इंटरफेस, बिजनेस लेयर और डेटा एक्सेस लेयर (जो अंतर्निहित डेटा स्टोर से बात करता है)
उपरोक्त आरेख का उल्लेख करते हुए, बिजनेस लेयर की 3 निर्भरताएं हैं अर्थात् डेटा एक्सेस लेयर और 2 अन्य सेवाएं जो सेवा 1 और सेवा 2 हैं।
इसे इस तरह से देखें - गूगल मैप्स जैसे ऐप पर निर्भरता हो सकती है
- वास्तविक डेटा स्टोर जैसे MySQL या कोई अन्य SQL डेटाबेस जो मैप डेटा संग्रहीत करता है।
- CoordinateService जैसी बाहरी सेवा जो किसी स्थान के अक्षांश और देशांतर प्रदान करती है।
- ट्रैफ़िक सेवा जैसी बाहरी सेवा जो किसी दिए गए समन्वय जोड़ी के लिए वास्तविक समय की यातायात जानकारी प्रदान करती है।
इसलिए, यदि कोई इकाई परीक्षण का उपयोग करके मुख्य व्यवसाय तर्क को मान्य करने की कोशिश कर रहा है, जब तक और जब तक उनके पास इन निर्भरताओं के कार्यशील कार्यान्वयन नहीं होते हैं, तब तक परीक्षण नहीं चलाया जा सकता।
मोक्स इन स्थितियों में बचाव के लिए आते हैं, जहां आपकी निर्भरता कोई बात नहीं है और चल रही है या नहीं, आपको हमेशा अपने व्यावसायिक तर्क को चलाने के लिए गारंटी दी जाती है कि निर्भरता के लिए प्रोग्राम की प्रतिक्रिया के साथ परीक्षण के तहत कोड से बुलाया जा रहा है।
टेस्ट डबल्स के प्रकार / श्रेणियां
मॉक मूल रूप से 'टेस्ट डबल' का एक प्रकार है - यह एक टेक शब्दजाल है। 'टेस्ट डबल' का अर्थ अनिवार्य रूप से एक ऐसी वस्तु से होता है, जिसे समकक्ष वास्तविक वस्तु उदाहरण या निर्भरता से बदल दिया जाता है।
नीचे उल्लिखित विभिन्न प्रकार के टेस्ट डबल्स हैं:
# 1) नकली:
एक नकली एक वास्तविक निर्भरता के समान एक कार्यशील कार्यान्वयन है, इस तथ्य को छोड़कर कि यह परीक्षण के तहत प्रणाली के लिए स्थानीय है।
उदाहरण: वास्तविक उत्पादन DB को मारने के बजाय, परीक्षण डेटा संग्रह करने के लिए एक सरल संग्रह / इन-मेमोरी का उपयोग करता है।
# 2) स्टब्स:
जब परीक्षण के तहत प्रणाली से एक निर्भरता कहा जाता है, तो स्टब्स पूर्व-कॉन्फ़िगर प्रतिक्रियाएं हैं।
# 3) जासूस:
जैसा कि नाम से पता चलता है, इसका वास्तव में वास्तविक कार्य (निर्भरता) कुछ देखने वाले तंत्र के साथ है। कॉल पोस्ट करें, यह सत्यापित किया जा सकता है कि कॉल वास्तव में ट्रिगर किया गया था या नहीं मापदंडों के साथ।
# 4) मोज़ेक:
मोक्स ऑब्जेक्ट्स के विशेष उदाहरण हैं, जिन पर स्टबेड / पूर्व-कॉन्फ़िगर प्रतिक्रियाएं निर्दिष्ट की जा सकती हैं। तथ्य यह है कि नकली कहा जाता है परीक्षण में एक मुखर के रूप में सत्यापित किया जा सकता है।
उदाहरण के लिए:
एक रिपोर्ट जनरेटर फ़ंक्शन है जो निष्पादन के दौरान एक निर्दिष्ट पते पर एक ईमेल भेजता है।
जैसा कि हम वास्तविक ईमेल नहीं भेजना चाहते हैं, बार-बार, परीक्षण के दौरान, EmailService का मज़ाक उड़ाया जाता है (और ईमेल विधि जो ईमेल भेजती है वह तब कुछ भी नहीं करने के लिए कॉन्फ़िगर की जाती है)। परीक्षण के अंत में, हम बस यह सत्यापित कर सकते हैं कि ईमेल सेवा की ईमेल भेजने की विधि को नकली वस्तु के माध्यम से बुलाया गया है।
विभिन्न मॉकिंग फ्रेमवर्क
लगभग सभी भाषाएँ विभिन्न प्रकार के मॉकिंग फ्रेमवर्क प्रदान करती हैं। हम मॉकिटो का उपयोग करते हुए एक नमूना कोड लिखेंगे जो जावा के लिए एक खुला स्रोत मॉकिंग फ्रेमवर्क है।
नकली निर्भरता के साथ एक सरल इकाई परीक्षण की शारीरिक रचना। मान लीजिए, हम एक ऐसे एप्लिकेशन का परीक्षण करने की कोशिश कर रहे हैं, जो सभी विषयों में एक छात्र के लिए कुल अंकों की गणना करता है और इसे डीबी को लिखता है।
public void calculateSumAndStore(String studentId, int() scores) { int total = 0; for (int score: scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); }
अब अगर हम विधि के लिए एक इकाई परीक्षण लिखना चाहते हैं - गणनासुमस्टैंडोर, तो हमारे पास कुल स्टोर करने के लिए डेटाबेस का वास्तविक कार्यान्वयन नहीं हो सकता है। उस स्थिति में, हम कभी भी इस फ़ंक्शन का यूनिट परीक्षण नहीं कर पाएंगे।
लेकिन जगह में नकली के साथ, हम बस डेटाबेस सेवा के लिए एक नकली पास कर सकते हैं और बाकी के तर्क को मान्य कर सकते हैं
नमूना परीक्षण नीचे दिखाया गया है:
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores('student1', 220); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 220); }
हमने उपरोक्त परीक्षण में देखा, हमने मूल वर्ग के लिए (परीक्षण के तहत विधि के लिए) एक मॉकडेटाबेस ऑब्जेक्ट प्रदान किया है और हम मॉकडैटबेस ऑब्जेक्ट के लिए एक स्टब प्रतिक्रिया सेट कर रहे हैं - लाइन # 6 ऊपर (Mockito.doNothing ()। जब (mockDatabase) .updateScores ('student1', 220);)
ऊपर से ध्यान देने योग्य महत्वपूर्ण बिंदु हैं:
# 1) मॉक किए गए ऑब्जेक्ट को फ़ंक्शन निष्पादन के दौरान कॉल किए जाने वाले सभी तरीकों के लिए स्टैब्ड प्रतिक्रियाओं को सेटअप करने की आवश्यकता है।
#दो) स्टब निर्माण के दौरान निर्दिष्ट पैरामीटर विशिष्ट या सामान्य हो सकते हैं।
उदाहरण उपरोक्त मामले में - हमने 'छात्र 1' और 220 के रूप में अद्यतन विधि के लिए मापदंडों को निर्दिष्ट किया है क्योंकि हम जानते हैं कि ये सटीक इनपुट हैं जिनके साथ हमारी पद्धति कहा जाने वाला है।
# 3) सत्यापन के दौरान, हम निम्नलिखित सत्यापन कर रहे हैं:
- mockDatabase.updateScores विधि कहा जाता था।
- तर्क क्रमशः 'छात्र 1' और 220 थे।
- अद्यतन समय विधि को 1 बार कहा गया था।
अब इस परीक्षण कोड को थोड़ा बदलने की कोशिश करते हैं और देखते हैं कि क्या होता है:
मैं 'स्टूडेंट 1' से मॉक सेटअप में तर्क को किसी भी स्ट्रींग में बदल दूंगा (मॉकिटो किसी भी स्ट्रींग को नामांकित ()) और 220 को किसी भी इंटेगर को प्रदान करता है (मॉकिटो किसी भी आईएनआईटीएन () के नाम से एक मानक माचिस प्रदान करता है और यह किसी भी पूर्णांक मान से मेल खाता है)
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 220); }
परीक्षण को फिर से चलाने का प्रयास करें और परीक्षण अभी भी हरा होना चाहिए।
(अब सत्यापन / दावे को बदलने और किसी भी तर्क को बदलने की कोशिश करें।
चलो 220 से 230 में परिवर्तन करें। अब उम्मीद है कि परीक्षण विफल हो जाए क्योंकि यह अपेक्षित तर्क नहीं है कि डेटाबेसयूडेट को बुलाया गया होगा।
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 230); }
परीक्षण चलाने के बाद, नीचे दिखाए गए अनुसार त्रुटि लॉग का संदर्भ लें (यह स्पष्ट रूप से उल्लेख करता है कि वास्तविक तर्क अपेक्षित लोगों से मेल नहीं खाते हैं)।
तर्क (s) अलग हैं! चाहता था:
mockDatabase.updateScores ('student1', 230);
-> com.mocking.sampleMocks.StudentScoreUpdatesUnitTests.calculateSumAndStore_withValidInput_shouldCalculateAndUpdatesResultInDb (StudentScoreUpdatesUnitTests.java:37) पर।
वास्तविक आह्वान के अलग तर्क हैं:
mockDatabase.updateScores ('छात्र 1', 220);
सोर्स कोड
इंटरफ़ेस - IDatabase.java
public interface IDatabase { public void updateScores(String studentId, int total); }
टेस्ट के तहत कक्षा - StudentScoreUpdates.java
public class StudentScoreUpdates { public IDatabase databaseImpl; public StudentScoreUpdates(IDatabase databaseImpl) { this.databaseImpl = databaseImpl; } public void calculateSumAndStore(String studentId, int() scores) { int total = 0; for(int score : scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); } }
यूनिट टेस्ट क्लास - StudentScoreUpdatesUnitTests.java
public class StudentScoreUpdatesUnitTests { @Mock public IDatabase mockDatabase; public StudentScoreUpdates studentScores; @BeforeEach public void beforeEach() { MockitoAnnotations.initMocks(this); } @Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 230); } }
निष्कर्ष
अब तक हमने जो देखा वह जावा के मॉकिटो फ्रेमवर्क का उपयोग करते हुए मॉक सेटअप का एक बहुत ही बुनियादी और सीधा उदाहरण है।
लगभग 60-70% यूनिट परीक्षणों के लिए नकली परीक्षणों में एक समान संरचना होनी चाहिए। Mockito व्यापक मॉकिंग जरूरतों के लिए बहुत सारे उन्नत कॉन्फ़िगरेशन / समर्थन प्रदान करता है, निर्भरता इंजेक्शन का उपयोग करके मॉक इंस्टेंस को इंजेक्ट करता है, जासूसों को वास्तव में एक वास्तविक विधि कॉल पर जासूसी करने और कॉल सत्यापित करने के लिए प्रदान करता है।
हमारा आगामी ट्यूटोरियल मॉकिटो में मोक्स और जासूसों के कॉन्सेप्ट के बारे में अधिक बताएगा।
अनुशंसित पाठ
- शीर्ष 12 मॉकिटो साक्षात्कार प्रश्न (मॉकिंग फ्रेमवर्क साक्षात्कार)
- शुरुआती के लिए गहराई से ग्रहण ट्यूटोरियल
- Node.js टेस्टिंग फ्रेमवर्क कैसे सेटअप करें: Node.js ट्यूटोरियल
- स्पॉक फ्रेमवर्क के साथ यूनिट टेस्ट लिखना
- यूनिट परीक्षण, एकीकरण परीक्षण और कार्यात्मक परीक्षण के बीच अंतर
- सर्वश्रेष्ठ सॉफ्टवेयर परीक्षण उपकरण 2021 (क्यूए टेस्ट स्वचालन उपकरण)
- विनाशकारी परीक्षण और गैर विनाशकारी परीक्षण ट्यूटोरियल
- कार्यात्मक परीक्षण बनाम गैर-कार्यात्मक परीक्षण