Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रणाली >> Android

मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका

मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका <पी> सियामक महमौदी

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

<पी> इस लेख में हम कार्रवाई में टीडीडी पर चर्चा करेंगे। <पी> संदर्भ एक Android विकास परिवेश है, इसलिए हम चरणों को प्रदर्शित करने के लिए एक नमूना प्रोजेक्ट के साथ कोटलिन और JUnit5 का उपयोग करेंगे। <पी> हालाँकि, यहां दिए गए निर्देशों और तकनीकों का अभ्यास अन्य प्रोग्रामिंग भाषाओं में भी किया जा सकता है।

आवश्यकताएँ

  • कोटलिन का बुनियादी ज्ञान
  • यूनिट परीक्षण लिखने का बुनियादी ज्ञान
  • मजाक और दावे का ज्ञान
<पी> हम प्रोग्रामिंग भाषा के रूप में कोटलिन और यूनिट परीक्षण लिखने के लिए JUnit5 का उपयोग करेंगे।

<पी> मॉकिटो का उपयोग मॉक और जासूसों के साथ काम करने के लिए किया जाएगा।

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

<पी> यदि उपरोक्त आपको ठीक लगता है, तो चलिए शुरू करते हैं।

टेस्ट संचालित विकास कैसे काम करता है

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका टीडीडी साइकिल <पी> विकास प्रक्रिया एक चक्र का अनुसरण करती है:

  1. एक असफल परीक्षा लिखना (गुलाबी वर्ग)।
  2. परीक्षा पास करने के लिए कोड लागू करना (हरा वर्ग)
  3. यह सुनिश्चित करते हुए कि परीक्षण लगातार पास होते रहें (हल्का हरा वर्ग)।
  4. आवश्यकतानुसार कोड (नीला वर्ग) को दोबारा तैयार करना।
  5. एक नया असफल परीक्षण लिखना (प्रवाह को फिर से शुरू करना)

एक असफल परीक्षा लिखना (पिंक स्क्वायर)

<पी> इस चरण में, आप यह वर्णन करके प्रारंभ करते हैं कि आप अपने कोड से क्या कराना चाहते हैं। <पी> कल्पना कीजिए कि आप यह जांचने के लिए अपने कोड का परीक्षण कर रहे हैं कि यह सही ढंग से व्यवहार करता है या नहीं। यह परीक्षण एक प्रश्न की तरह है जिसमें आप अपना कोड पूछते हैं, जैसे "क्या आप यह कार्य कर सकते हैं?" <पी> सबसे पहले, आपका कोड उत्तर नहीं जानता है, इसलिए आप एक परीक्षण लिखते हैं जो विफल हो जाना चाहिए क्योंकि आपका कोड अभी तक नहीं जानता है कि कार्य कैसे करना है। यह असफल परीक्षण एक गुलाबी चेतावनी संकेत की तरह है जो आपको बताता है कि कुछ सही नहीं है।

<पी> एक बार जब आप इस चरण को पूरा कर लेंगे, तो JUnit5 आपके द्वारा तैयार किए गए परीक्षणों से एक व्यापक रिपोर्ट तैयार करेगा। ये परीक्षण आपके काम का एक ठोस प्रतिनिधित्व के रूप में सामने आएंगे। <पी> अब, कल्पना करें कि आपका प्रोजेक्ट मैनेजर इन परीक्षण मामलों को उनकी कवरेज और सुविधा या उत्पाद पर आपकी समझ की सटीकता दोनों का आकलन करने के लिए पढ़ रहा है। इस परिप्रेक्ष्य को अपनाने से इस विकासात्मक चरण के महत्व की स्पष्ट समझ मिलती है।

<पी> अपना ध्यान तकनीकी पेचीदगियों से हटाकर सॉफ़्टवेयर के व्यवहार पर केंद्रित करें। <पी> बारीक तकनीकी पहलुओं में उलझने के बजाय, अपना ध्यान इस बात पर केंद्रित करें कि सॉफ्टवेयर कैसे काम करता है और उपयोगकर्ताओं और अन्य घटकों के साथ कैसे इंटरैक्ट करता है। <पी> परिप्रेक्ष्य में यह बदलाव आपको सॉफ़्टवेयर के इच्छित कार्यों और परिणामों को प्राथमिकता देने की अनुमति देता है, जिससे ऐसे परीक्षण होते हैं जो इसके वास्तविक दुनिया के व्यवहार को सटीक रूप से दर्शाते हैं। <पी> तकनीकी बारीकियों के बजाय व्यवहार पर ध्यान केंद्रित करके, आप यह सुनिश्चित करते हैं कि आपके परीक्षण सॉफ़्टवेयर के उद्देश्य और उपयोगकर्ता की अपेक्षाओं के साथ निकटता से संरेखित हों। <पी> कुछ मामलों में, हो सकता है कि आपको प्रति घटक कुछ से अधिक परीक्षण मामले न मिलें (जो उद्देश्य है:कम काम लेकिन लक्षित) और यह पूरी तरह से ठीक है, जब तक आप परियोजना की सभी व्यवहार संबंधी आवश्यकताओं को कवर करते हैं।

टिप्स

  • विशिष्ट बनें: स्पष्ट और विशिष्ट परीक्षण मामले लिखें जो आपके कोड के व्यवहार के एक पहलू पर ध्यान केंद्रित करें।
  • सरल शुरुआत करें:सबसे सरल परीक्षण केस से शुरू करें जो आपके लिए आवश्यक बुनियादी कार्यक्षमता को कवर करता है।
@Test fun `a sum is calculated from two input numbers`() {}
  • अर्थपूर्ण नामों का उपयोग करें:अपने परीक्षणों को वर्णनात्मक रूप से नाम दें ताकि उन्हें पढ़ने वाला कोई भी व्यक्ति जान सके कि परीक्षण क्या जाँच रहा है।
@Test fun `Font Ratio is fetched from data source INITIALLY`() {}

सामान्य गलतियों से बचना चाहिए

  • एक साथ बहुत अधिक परीक्षण करना: एक ही परीक्षण में अनेक चीज़ों का परीक्षण करने से बचें। इससे यह पहचानना कठिन हो सकता है कि क्या विफल हो रहा है।
// Don't do this
@Test fun `pixelSize fits the standart sizes while fontSize is bigger than minumum supported font size but matches the list of special levels of size`() {}
  • कार्यान्वयन विवरण पर भरोसा: ऐसे परीक्षण न लिखें जो कोड की आंतरिक कार्यप्रणाली से कसकर जुड़े हों। परीक्षणों को व्यवहार पर ध्यान केंद्रित करना चाहिए, न कि कार्यान्वयन पर।
// Don't do this
@Test fun `pixelSize is Long and Non-Null and fits the standart sizes then calculated font size is non-null and of type Dimention`() {}

परीक्षा पास करने के लिए कोड लागू करना (ग्रीन स्क्वायर)

<पी> अब जब आपका परीक्षण हो चुका है, तो अब समय आ गया है कि आप अपने कोड को सिखाएं कि कार्य को सही तरीके से कैसे किया जाए। <पी> आप वास्तविक कोड लिखते हैं जिससे परीक्षा उत्तीर्ण होनी चाहिए और आपका कोड प्रश्न का सही उत्तर देता है। <पी> जब आपका कोड परीक्षण में उत्तीर्ण हो जाता है, तो यह हरी बत्ती की तरह कहता है, "हाँ, मैं अब कार्य कर सकता हूँ!"। <पी> यह चरण यह सुनिश्चित करने के बारे में है कि आपका कोड समझता है और आप उससे जो समस्या पूछ रहे हैं उसे हल कर सकता है।

टिप्स

  • न्यूनतम कोड लिखें:सबसे सरल कोड लिखें जो असफल परीक्षा को उत्तीर्ण कर दे। आप यहां अति-इंजीनियरिंग से बचने के तरीके के बारे में अधिक पढ़ सकते हैं।
// Test Case 
@Test fun `Storage stores font ratio in key-value`() { 
 // Given
 val fontRatio = 2.0f
 val mockEditor = mockk<SharedPreferences.Editor>(relaxed = true)
 every { mockSharedPreference.edit() } returns mockEditor 
 every { mockEditor.putFloat(any(), any()) } returns mockEditor 
 every { mockEditor.apply() } just Runs 
 // When 
 storage.saveFontRatio(fontRatio) 
 // Then
 verify(exactly = 1) { 
 mockEditor.apply() 
 }
}
// Correct Implementation - Avoid extra implementation
class SharedPreferenceHelper( 
 private val sharedPreferences: SharedPreferences 
) { 
 fun saveFontRatio(fontRatio: Float) {
 sharedPreferences.edit().putFloat("font-ratio", fontRatio).apply() 
 } 
}
// Wrong Implementation 
class SharedPreferenceHelper(
 private val sharedPreferences: SharedPreferences
) { 
 fun saveFontRatio(fontRatio: Float) { 
 if (fontRatio <= 0.0f) 
 throw IllegalArgumentException("Font ratio must be greater than 0.0f") 
 storeValue(key = FONT_RATIO_KEY, value = fontRatio) 
} 
 private fun storeValue(key: String, value: Float){
 val editor = sharedPreferences.edit() editor.putFloat(key, value)
 editor.apply() 
 }
 fun getFontRatio(): Float { 
 return sharedPreferences.getFloat("font_ratio", 1.0f) } 
}
  • दोहराव से बचें: कोड दोबारा न दोहराएं. यदि आप खुद को कई स्थानों पर समान तर्क लिखते हुए पाते हैं, तो रीफैक्टरिंग पर विचार करें। इस चरण में प्राथमिक कोड सुधार किए जा सकते हैं, लेकिन यदि संशोधन का दुष्प्रभाव हो सकता है तो इसे अनदेखा करें।
class ... {
 override fun getDefaultFontSize(): Float {
 val zoomRatio = DEFAULT_SSPEED * DEFAULT_FONT_RATIO / deviceDensity 
 val fontSize = zoomRatio * standardFontSize 
 return fontSize 
 }
 override fun getFontSizeBySSpeed(speed: Int): Float {
 val zoomRatio = speed * DEFAULT_FONT_RATIO / deviceDensity 
 val fontSize = zoomRatio * standardFontSize 
 return fontSize 
 }
}
class ... { 
 override fun getDefaultFontSize(): Float = calculate(DEFAULT_AGE)
 override fun getFontSizeByAge(age: Int): Float = calculate(age) 
 private fun calculate(age: Int): Float {
 val zoomRatio = age * DEFAULT_FONT_RATIO / deviceDensity 
 val fontSize = zoomRatio * standardFontSize 
 return fontSize 
 }
}

सामान्य गलतियाँ जिनसे बचना चाहिए:

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

कोड को दोबारा तैयार करना (नीला वर्ग) और परीक्षण की सफलता सुनिश्चित करना (हल्का हरा वर्ग)

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

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

<पी> रिफैक्टरिंग चरण के लिए यहां कुछ विचार और रणनीतियां दी गई हैं:

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

<पी> याद रखें, रीफैक्टरिंग करते समय, यह सुनिश्चित करने के लिए कि वे उत्तीर्ण होते रहें, अपने सभी परीक्षण चलाते रहना महत्वपूर्ण है।

टिप्स

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

सामान्य गलतियाँ जिनसे बचना चाहिए:

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

एक नया असफल परीक्षण लिखना (प्रवाह को पुनः आरंभ करना)

<पी> अब, आप अगली चीज़ के बारे में सोचें जो आप अपने कोड से कराना चाहते हैं। <पी> आप एक नया परीक्षण लिखकर शुरुआत करते हैं जो विफल हो जाना चाहिए क्योंकि आपका कोड अभी तक नहीं जानता कि नया कार्य कैसे करना है। यह आपके कोड को हल करने के लिए एक नई चुनौती देने जैसा है। <पी> फिर, आप पूरे चक्र को दोहराते हैं:कोड (हरा वर्ग) के साथ परीक्षण पास करें, यदि आवश्यक हो तो साफ़ करें (नीला वर्ग), और यह सुनिश्चित करने के लिए परीक्षण करते रहें कि सब कुछ काम करता है (हल्का हरा वर्ग)। <पी> इस तरह, आप हमेशा आगे बढ़ रहे हैं और चरण दर चरण अपना कोड बना रहे हैं।

टिप्स

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

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

सामान्य गलतियाँ जिनसे बचना चाहिए:

  • कार्यान्वयन के बाद परीक्षण लिखना:सुविधा लागू करने के बाद परीक्षण न लिखें। टीडीडी पहले परीक्षण लिखने के बारे में है। यहां तक ​​कि परीक्षण कोड से पहले जोड़े गए तर्क का एक छोटा सा टुकड़ा भी इसका मतलब है कि कोड में संभावित संसाधन बर्बादी/बग है। संपूर्ण मुद्दा यह है कि किसी भी तर्क को तब तक न जोड़ें जब तक कि परीक्षण सूट से इसकी आवश्यकता न हो।
  • असफल परीक्षणों को छोड़ना:इस चरण को न छोड़ें, भले ही आपको लगे कि आप जानते हैं कि इस सुविधा को कैसे कार्यान्वित करना है।
<पी> यही कारण है कि आपको आश्वस्त होने पर भी असफल परीक्षण चरण को नहीं छोड़ना चाहिए:

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

टीडीडी का उपयोग करके कैसे विकास करें

<पी> टीडीडी सॉफ्टवेयर के डिजाइन और विकास को आगे बढ़ाने के लिए स्वचालित परीक्षण लिखने के महत्व पर जोर देता है। इससे ऐसा कोड प्राप्त होता है जो अधिक विश्वसनीय, रखरखाव योग्य और समय के साथ बदलने में आसान होता है।

<पी> लेकिन हम इसे व्यवहार में कैसे ला सकते हैं? इसे आज़माकर और धीरे-धीरे इसकी आदत डालकर।

<पी> आइए एक नई सुविधा विकसित करते समय टीडीडी का प्रयास करें ताकि यह प्रदर्शित किया जा सके कि हम वास्तविक दुनिया में इसका उपयोग कैसे शुरू कर सकते हैं।

<पी> हम एक फ़ॉन्ट आकार ऑटो सेटिंग सुविधा लागू करेंगे। <पी> हमारे पास एक समाचार ऐप है और उपयोगकर्ता समाचार फ़ीड के लिए ऑटो-स्क्रॉल-स्पीड सेट कर सकता है। <पी> हम एक ऐसी सुविधा लागू करना चाहते हैं जो उपयोगकर्ता प्रोफ़ाइल पृष्ठ में सेट स्क्रॉल गति से स्क्रीन फ़ॉन्ट आकार को समायोजित करती है।

<पी> यदि उपयोगकर्ता स्क्रॉल गति को 0 से 1 पर सेट करता है, तो फ़ॉन्ट आकार 1.3 तक बढ़ जाना चाहिए। <पी> 1 से अधिक स्क्रॉल गति में किसी भी वृद्धि के परिणामस्वरूप फ़ॉन्ट आकार में 1.2 की वृद्धि होगी। <पी> यह सुविधा उपयोगकर्ताओं को समाचार पढ़ते समय बेहतर अनुभव प्राप्त करने की अनुमति देती है।

<पी> मैंने इस GitHub रिपॉजिटरी में हमारे द्वारा खोजे गए कोड को भी साझा किया है।

<पी> बेझिझक क्लोन करें और इसके साथ खेलें।

<पी> जैसे-जैसे हम विकास में आगे बढ़ रहे हैं, चरणों का पालन करने का प्रयास करें। इससे आपको टीडीडी के संदर्भ में तकनीकों और सोचने के तरीके को व्यावहारिक रूप से समझने में मदद मिलेगी। <पी> तो, एंड्रॉइड स्टूडियो खोलें और एक नया प्रोजेक्ट बनाएं।

फ़ॉन्ट आकार ऑटो सेटिंग फ़ीचर डेटा फ़्लो चार्ट

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका एंड्रॉइड ऐप में एक नमूना सुविधा का डीएफडी <पी> अंत में डेटा प्रवाह कैसा दिखना चाहिए इसका फ़्लोचार्ट ऊपर दिया गया है। <पी> यहां प्रत्येक आकर्षक घटक की रूपरेखा दी गई है:

<पी> AutoScrollSettingsUseCase क्लास FontRatio की गणना और भंडारण के लिए तर्क को संभालेगा चयनित स्क्रॉल स्पीड के आधार पर। <पी> इस उपयोग के मामले में UserRepository पर निर्भरता होगी FontRatio को संग्रहित करना मूल्य.

<पी> UserRepository में , FontRatio को संग्रहीत और पुनः प्राप्त करने की विधियाँ हैं Storage का उपयोग करके मूल्य तंत्र. जब भी कोई नया FontRatio भंडारण में भेजा जाता है, किसी भी अवलोकन योग्य वस्तु को नवीनतम मूल्य के साथ उत्सर्जन प्राप्त होगा।

<पी> UserProfileViewModel में , AutoScrollSettingsUseCase का एक उदाहरण है जब भी उपयोगकर्ता स्क्रॉल स्पीड को अपडेट करता है तो उसे कॉल किया जाता है। यह FontRatio की पुनर्गणना को ट्रिगर करेगा और इसे रिपॉजिटरी के माध्यम से संग्रहीत किया जाता है।

<पी> उपयोगकर्ता को अपनी वांछित स्क्रॉल गति इनपुट करने की अनुमति देने के लिए हमारे पास उपयोगकर्ता सेटिंग अनुभाग में आवश्यक यूआई घटक होंगे। यह मानक एंड्रॉइड यूआई तत्वों जैसे NumberPicker का उपयोग करके किया जा सकता है या कस्टम यूआई घटक (हम इन भागों पर चर्चा नहीं करेंगे)।

<पी> यह एक साधारण सुविधा का विवरण है और हर बार जब आप इससे गुजरते हैं, तो यह अधिक स्पष्ट हो जाता है कि चरण क्या हैं और अंतिम परिणाम क्या हैं। आपके परिवर्तनों के लिए ऐसा करना महत्वपूर्ण है। ‌

टेस्ट कैसे लिखें

<पी> पहला कदम हमेशा टेस्ट क्लास स्वयं बनाना है। इस मामले में, हमारे पास कम से कम निम्नलिखित परीक्षण कक्षाएं होंगी:

  • UserRepositoryTest
  • AutoScrollSettingTest
  • UserSettingsViewModelTest
<पी> मैं ViewModel भाग से शुरुआत करना पसंद करता हूँ। <पी> व्यूमॉडल एक एंड्रॉइड आर्किटेक्चरल घटक है जो जीवनचक्र परिवर्तनों (जैसे अग्रभूमि, पृष्ठभूमि, केंद्रित) से बच जाता है। इसलिए, यह हमारे राज्यों को संग्रहीत करने के लिए एक अच्छी जगह है। <पी> आइए unitTest के अंदर परीक्षण फ़ाइल बनाएं स्रोत कोड की निर्देशिका वास्तविक फीचर कोड के समान पैकेज पथ का अनुसरण करती है।

<पी> व्यवहार में टीडीडी विरासती कार्य विकास से भिन्न है। <पी> टीडीडी के साथ हम फ़ाइल और प्रॉपर्टी (फ़ील्ड) निर्माण प्रक्रिया को बढ़ावा देने के लिए एक आईडीई का उपयोग करते हैं। लेकिन हम टेस्ट फ़ाइलें मैन्युअल रूप से बनाते हैं! कुछ प्रयासों के बाद, आईडीई का यह पहलू उपयोगी हो जाएगा।

<पी> कोड संरचना (पैकेज) बनाएं और फिर पैकेज पर राइट क्लिक करके और Class का चयन करके अपनी टेस्ट क्लास बनाएं। प्रकार. <पी> इसके लिए एक वर्णनात्मक नाम चुनें (यदि आप पहले से नहीं हैं तो शायद आपको इसके लिए एक परंपरा का पालन करना चाहिए)। <पी> उदाहरण के लिए:xxx is tested for , जहां xxx परीक्षण किए गए घटक का नाम है।

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका फ़ाइलें बनाने के लिए IDE का उपयोग करें <पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका

<पी> अब, चलिए खाली परीक्षण बनाते हैं। जितना संभव हो उतना व्यापक होने का प्रयास करें। <पी> आरेख के अनुसार, इस सुविधा के लिए हमारे पास अधिक तर्क नहीं होंगे। <पी> यूनिट परीक्षण फ़ंक्शन लिखने के लिए दो मुख्य रणनीतियाँ हैं:

  • एएए
  • दिया/कब/तब
@Test fun `strategy A`(){ 
 // Arrange
 // Act 
 // Assert 
}
@Test fun `strategy B`(){ 
 // Given 
 // When 
 // Then 
}
<पी> आइए एक को चुनें और अपने सभी परीक्षणों के लिए इसका पालन करें।

<पी> अवधारणा समान है:पढ़ने और बनाए रखने में आसान बनाने के लिए अपने परीक्षण कोड को क्लस्टर करें।

<पी> फिलहाल मेरे पास यही है:

class UserProfileViewModel is tested for` {
 // Unimplemented Class 
 val viewModel = UserProfileViewModel()
 @Test
 fun Font Ratio is fetched from data source`(){}
 @Test
 fun `Scroll Speed update is called so fontSize calculations are triggered`() {}
 @Test
 fun `Font Ratio is updated with new emissions from data source`() {}
}
<पी> चलिए परीक्षण चलाते हैं!

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका परीक्षण लक्ष्य चूक जाने के कारण विफल परीक्षण <पी> यह असफल हो रहा है. वास्तव में, निर्माण विफल हो गया है- परीक्षण नहीं। <पी> बधाई हो! हम अभी-अभी टीडीडी चक्र के पहले चरण पर पहुंचे हैं:

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका टीडीडी चक्र में पहला कदम <पी> चूँकि ViewModel अभी तक मौजूद नहीं है, हमारे पास लाल रंग हैं। <पी> अब, आइए ViewModel का एक उदाहरण बनाएं,

<पी> इसलिए, हम एक लापता वर्ग या अकार्यान्वित कोड बनाने के लिए एक आईडीई का उपयोग करते हैं। <पी> इस डायलॉग को पॉपअप करने के लिए, मैं पॉइंटर को अप्रयुक्त भाग पर ले जाता हूं और विकल्प + रिटर्न (मैकओएस पर) दबाता हूं। <पी> फिर, दिए गए विकल्पों का पालन करें:

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका टीडीडी क्रिया:यूनिटटेस्ट फ़ाइल के माध्यम से लक्ष्य फ़ाइलें बनाएं <पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका नई फ़ाइल के लिए सही गंतव्य चुनें <पी> और अब परीक्षणों को फिर से चलाएँ (अंतिम चरण):

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका परीक्षा उत्तीर्ण होना दिखा रहा है <पी> हाँ! यह पारित हो गया.

<पी> ध्यान दें कि इन परीक्षणों का मुख्य भाग खाली है और वे कुछ भी परीक्षण नहीं करते हैं! यह सही और ठीक है.

<पी> हमें डीएफडी आरेख में प्रत्येक घटक के लिए सभी परीक्षण कक्षाएं (अभी भी एक खाली परीक्षण निकाय के साथ) बनाना जारी रखना चाहिए - मैंने इन्हें लेख की शुरुआत में साझा किया था।

<पी> इससे हमें सुविधा को लागू करने से पहले उसकी अधिक स्पष्ट समझ प्राप्त करने में मदद मिलती है।

<पी> अंततः, हमारे पास लगभग 3-4 परीक्षण कक्षाएं होंगी जिनमें सामान्य परिदृश्य और यूनिट परीक्षण शामिल होंगे। <पी> यह कुछ इस तरह दिखेगा:

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका न्यूनतम खाली परीक्षण मामले <पी> आइए उनमें से एक को उदाहरण के रूप में लागू करें।

<पी> लेकिन, इससे पहले, हमें इस सुविधा के यूआई और डोमेन डेटा मॉडल के साथ काम करने की आवश्यकता होगी। <पी> तो, डेटा को इधर-उधर ले जाने में सक्षम होने के लिए, आइए पहले से आपके लिए आवश्यक डेटा कक्षाएं बनाएं।

<पी> हमारे ProfileViewModel पर वापस जाएँ परीक्षण वर्ग, हमारे पास एक खाली इकाई परीक्षण फ़ंक्शन है। आइए उस पर अमल करें।

<पी> ध्यान दें कि यहां मुख्य बात यह है कि परीक्षण को ध्यान से पढ़ें और किसी भी दावे के अतिरिक्त कार्यान्वयन से बचें। <पी> केवल आवश्यकता को लागू करने की अनुमति है।

<पी> इस मामले में, हमें डेटा की एक स्ट्रीम की आवश्यकता है जो पहले बनाए गए डेटा स्रोत से जुड़ी हो (UserRepository ). <पी> मत भूलिए:हमें पहले एक असफल परीक्षण की आवश्यकता है।

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका आंतरिक शरीर को लागू करें <पी> परीक्षण फ़ंक्शन बॉडी (लाल फ़ॉन्ट से चिह्नित) के अंदर लागू न किए गए हिस्सों पर ध्यान दें। <पी> अब, आइए कोड लागू करें, फिर इसे पास करने के लिए इसे दोबारा क्रियान्वित करें।

<पी> मैं यहां मॉकिंग कक्षाओं और वस्तुओं के लिए मॉकके लाइब्रेरी और फ्लो स्ट्रीम का परीक्षण करने के लिए टर्बाइन का उपयोग कर रहा हूं।

<पी> यदि आप उनसे परिचित नहीं हैं तो घबराएं नहीं! बस उनका आधिकारिक वेबपेज देखें और उन्हें आज़माएँ। <पी> आइए पहले निर्भरता बनाएं और इसे नामांकित तर्कों का उपयोग करके व्यूमॉडल में जोड़ें। परीक्षण कोड के माध्यम से उचित नाम पेश करने के लिए आईडीई के माध्यम से पैरामीटर बनाते समय नामित तर्क हमारी मदद करता है।

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका आईडीई डायलॉग्स का उपयोग करके गुम पैरामीटर बनाएं <पी> FontRatio के लिए भी ऐसा ही करें रिपॉजिटरी के अंदर वैरिएबल। <पी> अंततः, अंतिम परीक्षण कोड नीचे दिए गए कोड जैसा कुछ हो सकता है:

class `UserProfileViewModel is tested for` {
 init {
 Dispatchers.setMain(Dispatchers.Unconfined)
 }
 val mockUserRepository = mockk<UserRepository>()
 @Test
 fun `Font Ratio is fetched from data source`() = runTest {
 // Given
 val expectedRatio = 2.0f
 every { mockUserRepository.fontRatio } returns flowOf(FontRatioUiModel(expectedRatio))
 val viewModel = UserProfileViewModel(userRepository = mockUserRepository)
 // When
 viewModel.fontRatio.test {
 val fromDataSource = expectItem()
 // Then
 assertEquals(/* expected = */ expectedRatio, /* actual = */ fromDataSource.fontRatio)
 }
 }
...
}
<पी> ध्यान दें कि हम यहां ViewModel या रिपोजिटरी के आंतरिक भागों को लागू नहीं करते हैं।

<पी> हम परीक्षण निकाय से त्रुटि को दूर करने के लिए केवल गायब हिस्से बनाते हैं। <पी> हम उन विवरणों को अगले पुनरावृत्ति में लागू करेंगे। <पी> अभी परीक्षण चलाएँ. <पी> निःसंदेह यह विफल हो जाएगा, क्योंकि हमने FontRatio लागू नहीं किया ProfileViewModel के अंदर . <पी> अब, परीक्षण को पास करने के लिए (न्यूनतम कार्यान्वयन) ViewModel को दोबारा क्रियान्वित करें। <पी> इस मामले में, बस राज्य प्रवाह को रिपॉजिटरी से जोड़ने की जरूरत है। हमने इसे पिछली पुनरावृत्ति में पहले ही एक निर्भरता के रूप में जोड़ लिया था। <पी> यहाँ अंतिम कोड है:

class UserProfileViewModel(
 userRepository: UserRepository
) : ViewModel() {
 val fontRatio: StateFlow<FontRatioUiModel> = userRepository.fontRatio.stateIn(
 initialValue = FontRatioUiModel(DEFAULT_FONT_RATIO),
 scope = viewModelScope,
 started = SharingStarted.Lazily
 )
 companion object {
 private const val DEFAULT_FONT_RATIO = 1.0f
 }
}
<पी> परीक्षण फिर से चलाएँ, और बूम! यह बीत जाता है!

<पी> मास्टर एंड्रॉइड टीडीडी:परीक्षण-संचालित विकास के लिए एक व्यावहारिक मार्गदर्शिका मुख्य कोड के न्यूनतम कार्यान्वयन के बाद परीक्षा उत्तीर्ण करना <पी> इस यूनिट परीक्षण के साथ, हमने UserProfileViewModel का एक प्राथमिक भाग लागू किया घटक. लेकिन केवल आवश्यक हिस्से. बाकी परीक्षण मामलों के लिए भी ऐसा ही करें। <पी> इन परीक्षण मामलों के साथ वैसा व्यवहार न करें जैसा आप सामान्य यूनिट परीक्षणों (जो चलते हैं और जल्दी से पास हो जाते हैं) के साथ करते हैं। <पी> पहले तकनीकी और उत्पाद आवश्यकताओं को समझने के लिए इस पर कुछ समय व्यतीत करें। फिर, योजना शुरू करें और कार्यान्वयन शुरू करें। कुछ कोशिशों के बाद, टीडीडी तरीके से सोचना आसान हो जाएगा।

स्रोत कोड

<पी> इस प्रोजेक्ट का सोर्स कोड और रिपॉजिटरी मेरे GitHub पेज पर उपलब्ध है।

<पी> बेझिझक इसे जांचें और अगले चरण पूरे करें। मैंने विभिन्न शाखाओं में पुनरावृत्तियों को अलग कर दिया है ताकि आप इसकी तुलना अपने स्वयं के कार्यान्वयन से कर सकें।

निष्कर्ष

<पी> इसलिए, टेस्ट-संचालित विकास (टीडीडी) में गोता लगाने और इसके अंदर और बाहर की खोज करने के बाद, मुझे कहना होगा, यह एक गेम-चेंजर है! <पी> आइए मैं इसे आपके लिए समझाता हूं:

<पी> मुख्य बिंदु:

  • टीडीडी वास्तविक कोड लिखने से पहले परीक्षण लिखने के बारे में है। यह पहली बार में थोड़ा अजीब लग सकता है, लेकिन मुझ पर विश्वास करें, यह अद्भुत काम करता है।
  • टीडीडी प्रक्रिया एक सरल चक्र का अनुसरण करती है:असफल परीक्षण लिखें, उन परीक्षणों को पास कराने के लिए कोड लागू करें, और फिर सब कुछ सुचारू रूप से चलाने के लिए आवश्यकतानुसार रिफैक्टर करें।
  • स्वचालित परीक्षणों पर जोर देकर, टीडीडी हमें ऐसे सॉफ़्टवेयर को डिज़ाइन और विकसित करने में मदद करता है जो ठोस, रखरखाव योग्य और समय के साथ अनुकूलनीय हो।
<पी> हमने परीक्षण कक्षाएं बनाकर और खाली परीक्षण फ़ंक्शन लिखकर शुरुआत की थी लेकिन अब इसे समाप्त करना आपका काम है (या आप तुरंत साझा रेपो पर जा सकते हैं :))। <पी> ऐसे परीक्षणों का होना थोड़ा अजीब लग सकता है जो कुछ नहीं करते, लेकिन यह सब योजना का हिस्सा है।

<पी> इसके बाद, हमने डेटा फ्लो चार्ट के आधार पर एक स्पष्ट योजना बनाई कि हमारी सुविधा को क्या करना चाहिए। इससे हमें कार्यान्वयन में उतरने से पहले आवश्यकताओं को समझने में मदद मिली।

<पी> हाथ में योजना के साथ, हमने आवश्यक घटकों (इस मामले में व्यूमॉडल) को लागू करना शुरू कर दिया, यह सुनिश्चित करते हुए कि हमारे परीक्षण पहले विफल रहे। यह सही है, टीडीडी में परीक्षणों में असफल होना वास्तव में एक अच्छी बात है!

<पी> धीरे-धीरे, हमने टुकड़ों को एक साथ जोड़ा, जैसे UserAutoScrollSettingsUseCase को सेट करना ऑटो-स्क्रॉल गति के आधार पर फ़ॉन्ट आकार की गणना को संभालने के लिए क्लास (प्रोजेक्ट रेपो की जांच करें)।

<पी> हमने यूआई घटकों को भी निपटाया, जिससे उपयोगकर्ताओं को अपनी वांछित स्क्रॉल गति इनपुट करने की इजाजत मिली, और यह सुनिश्चित किया कि फ़ॉन्ट आकार तदनुसार समायोजित किया गया था (प्रोजेक्ट रेपो जांचें)। <पी> पूरी प्रक्रिया के दौरान, हमने अपने कोड को साफ़ और सरल बनाए रखना सुनिश्चित किया, और इस बात पर ध्यान केंद्रित किया कि परीक्षणों को पास करने के लिए क्या आवश्यक है। यहां कोई अनावश्यक जटिलता नहीं!

<पी> अंत तक, हमारे पास "फ़ॉन्ट आकार ऑटो सेटिंग" सुविधा चालू थी और परीक्षण अच्छे परिणाम के साथ पास हुए।

<पी> याद रखें, टीडीडी परीक्षणों में जल्दबाजी करने या पागलों की तरह कोडिंग करने के बारे में नहीं है। यह आपकी विकास प्रक्रिया में जानबूझकर और विचारशील होने के बारे में है, जिसका लंबे समय में बड़ा लाभ मिलता है।

<पी> इसलिए, यदि आप अपने सॉफ़्टवेयर विकास गेम को उन्नत करना चाहते हैं, तो टीडीडी को एक मौका दें! यह एक शक्तिशाली दृष्टिकोण है जो आपके कोड को अधिक ठोस बनाएगा, बग्स को कम करेगा और आपको समग्र रूप से एक बेहतर डेवलपर बनाएगा।

<पी> मैंने जो साझा किया है वह यह है कि हम अपनी टीम में कैसे काम करते हैं और यह हमारे लिए काम कर रहा है, लेकिन यह हर टीम/कंपनी के लिए सही समाधान नहीं है। आपको यह पता लगाना होगा कि यह आपका है या नहीं। अगर आपको लगता है कि मैं इस समाधान में सुधार कर सकता हूं तो मुझे बताएं।

<पी> हैप्पी कोडिंग! 🚀

<पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें


  1. iOS टिप्स के 30 दिन:बैकग्राउंड ऐप रिफ्रेश अक्षम करें iOS टिप्स के 30 दिन:बैकग्राउंड ऐप रिफ्रेश अक्षम करें

    बैकग्राउंड ऐप रिफ्रेश मेरे RSS रीडर, पॉडकास्ट और iBooks के लिए बहुत अच्छा रहा है-ऐसे ऐप्स जिन्हें मैं बैकग्राउंड में नई सामग्री लाना चाहता हूं- लेकिन क्या मुझे वास्तव में YouTube या अन्य ऐप पर बैकग्राउंड अपडेट प्राप्त करने की आवश्यकता है जो मैं केवल कभी-कभी iPad पर उपयोग करता हूं? वास्तव में नहीं।

  1. डिस्कपार्ट का उपयोग करके OEM पुनर्प्राप्ति विभाजन को कैसे हटाएं डिस्कपार्ट का उपयोग करके OEM पुनर्प्राप्ति विभाजन को कैसे हटाएं

    अधिकांश डेस्कटॉप या लैपटॉप निर्माता अपने ब्रांडेड ओईएम सिस्टम की हार्ड ड्राइव पर एक रेफरेंस सिस्टम इमेज (आप फ़ैक्टरी रीसेट करते समय इसे वापस रोल कर सकते हैं) और निर्माता द्वारा प्रदान किए गए कई सिस्टम और डायग्नोस्टिक टूल स्टोर करने के लिए एक अलग रिकवरी पार्टीशन बनाते हैं। विभाजन का आकार कई दसियों गी

  1. Windows 10 में Microsoft संगतता टेलीमेट्री हाई डिस्क उपयोग समस्या को कैसे हल करें Windows 10 में Microsoft संगतता टेलीमेट्री हाई डिस्क उपयोग समस्या को कैसे हल करें

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