TDD: यह क्या है, परीक्षण सिद्धांत और कार्यप्रणाली

लेखक: IT Sectr प्रकाशित: 2026-04-09 पढ़ने का समय: 9 मिनट

Test-Driven Development (TDD) एक डेवलपमेंट पद्धति है जिसमें कोड को लागू करने से पहले टेस्ट लिखे जाते हैं। डेवलपर पहले एक असफल टेस्ट के रूप में अपेक्षित व्यवहार तैयार करता है, फिर उसे पास करने के लिए न्यूनतम कोड लिखता है और उसके बाद रिफैक्टर करता है। Martin Fowler (2023) के अनुसार, TDD कोई परीक्षण तकनीक नहीं है — यह एक डिज़ाइन तकनीक है जो आर्किटेक्चर को अनुशासित करती है और कोड लिखने के चरण में दोषों की संख्या कम करती है।

मुख्य बातें

  • TDD एक पद्धति है जिसमें टेस्ट कार्यान्वयन से पहले लिखा जाता है, बाद में नहीं
  • Red-Green-Refactor चक्र TDD का आधार है: लाल टेस्ट, हरा टेस्ट, रिफैक्टरिंग
  • JUnit और Mockito Android डेवलपमेंट में TDD के मुख्य टूल हैं
  • कोड कवरेज TDD प्रोजेक्ट्स में अक्सर “पहले टेस्ट” अनुशासन के कारण 90% से अधिक होता है
  • रिफैक्टरिंग बिना कार्यक्षमता तोड़ने के डर के — TDD दृष्टिकोण का मुख्य लाभ

TDD क्या है?

Test-Driven Development एक सॉफ्टवेयर डेवलपमेंट अभ्यास है जिसमें स्वचालित टेस्ट प्रोडक्शन कोड लिखने का निर्धारण करते हैं। पारंपरिक दृष्टिकोण के विपरीत जहाँ कोड लिखा जाता है और फिर परीक्षण किया जाता है, TDD अनुक्रम को उलट देता है: पहले टेस्ट लिखा जाता है, फिर कोड जो उस टेस्ट को पास करता है।

TDD के संस्थापक Kent Beck माने जाते हैं, जिन्होंने 1990 के दशक के अंत में Extreme Programming (XP) पद्धति के भाग के रूप में इस अभ्यास को तैयार किया। पुस्तक “Test-Driven Development: By Example” (2002) में, बेक ने TDD के पाँच नियमों का वर्णन किया जो विहित बन गए: प्रोडक्शन कोड से पहले टेस्ट लिखें, टेस्ट पास करने के लिए उतना ही कोड लिखें जितना आवश्यक हो, और प्रत्येक चक्र के बाद रिफैक्टर करें।

TDD के प्रमुख सिद्धांत

पहला सिद्धांत — टेस्ट इंटरफ़ेस को परिभाषित करता है. डेवलपर को यह सोचने के लिए मजबूर किया जाता है कि कंपोनेंट का उपयोग कैसे किया जाएगा, इससे पहले कि वह सोचे कि इसे कैसे लागू किया जाए। यह शुरू से ही एक साफ API बनाता है।

डिज़ाइन तकनीक के रूप में TDD

दूसरा सिद्धांत — न्यूनतम कार्यान्वयन. जब टेस्ट लिखा जाता है, तो डेवलपर उतना ही प्रोडक्शन कोड लिखता है जितना उसे पास करने के लिए आवश्यक है — एक पंक्ति भी अधिक नहीं। यह समय से पहले अब्स्ट्रक्शन और अत्यधिक जटिलता को रोकता है, जिसे Martin Fowler Speculative Generality कहते हैं।

TDD और सामान्य परीक्षण में अंतर

TDD और “बाद में” परीक्षण के बीच मुख्य अंतर — अनुक्रम का अनुशासन है। TDD में, टेस्ट केवल कोड की जाँच नहीं करता — यह उसकी संरचना का मार्गदर्शन करता है। Microsoft Research अध्ययन (Nagappan et al., 2008) के अनुसार, TDD लागू करने वाली टीमें पारंपरिक दृष्टिकोण का उपयोग करने वाली टीमों की तुलना में 40–90% कम दोष घनत्व प्रदर्शित करती हैं।

Red-Green-Refactor चक्र

Red-Green-Refactor चक्र एक तीन-चरणीय अनुक्रम है जो प्रत्येक नए टेस्ट के लिए दोहराया जाता है। Red: एक टेस्ट लिखें जो पास नहीं होता। Green: टेस्ट पास कराने के लिए न्यूनतम कोड लिखें। Refactor: व्यवहार बदले बिना कोड में सुधार करें।

Red चरण: असफल टेस्ट लिखना

डेवलपर एक टेस्ट लिखता है जो अभी तक लागू नहीं की गई कार्यक्षमता की जाँच करता है। इस चरण में, टेस्ट को असफल होना चाहिए — यह पुष्टि करता है कि टेस्ट वास्तव में कुछ जाँच कर रहा है। Android डेवलपमेंट वातावरण में, JUnit 5 फ्रेमवर्क असफल टेस्ट के लिए लाल संकेतक दिखाता है, जिसने इस चरण को नाम दिया।

kotlin
class CalculatorTest {
    fun testAddition() {
        val result = Calculator().add(2, 3)
        Assertions.assertEquals(5, result)
    }
}

Green चरण: न्यूनतम कार्यान्वयन

इस चरण में, टेस्ट पास करने के लिए पर्याप्त न्यूनतम प्रोडक्शन कोड लिखा जाता है। कोई अतिरेक नहीं — केवल वही जो हरे संकेतक के लिए आवश्यक है। यदि कार्यान्वयन एक स्थिरांक हो सकता है, तो इसे स्थिरांक होने दें। रिफैक्टरिंग अगले चरण में होगी जब नए टेस्ट सामने आएंगे।

kotlin
class Calculator {
    fun add(a: Int, b: Int): Int {
        return a + b
    }
}

Refactor चरण: जोखिम के बिना सुधार

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

मोबाइल डेवलपमेंट में TDD के लाभ

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

दोष घनत्व में कमी

चार औद्योगिक प्रोजेक्ट्स पर IBM अध्ययन (Bhat & Nagappan, 2006) ने दिखाया कि TDD का उपयोग करने वाली टीमें पारंपरिक योजना पर काम करने वाली समान टीमों की तुलना में 40% कम दोष उत्पन्न करती हैं। मोबाइल डेवलपमेंट के लिए, जहाँ Google Play पर रिलीज़ के बाद बग को ठीक करने की लागत कोड लिखने के चरण की तुलना में काफी अधिक होती है, यह मीट्रिक महत्वपूर्ण है।

टेस्ट के माध्यम से कोड दस्तावेज़ीकरण

TDD के साथ लिखे गए टेस्ट API के जीवंत दस्तावेज़ीकरण के रूप में कार्य करते हैं। प्रोजेक्ट में आने वाला डेवलपर टेस्ट पढ़ सकता है और समझ सकता है कि प्रत्येक कंपोनेंट का उपयोग कैसे किया जाना चाहिए। यह टीम के उच्च कारोबार की स्थितियों में विशेष रूप से मूल्यवान है — मोबाइल स्टूडियो की एक विशिष्ट समस्या।

आत्मविश्वासपूर्ण रिफैक्टरिंग

90% से अधिक कोड कवरेज डेवलपर्स को बिना कुछ तोड़ने के डर के रिफैक्टर करने की अनुमति देता है। Google अपनी पुस्तक “Software Engineering at Google” (2020) में टेस्ट कवरेज को लाखों पंक्तियों वाले प्रोजेक्ट्स में कोड बेस को साफ रखने का प्रमुख कारक बताता है।

TDD के लिए टूल और फ्रेमवर्क

मोबाइल डेवलपमेंट में TDD पारिस्थितिकी तंत्र में यूनिट टेस्टिंग, मॉकिंग और UI कंपोनेंट सत्यापन के लिए टूल शामिल हैं — Android और iOS दोनों के लिए।

टूलप्लेटफ़ॉर्मउद्देश्य
JUnit 5Android (Kotlin/Java)यूनिट टेस्ट के लिए बुनियादी फ्रेमवर्क
MockitoAndroidमॉक ऑब्जेक्ट बनाना और कॉल सत्यापन
MockKAndroid (Kotlin)Kotlin-first सिंटैक्स और कोरूटीन समर्थन के साथ मॉकिंग
TurbineAndroidKotlin Flow और रिएक्टिव स्ट्रीम का परीक्षण
XCTestiOS (Swift)मानक परीक्षण फ्रेमवर्क

Android के लिए फ्रेमवर्क चुनना

Kotlin पर Android प्रोजेक्ट्स के लिए, मानक स्टैक में JUnit 5 + MockK शामिल है। MockK, Mockito से बेहतर है क्योंकि यह बिना अतिरिक्त सेटअप के Kotlin की प्रथम श्रेणी की सुविधाओं — sealed class, कोरूटीन और suspend फ़ंक्शन — का समर्थन करता है।

iOS के लिए टूल

iOS डेवलपमेंट में, TDD को XCTest के माध्यम से लागू किया जाता है — Apple का अंतर्निहित फ्रेमवर्क जो assertions, टेस्ट क्लास और Xcode Server या GitHub Actions के माध्यम से CI/CD एकीकरण प्रदान करता है। iOS पर मॉकिंग के लिए Cuckoo और OHHTTPStubs लाइब्रेरी का उपयोग किया जाता है।

Kotlin में TDD के साथ कोड उदाहरण

Android के लिए Kotlin में TDD का एक वास्तविक परिदृश्य देखें — उपयोगकर्ता रिपॉजिटरी का परीक्षण। पहले हम टेस्ट लिखते हैं, फिर उस टेस्ट को पास करने वाला कार्यान्वयन।

चरण 1: UserRepository के लिए टेस्ट

kotlin
class UserRepositoryTest {
    private val api = mockk<UserApi>()
    private val dao = mockk<UserDao>()
    private val repo = UserRepository(api, dao)

    fun `when api returns user then cache and emit`() = runTest {
        val user = User(1, "Alice")
        coEvery { api.getUser(1) } returns user
        every { dao.insert(user) } returns Unit

        val result = repo.getUser(1)

        assertEquals(user, result)
        verify { dao.insert(user) }
    }
}

चरण 2: न्यूनतम कार्यान्वयन

kotlin
class UserRepository(
    private val api: UserApi,
    private val dao: UserDao
) {
    suspend fun getUser(id: Int): User {
        val user = api.getUser(id)
        dao.insert(user)
        return user
    }
}

चरण 3: ऑफ़लाइन मोड के साथ कैशिंग के लिए टेस्ट

पहला टेस्ट पास करने के बाद, हम दूसरा जोड़ते हैं — नेटवर्क त्रुटि पर व्यवहार की जाँच करते हैं। अब टेस्ट निर्धारित करता है कि जब API विफल होता है, तो रिपॉजिटरी को कैश से डेटा वापस करना चाहिए।

kotlin
fun `when api fails then return cached user`() = runTest {
    val cached = User(1, "Cached Alice")
    coEvery { api.getUser(1) } throws IOException()
    every { dao.getById(1) } returns cached

    val result = repo.getUser(1)

    assertEquals(cached, result)
}

TDD लागू करते समय सामान्य गलतियाँ

TDD में संक्रमण विशिष्ट गलतियों से जुड़ा है जो पद्धति के सभी लाभों को समाप्त कर सकती हैं। इन जालों को समझने से टीमों को अभ्यास को अधिक प्रभावी ढंग से लागू करने में मदद मिलती है।

बहुत बड़े टेस्ट

पहला और सबसे आम एंटी-पैटर्न — एक टेस्ट में बहुत अधिक कार्यक्षमता का परीक्षण करना। टेस्ट को एक ही assertion की जाँच करनी चाहिए। यदि टेस्ट विफल होता है, तो डेवलपर को पता होना चाहिए कि अतिरिक्त डीबगिंग के बिना वास्तव में क्या टूटा।

लाल चरण की अनदेखी

दूसरी गलती — ऐसा टेस्ट लिखना जो शुरू से ही पास होता है। यदि टेस्ट कम से कम एक बार लाल नहीं हुआ, तो कोई विश्वास नहीं है कि यह वास्तव में कुछ जाँच कर रहा है। नियम: कभी भी उस टेस्ट पर भरोसा न करें जिसे आपने असफल होते नहीं देखा।

रिफैक्टरिंग छोड़ना

तीसरी सामान्य गलती — हरे चरण पर रुक जाना। रिफैक्टरिंग वैकल्पिक नहीं बल्कि चक्र का अनिवार्य चरण है। इसके बिना, कोड बेस खराब होता है, टेस्ट नाजुक हो जाते हैं, और TDD के लाभ खो जाते हैं।

  • कार्यान्वयन का परीक्षण न कि व्यवहार का — टेस्ट विवरण से बंध जाते हैं और हर रिफैक्टरिंग पर टूट जाते हैं
  • एज-केस के लिए टेस्ट की कमी — खाली सूची, null मान, सीमा शर्तें अनकवर्ड रह जाती हैं
  • टेस्ट की गति की अनदेखी — धीमे टेस्ट फीडबैक लूप को धीमा करते हैं और TDD अनुशासन को खत्म करते हैं

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

क्या TDD परीक्षण तकनीक है या डिज़ाइन तकनीक?

TDD मुख्य रूप से एक डिज़ाइन तकनीक है, परीक्षण तकनीक नहीं। TDD में टेस्ट एक विनिर्देश की भूमिका निभाते हैं: वे कंपोनेंट के API को उसके कार्यान्वयन से पहले परिभाषित करते हैं। Kent Beck स्वयं TDD को “डिज़ाइन का अनुशासन कहते हैं, परीक्षण का नहीं।”

TDD में महारत हासिल करने में कितना समय लगता है?

Microsoft Research अध्ययनों के अनुसार, टीमों को TDD को आदत बनाने के लिए 3 से 6 महीने के निरंतर अभ्यास की आवश्यकता होती है। पहले 2–3 सप्ताह में उत्पादकता 15–30% गिर जाती है, लेकिन अनुकूलन के बाद यह डीबगिंग समय में कमी के कारण मूल स्तर पर लौट आती है या उससे अधिक हो जाती है।

क्या TDD UI कंपोनेंट के लिए उपयुक्त है?

हाँ, लेकिन सीमाओं के साथ। UI लॉजिक (ViewModel, State) के लिए, TDD सीधे लागू है। विज़ुअल कंपोनेंट (Compose UI, SwiftUI Views) के लिए, स्नैपशॉट टेस्टिंग TDD को पूरक करती है लेकिन उसे प्रतिस्थापित नहीं करती। व्यावसायिक तर्क और प्रस्तुतीकरण को अलग करने की सिफारिश की जाती है।

क्या TDD को लीगेसी प्रोजेक्ट्स में लागू किया जा सकता है?

लीगेसी कोड के लिए, “कैरेक्टराइज़ेशन टेस्ट” की रणनीति अनुशंसित है — जहाँ टेस्ट मौजूदा व्यवहार पर लिखे जाते हैं, और फिर कोड रिफैक्टर किया जाता है। यह दृष्टिकोण Michael Feathers की पुस्तक “Working Effectively with Legacy Code” (2004) में वर्णित है और TDD को चरणबद्ध तरीके से लागू करने की अनुमति देता है।

TDD Clean Architecture के साथ कैसे संयुक्त होता है?

TDD और Clean Architecture एक दूसरे को सुदृढ़ करते हैं। स्वच्छ आर्किटेक्चर को परतों के बीच स्पष्ट सीमाओं की आवश्यकता होती है, और TDD डेवलपर को टेस्ट के माध्यम से उन सीमाओं को डिज़ाइन करने के लिए मजबूर करता है। Domain परत mock-निर्भरताओं के साथ अलगाव में परीक्षण की जाती है, data परत — एकीकरण परीक्षणों के माध्यम से।

निष्कर्ष

  • TDD — एक पद्धति जहाँ टेस्ट कार्यान्वयन से पहले लिखा जाता है, एक साफ API बनाता है और आर्किटेक्चर का मार्गदर्शन करता है
  • Red-Green-Refactor चक्र — TDD की मूल इकाई: असफल टेस्ट → न्यूनतम कार्यान्वयन → रिफैक्टरिंग
  • TDD लागू करने से IBM और Microsoft Research अध्ययनों के अनुसार दोष घनत्व 40–90% कम होता है
  • Android डेवलपमेंट के लिए मुख्य टूल: JUnit 5, MockK, Turbine Flow के लिए
  • MockK Kotlin प्रोजेक्ट्स में कोरूटीन और sealed class समर्थन के कारण Mockito से बेहतर है
  • सामान्य गलतियाँ: बहुत बड़े टेस्ट, लाल चरण छोड़ना, रिफैक्टरिंग की अनदेखी
  • अनुशंसित कार्यान्वयन रणनीति — चरणबद्ध, domain परत और नई सुविधाओं से शुरू करते हुए, बिना एक बार में सभी लीगेसी कोड को कवर करने का प्रयास किए

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें