اختبارات Kotlin: الوحدة، التكامل، E2E — دليل شامل

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

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

ابدأ الدورة

مقدمة في الاختبار في Kotlin: من اختبارات الوحدة إلى اختبارات end-to-end

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



اختبار الوحدة في Kotlin: أساس الموثوقية

تتحقق اختبارات الوحدة من عمل المكونات الفردية (الدوال، الفئات) بشكل منعزل. في Kotlin، المعيار الفعلي هو إطار العمل JUnit 5 إلى جانب مكتبة المحاكاة (mocks) 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{} لإنشاء الكائنات المحاكاة (mocks).
  • الكتلة every { ... } returns ... تحدد سلوك الكائن المحاكي.
  • هيكل Arrange-Act-Assert يجعل الاختبارات قابلة للقراءة.
  • يجب أن تُنفذ اختبارات الوحدة بسرعة وألا تعتمد على الموارد الخارجية.


اختبار التكامل: التحقق من تفاعل المكونات

تتحقق اختبارات التكامل من كيفية عمل عدة وحدات معًا — على سبيل المثال، خدمة مع قاعدة بيانات حقيقية أو API خارجي. بالنسبة لـ Kotlin، تُستخدم بشكل شائع Testcontainers (لحاويات Docker) و Spring Boot Test (للخوادم الخلفية).



مثال على اختبار تكامل باستخدام Testcontainers و Ktor

لنفترض أن لدينا تطبيق Ktor مع PostgreSQL:

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

المدونات

توصيات الكتب