Kotlin में परीक्षण का परिचय: यूनिट-टेस्ट से end-to-end तक
परीक्षण विश्वसनीय सॉफ्टवेयर विकास का एक अनिवार्य हिस्सा है। Kotlin पारिस्थितिकी तंत्र में, जो Android विकास, Ktor पर बैकएंड और मल्टी-प्लेटफ़ॉर्म प्रोजेक्ट्स के लिए सक्रिय रूप से उपयोग किया जाता है, परीक्षण के सभी स्तरों के लिए शक्तिशाली उपकरण मौजूद हैं। इस लेख में, हम तीन प्रमुख स्तरों पर चर्चा करेंगे: यूनिट-टेस्ट, इंटीग्रेशन टेस्ट और end-to-end (e2e) टेस्ट। आप जानेंगे कि वे कैसे भिन्न हैं, उन्हें कब लागू करना है, और कोड उदाहरणों के साथ Kotlin में प्रभावी टेस्ट कैसे लिखें।
Kotlin में यूनिट-टेस्टिंग: विश्वसनीयता का आधार
यूनिट-टेस्ट अलग-अलग घटकों (फ़ंक्शन, क्लास) के काम को अलगाव में जांचते हैं। Kotlin में, डी-फैक्टो मानक JUnit 5 फ्रेमवर्क है जो MockK मॉक लाइब्रेरी के साथ जुड़ा हुआ है।
JUnit 5 और MockK के साथ यूनिट-टेस्ट का उदाहरण
डिस्काउंट गणना के लिए एक सरल सेवा पर विचार करें:
class DiscountService(private val userRepository: UserRepository) { fun calculateDiscount(userId: String, amount: Double): Double { val user = userRepository.findById(userId) ?: return amount return if (user.isPremium) amount * 0.9 else amount }}इस सेवा के लिए टेस्ट:
import io.mockk.everyimport io.mockk.mockkimport org.junit.jupiter.api.Testimport kotlin.test.assertEquals
class DiscountServiceTest {
@Test fun `should apply 10% discount for premium user`() { // Arrange val userRepo = mockk<UserRepository>() every { userRepo.findById("123") } returns User("123", isPremium = true) val service = DiscountService(userRepo)
// Act val result = service.calculateDiscount("123", 100.0)
// Assert assertEquals(90.0, result) }
@Test fun `should not apply discount for regular user`() { val userRepo = mockk<UserRepository>() every { userRepo.findById("456") } returns User("456", isPremium = false) val service = DiscountService(userRepo)
val result = service.calculateDiscount("456", 100.0)
assertEquals(100.0, result) }}मुख्य बिंदु:
- मॉक बनाने के लिए
mockk{}का उपयोग करें। every { ... } returns ...ब्लॉक मॉक के व्यवहार को परिभाषित करता है।- Arrange-Act-Assert संरचना टेस्ट को पढ़ने योग्य बनाती है।
- यूनिट-टेस्ट तेज़ी से चलने चाहिए और बाहरी संसाधनों पर निर्भर नहीं होने चाहिए।
इंटीग्रेशन टेस्टिंग: घटकों के बीच परस्पर क्रिया की जाँच
इंटीग्रेशन टेस्ट जाँचते हैं कि कई मॉड्यूल एक साथ कैसे काम करते हैं — उदाहरण के लिए, वास्तविक डेटाबेस या बाहरी API के साथ एक सेवा। Kotlin के लिए Testcontainers (Docker कंटेनरों के लिए) और Spring Boot Test (बैकएंड के लिए) लोकप्रिय हैं।
Testcontainers और Ktor के साथ इंटीग्रेशन टेस्ट का उदाहरण
मान लीजिए, हमारे पास PostgreSQL के साथ एक Ktor एप्लिकेशन है:
class UserRepository(private val database: Database) { suspend fun findById(id: String): User? { return database.query("SELECT * FROM users WHERE id = ?", id).singleOrNull { row -> User(row.string("id"), row.boolean("is_premium")) } }}Testcontainers के साथ इंटीग्रेशन टेस्ट:
import io.kotest.core.spec.style.StringSpecimport io.kotest.matchers.shouldBeimport org.testcontainers.containers.PostgreSQLContainerimport org.testcontainers.junit.jupiter.Containerimport org.testcontainers.junit.jupiter.Testcontainers
@Testcontainersclass UserRepositoryIntegrationTest : StringSpec({
@Container val postgres = PostgreSQLContainer<Nothing>("postgres:15").apply { withDatabaseName("testdb") withUsername("test") withPassword("test") }
"should