कोटलिन में परीक्षण: यूनिट, इंटीग्रेशन, E2E उन्नत स्तर

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: उन्नत परीक्षण विश्वसनीय कोटलिन कोड का आधार क्यों है

\n

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

\n

यह लेख उन डेवलपर्स के लिए है जो पहले से ही कोटलिन की मूल बातों से परिचित हैं और अपने प्रोजेक्ट्स की गुणवत्ता को एक नए स्तर पर ले जाना चाहते हैं। हम परीक्षण के तीन प्रमुख स्तरों का विश्लेषण करेंगे: यूनिट, इंटीग्रेशन और E2E, आधुनिक टूल का उपयोग करते हुए: MockK, Testcontainers और Ktor Client। आप सीखेंगे कि ऐसे टेस्ट कैसे लिखें जो केवल "पास" नहीं होते, बल्कि वास्तव में आपके कोड को रिग्रेशन से बचाते हैं।

\n\n

1. यूनिट-टेस्टिंग: MockK के साथ अलगाव और मॉक

\n

यूनिट-टेस्ट परीक्षण पिरामिड की नींव हैं। उन्नत स्तर पर, हम केवल फ़ंक्शन की जाँच नहीं करते, बल्कि मॉक का उपयोग करके ऑब्जेक्ट्स के बीच जटिल इंटरैक्शन का परीक्षण करते हैं। कोटलिन में इसके लिए सबसे अच्छी लाइब्रेरी MockK है।

\n\n

1.1. MockK की उन्नत क्षमताएँ

\n

Mockito के विपरीत, MockK विशेष रूप से कोटलिन के लिए लिखा गया है और कोरूटीन, लैम्ब्डा और एक्सटेंशन-फ़ंक्शन का समर्थन करता है। आइए एक ऐसी सेवा के परीक्षण का उदाहरण देखें जो रिपॉजिटरी और कोरूटीन का उपयोग करती है:

\n
// जाँच के लिए सेवा
class UserService(private val repo: UserRepository) {
    suspend fun getUserName(id: Long): String {
        val user = repo.findById(id)
        return user?.name ?: "Unknown"
    }
}

// टेस्ट
class UserServiceTest {
    private val repo = mockk<UserRepository>()
    private val service = UserService(repo)

    @Test
    fun `should return user name when user exists`() = runTest {
        // given
        coEvery { repo.findById(1L) } returns User(1, "Alice")

        // when
        val result = service.getUserName(1L)

        // then
        assertEquals("Alice", result)
        coVerify(exactly = 1) { repo.findById(1L) }
    }

    @Test
    fun `should return Unknown when user not found`() = runTest {
        // given
        coEvery { repo.findById(any()) } returns null

        // when
        val result = service.getUserName(99L)

        // then
        assertEquals("Unknown", result)
    }
}

मुख्य बिंदु:

  • coEvery और coVerify — suspend-फ़ंक्शन के साथ काम करने के लिए।
  • mockk() एक खाली मॉक बनाता है, spyk() — वास्तविक ऑब्जेक्ट का आंशिक मॉक।
  • आर्गुमेंट कैप्चर करने के लिए slots का उपयोग करें।
\n\n

1.2. लैम्ब्डा और एक्सटेंशन-फ़ंक्शन का परीक्षण

\n

MockK एक्सटेंशन फ़ंक्शन को मॉक करने की अनुमति देता है, जो Ktor या Spring WebFlux जैसे फ्रेमवर्क के लिए महत्वपूर्ण है:

\n
class StringValidator {
    fun String.isValidEmail(): Boolean = this.contains("@")
}

// टेस्ट
@Test
fun `test extension mock`() {
    val validator = mockk<StringValidator>()
    with(validator) {
        every { "test@mail.com".isValidEmail() } returns true
        every { "invalid".isValidEmail() } returns false
    }
    assertTrue("test@mail.com".isValidEmail())
    assertFalse("invalid".isValidEmail())
}
\n\n

2. इंटीग्रेशन टेस्टिंग: डेटाबेस और Testcontainers

\n

इंटीग्रेशन टेस्ट जाँचते हैं कि आपका कोड वास्तविक निर्भरताओं: डेटाबेस, मैसेज क्यू, बाहरी API के साथ कैसे इंटरैक्ट करता है। यहाँ Testcontainers मदद करता है — एक लाइब्रेरी जो परीक्षणों के दौरान Docker कंटेनरों को चालू करती है।

\n\n

2.1. PostgreSQL के साथ Testcontainers सेटअप

\n

Spring Boot एप्लिकेशन के लिए यह इस प्रकार दिखता है:

\n

ब्लॉग

पुस्तक अनुशंसाएँ