परिचय: उन्नत परीक्षण विश्वसनीय कोटलिन कोड का आधार क्यों है
\nआधुनिक कोटलिन विकास में, कोड लिखना केवल आधा काम है। वास्तविक महारत विश्वसनीय, परीक्षण योग्य और आसानी से बनाए रखने योग्य सिस्टम बनाने की क्षमता में प्रकट होती है। बुनियादी यूनिट-टेस्ट सभी से परिचित हैं, लेकिन जब प्रोजेक्ट माइक्रोसर्विस आर्किटेक्चर या जटिल व्यावसायिक तर्क तक बढ़ जाता है, तो सरल जाँच पर्याप्त नहीं होती है। उन्नत परीक्षण में न केवल कक्षाओं का अलगाव शामिल है, बल्कि घटकों के बीच बातचीत की जाँच (इंटीग्रेशन टेस्ट) और उपयोगकर्ता परिदृश्यों का पूर्ण पुनरुत्पादन (E2E) भी शामिल है।
\nयह लेख उन डेवलपर्स के लिए है जो पहले से ही कोटलिन की मूल बातों से परिचित हैं और अपने प्रोजेक्ट्स की गुणवत्ता को एक नए स्तर पर ले जाना चाहते हैं। हम परीक्षण के तीन प्रमुख स्तरों का विश्लेषण करेंगे: यूनिट, इंटीग्रेशन और E2E, आधुनिक टूल का उपयोग करते हुए: MockK, Testcontainers और Ktor Client। आप सीखेंगे कि ऐसे टेस्ट कैसे लिखें जो केवल "पास" नहीं होते, बल्कि वास्तव में आपके कोड को रिग्रेशन से बचाते हैं।
\n\n1. यूनिट-टेस्टिंग: MockK के साथ अलगाव और मॉक
\nयूनिट-टेस्ट परीक्षण पिरामिड की नींव हैं। उन्नत स्तर पर, हम केवल फ़ंक्शन की जाँच नहीं करते, बल्कि मॉक का उपयोग करके ऑब्जेक्ट्स के बीच जटिल इंटरैक्शन का परीक्षण करते हैं। कोटलिन में इसके लिए सबसे अच्छी लाइब्रेरी MockK है।
\n\n1.1. MockK की उन्नत क्षमताएँ
\nMockito के विपरीत, 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का उपयोग करें।
1.2. लैम्ब्डा और एक्सटेंशन-फ़ंक्शन का परीक्षण
\nMockK एक्सटेंशन फ़ंक्शन को मॉक करने की अनुमति देता है, जो Ktor या Spring WebFlux जैसे फ्रेमवर्क के लिए महत्वपूर्ण है:
\nclass 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\n2. इंटीग्रेशन टेस्टिंग: डेटाबेस और Testcontainers
\nइंटीग्रेशन टेस्ट जाँचते हैं कि आपका कोड वास्तविक निर्भरताओं: डेटाबेस, मैसेज क्यू, बाहरी API के साथ कैसे इंटरैक्ट करता है। यहाँ Testcontainers मदद करता है — एक लाइब्रेरी जो परीक्षणों के दौरान Docker कंटेनरों को चालू करती है।
\n\n2.1. PostgreSQL के साथ Testcontainers सेटअप
\nSpring Boot एप्लिकेशन के लिए यह इस प्रकार दिखता है:
\n
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
Kotlin में डिज़ाइन पैटर्न: उदाहरणों के साथ उन्नत स्तर
2025 में Java: शुरुआती लोगों के लिए शून्य से पूर्ण गाइड
Java के साथ GraphQL API: व्यावहारिक चरण-दर-चरण ट्यूटोरियल
PHP में उपयोगकर्ता इनपुट को कैसे सैनिटाइज़ करें: 7 घातक त्रुटियाँ और उनके समाधान
C++ में कार्यात्मक प्रोग्रामिंग: उन्नत तकनीकें और उदाहरण