Kotest لـ Kotlin: دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

مقدمة عن Kotest: ما هو ولماذا تحتاجه

Kotest (المعروف سابقًا باسم KotlinTest) هو مكتبة قوية ومرنة لكتابة الاختبارات بلغة Kotlin. توفر للمطورين مجموعة غنية من الأدوات لاختبار الوحدات والتكامل والاختبارات الوظيفية. على عكس JUnit التقليدي، يقدم Kotest أنماطًا متعددة لكتابة الاختبارات (من النمط الكلاسيكي "xUnit" إلى التطوير القائم على السلوك BDD)، ودعمًا مدمجًا للاختبار القائم على الخصائص (property-based testing)، ومطابقات قوية (assertions)، وتكاملًا مع الأطر الشهيرة مثل Spring Boot وMockK وArrow.

لماذا تحتاج Kotest؟ في تطوير Kotlin الحديث، الاختبار ليس مجرد التحقق من الكود، بل هو أساس الجودة. يحل Kotest عدة مشاكل رئيسية:

  • مرونة الأنماط: يمكنك كتابة الاختبارات بأنماط مثل "String Spec" و"Fun Spec" و"Behavior Spec" وغيرها، واختيار الأنسب لفريقك.
  • مطابقات قوية: دوال التحقق المدمجة (shouldBe، shouldContain، shouldThrow) تجعل كود الاختبار مقروءًا وموجزًا.
  • الاختبار القائم على الخصائص: يتيح لك توليد آلاف من بيانات الاختبار العشوائية للتحقق من ثوابت الكود، وليس فقط القيم المحددة.
  • التكامل مع coroutines: يعمل Kotest بشكل ممتاز مع coroutines في Kotlin، مما يسمح باختبار الكود غير المتزامن دون تعقيد إضافي.
  • قابلية التوسع: يمكنك إنشاء مطابقات ومستمعين وإضافات خاصة بك.

تثبيت Kotest

يتم توزيع Kotest عبر Maven Central. للتثبيت، تحتاج إلى إضافة التبعيات إلى ملف build.gradle.kts (لـ Gradle) أو pom.xml (لـ Maven).

التثبيت عبر Gradle (build.gradle.kts)

// في قسم dependencies
dependencies {
    // الوحدة الأساسية (تتضمن المطابقات والأنماط الأساسية)
    testImplementation("io.kotest:kotest-runner-junit5:5.9.1")
    // وحدة الاختبار القائم على الخصائص
    testImplementation("io.kotest:kotest-property:5.9.1")
    // وحدة التكامل مع الأطر (مثل Spring)
    testImplementation("io.kotest:kotest-extensions-spring:5.9.1")
}

التثبيت عبر Maven (pom.xml)

<dependency>
    <groupId>io.kotest</groupId>
    <artifactId>kotest-runner-junit5</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.kotest</groupId>
    <artifactId>kotest-property</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>

ملاحظة: الإصدار 5.9.1 هو الأحدث وقت كتابة هذا المقال. تحقق دائمًا من أحدث إصدار على MVNRepository.

بداية سريعة مع مثال عملي

لنكتب اختبارًا بسيطًا لفئة آلة حاسبة باستخدام نمط "Fun Spec" — وهو أحد أكثر الأنماط شيوعًا وبديهية.

// الفئة التي سنختبرها
class Calculator {
    fun add(a: Int, b: Int): Int = a + b
    fun divide(a: Int, b: Int): Int {
        if (b == 0) throw ArithmeticException("القسمة على صفر")
        return a / b
    }
}

// فئة الاختبار
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldThrow

class CalculatorTest : FunSpec({
    // تهيئة الكائن المراد اختباره
    val calculator = Calculator()

    test("جمع عددين موجبين") {
        val result = calculator.add(2, 3)
        result shouldBe 5
    }

    test("القسمة على صفر يجب أن ترمي استثناء") {
        shouldThrow<ArithmeticException> {
            calculator.divide(10, 0)
        }
    }
})

يوضح هذا المثال البنية الأساسية: نقوم بإنشاء فئة ترث من Fun

توصيات