Kotlin में परीक्षण: यूनिट, इंटीग्रेशन, E2E शुरू से अंत तक
\n\nKotlin में आधुनिक विकास के लिए परीक्षण के लिए एक व्यवस्थित दृष्टिकोण की आवश्यकता होती है। चाहे आप Ktor पर बैकएंड लिख रहे हों या Android के लिए मोबाइल एप्लिकेशन, परीक्षणों के साथ गुणवत्तापूर्ण कोड कवरेज परियोजना की स्थिरता और पूर्वानुमान की कुंजी है। इस लेख में, हम परीक्षण के तीन स्तरों को कवर करेंगे: मॉड्यूलर (यूनिट), इंटीग्रेशन और एंड-टू-एंड (E2E) परीक्षण। आप सीखेंगे कि किन उपकरणों का उपयोग करना है, Kotlin में प्रभावी परीक्षण कैसे लिखना है और सामान्य गलतियों से कैसे बचना है।
\n\n1. Kotlin में यूनिट-परीक्षण: मूलभूत आधार
\n\nयूनिट-टेस्ट बाहरी निर्भरताओं से अलग करके व्यक्तिगत फ़ंक्शन, क्लास या विधियों के काम की जाँच करते हैं। Kotlin में, इसके लिए अक्सर JUnit 5 फ्रेमवर्क का उपयोग मॉक लाइब्रेरी MockK के साथ किया जाता है।
\n\nप्रोजेक्ट सेटअप
\n\nbuild.gradle.kts में निर्भरताएँ जोड़ें:
dependencies {\n testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")\n testImplementation("io.mockk:mockk:1.13.8")\n}\n\n\nयूनिट-टेस्ट का उदाहरण
\n\nमान लीजिए कि हमारे पास छूट की गणना के लिए एक सरल सेवा है:
\n\nclass DiscountService {\n fun applyDiscount(price: Double, discountPercent: Int): Double {\n require(discountPercent in 0..100) { "छूट प्रतिशत 0 से 100 के बीच होना चाहिए" }\n return price * (100 - discountPercent) / 100\n }\n}\n\n\nइस सेवा के लिए परीक्षण:
\n\nimport org.junit.jupiter.api.Assertions.*\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass DiscountServiceTest {\n\n private val service = DiscountService()\n\n @Test\n fun `applyDiscount 50 प्रतिशत छूट की सही गणना करता है`() {\n val result = service.applyDiscount(1000.0, 50)\n assertEquals(500.0, result, 0.001)\n }\n\n @Test\n fun `applyDiscount गलत प्रतिशत पर अपवाद फेंकता है`() {\n assertThrows<IllegalArgumentException> {\n service.applyDiscount(100.0, 150)\n }\n }\n}\n\n\nसुझाव: अपवादों की जाँच के लिए assertThrows का उपयोग करें और परीक्षणों को स्पष्ट स्ट्रिंग से नाम दें - इससे रिपोर्ट की पठनीयता में सुधार होता है।
MockK के साथ मॉकिंग
\n\nजब आपकी क्लास अन्य घटकों (जैसे, रिपॉजिटरी या API) पर निर्भर करती है, तो मॉक का उपयोग करें:
\n\nclass OrderService(private val paymentGateway: PaymentGateway) {\n fun processOrder(amount: Double): String {\n if (paymentGateway.charge(amount)) {\n return "सफलतापूर्वक भुगतान किया गया"\n }\n return "भुगतान में त्रुटि"\n }\n}\n\n// परीक्षण\n@Test\nfun `processOrder सफल भुगतान पर सफलता लौटाता है`() {\n val mockGateway = mockk<PaymentGateway>()\n every { mockGateway.charge(any()) } returns true\n\n val service = OrderService(mockGateway)\n val result = service.processOrder(500.0)\n\n assertEquals("सफलतापूर्वक भुगतान किया गया", result)\n verify { mockGateway.charge(500.0) }\n}\n\n\n2. इंटीग्रेशन परीक्षण: घटकों के बीच बातचीत की जाँच
\n\nइंटीग्रेशन टेस्ट जाँचते हैं कि सिस्टम के विभिन्न भाग एक साथ कैसे काम करते हैं: डेटाबेस, बाहरी API, फ़ाइल सिस्टम। Kotlin के लिए, Testcontainers एकदम सही है - परीक्षणों के दौरान Docker कंटेनर चलाने के लिए एक लाइब्रेरी।
\n\nPostgreSQL डेटाबेस के साथ उदाहरण
\n\nनिर्भरताएँ जोड़ें:
\n\ntestImplementation("org.testcontainers:testcontainers:1.19.3")\ntestImplementation("org.testcontainers:postgresql:1.19.3")\n\n\nDAO-लेयर के लिए एक परीक्षण लिखें:
\n\nclass UserRepositoryIntegrationTest {\n\n companion object {\n private val postgres = PostgreSQLContainer<Nothing>("postgres:15").apply {\n withDatabaseName("testdb")\n withUsername("test")\n withPassword("test")\n start()\n