اختبارات Kotlin: الوحدة والتكامل والاختبارات الشاملة من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة
```html

مقدمة في الاختبار في Kotlin: من الوحدات إلى تجربة المستخدم

Kotlin هي لغة حديثة تُستخدم بنشاط لتطوير التطبيقات الخادمة (Ktor, Spring Boot)، وتطبيقات Android، والمشاريع متعددة المنصات. ومع ذلك، فإن جودة الكود مستحيلة بدون اختبار دقيق. في هذه المقالة، سنناقش ثلاثة مستويات رئيسية: اختبار unit (الوحدة)، integration (التكامل)، و e2e (الشامل). ستتعرف على الأدوات التي يجب استخدامها، وكيفية كتابة الاختبارات بلغة Kotlin، وكيفية بناء استراتيجية موثوقة لفحص تطبيقك.

1. اختبار Unit في Kotlin: أساس الاستقرار

تختبر اختبارات Unit الوظائف أو الفئات أو الطرق الفردية بمعزل عن التبعيات الخارجية. في Kotlin، يُستخدم لهذا الغالبًا JUnit 5 و MockK.

الأدوات والإعداد

أضف التبعيات في build.gradle.kts:

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
    testImplementation("io.mockk:mockk:1.13.8")
}

مثال لاختبار unit باستخدام MockK

لنفترض أن لدينا خدمة تعتمد على مستودع:

class UserService(private val repo: UserRepository) {
    fun getUserName(id: Int): String {
        val user = repo.findById(id)
        return user?.name ?: "Unknown"
    }
}

الاختبار باستخدام MockK:

import io.mockk.every
import io.mockk.mockk
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

class UserServiceTest {
    @Test
    fun `getUserName returns name when user exists`() {
        val mockRepo = mockk<UserRepository>()
        every { mockRepo.findById(1) } returns User(1, "Alice")
        val service = UserService(mockRepo)
        assertEquals("Alice", service.getUserName(1))
    }
}

أفضل الممارسات لاختبارات unit

  • اختبار واحد - فحص واحد (استخدم assert بحكمة).
  • اعزل التبعيات: استخدم الكائنات الوهمية (MockK) أو الكائنات البديلة (stubs).
  • سمِّ الاختبارات بوضوح: shouldReturnX_whenY.
  • اختبر الحالات الحدودية: null، القوائم الفارغة، الاستثناءات.

2. اختبار Integration: التحقق من ترابط المكونات

تتحقق اختبارات التكامل من كيفية عمل المكونات الحقيقية معًا: قاعدة البيانات، API، نظام الملفات. في Kotlin، يُستخدم لهذا بشكل ملائم Testcontainers و Ktor Client (إذا كنت تكتب خادمًا).

مثال: اختبار مستودع مع PostgreSQL

قم بتوصيل Testcontainers و exposed (مكتبة للعمل مع قواعد البيانات):

dependencies {
    testImplementation("org.testcontainers:postgresql:1.19.3")
    implementation("org.jetbrains.exposed:exposed:0.44.1")
}

اختبار لـ UserRepository:

import org.junit.jupiter.api.*
import org.testcontainers.containers.PostgreSQLContainer
import org.testcontainers.junit.jupiter.Container
import org.testcontainers.junit.jupiter.Testcontainers
import org.jetbrains.exposed.sql.*

@Testcontainers
class UserRepositoryIntegrationTest {

    @Container
    val postgres = PostgreSQLContainer<Nothing>("postgres:15").apply {
        withDatabaseName("testdb")
        withUsername("test")
        withPassword("test")
    }

    private lateinit var repo: UserRepository

    @BeforeEach
    fun setUp() {
        Database.connect(postgres.jdbcUrl, driver = "org.postgresql.Driver", user = postgres.username, password = postgres.password)
        transaction { SchemaUtils.create(Users) }
        repo = UserRepository()
    }

    @Test
    fun `save and find user by id`() {
        val user = User(1, "Bob")
        repo.save(user)
        val found = repo.findById(1)
        assertEquals("Bob", found?.name)
    }

    @AfterEach
```                

المدونات

توصيات الكتب