اختبار E2E لتطبيقات Kotlin: من الصفر إلى الإنتاج

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

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

ابدأ الدورة

لماذا اختبار E2E هو أفضل صديق لك (وكيف تتعامل معه في Kotlin)

\n\n

تخيل: لقد كتبت خدمة رائعة بلغة Kotlin، كل شيء تم تجميعه، اختبارات الوحدة خضراء، مراجعة الكود تمت. تقوم بالنشر في الإنتاج، و... يشكو المستخدمون من أن زر "شراء" لا يعمل، على الرغم من أن اختبارات الوحدة اختبرته. مألوف؟ مرحبًا بك في عالم حيث اختبار E2E لتطبيقات Kotlin ليس رفاهية، بل ضرورة.

\n\n

الاختبار الشامل (end-to-end) هو التحقق من مسار المستخدم بالكامل: من النقر على زر إلى التسجيل في قاعدة البيانات والعودة. في هذه المقالة، لن نتحدث فقط عن النظرية. سنكتب اختبارات حقيقية لتطبيق Kotlin، ونحلل الأدوات، ونوضح كيف لا تفقد صوابك عند إعداد البنية التحتية. استعد، سيكون هناك كود وقهوة.

\n\n

ما هو اختبار E2E وكيف يختلف عن الأنواع الأخرى

\n\n

دعنا نضع النقاط على الحروف فورًا. يختبر اختبار E2E (أو الشامل) النظام بأكمله كما يراه المستخدم. على عكس:

\n\n
    \n
  • اختبارات الوحدة — تختبر طريقة/فئة واحدة بشكل منفصل.
  • \n
  • الاختبارات التكاملية — تختبر التفاعل بين مكونين أو ثلاثة (مثل وحدة التحكم + الخدمة).
  • \n
  • اختبارات واجهة المستخدم — غالبًا ما يتم الخلط بينها وبين E2E، لكن اختبار واجهة المستخدم قد لا يختبر الواجهة الخلفية، بل فقط عرض الواجهة.
  • \n
\n\n

اختبار E2E لتطبيقات Kotlin هو دورة كاملة: واجهة المستخدم (إن وجدت)، API، منطق الأعمال، قاعدة البيانات، الخدمات الخارجية. يجب أن يعمل كل شيء معًا كالساعة.

\n\n

أدوات اختبار E2E في Kotlin

\n\n

يعتمد اختيار الأداة على ما تختبره: تطبيق Android، خدمة ويب على Ktor، أو تطبيق سطح المكتب. إليك الأفضل لمطور Kotlin:

\n\n
    \n
  • Selenide + Kotlin — لواجهات الويب. غلاف فوق Selenium، لكن مع بناء جملة موجز، مثالي لـ Kotlin.
  • \n
  • Ktor Client + TestContainers — للواجهة الخلفية. قم بتشغيل البنية التحتية للاختبار (قاعدة بيانات، ذاكرة تخزين مؤقت) في Docker وأرسل طلبات HTTP.
  • \n
  • Espresso + Compose Test — لنظام Android. أدوات أصلية تأتي مع Android SDK.
  • \n
  • Cucumber + Kotlin — إذا كنت بحاجة إلى سيناريوهات BDD بلغة مفهومة للعميل.
  • \n
\n\n

سنركز على السيناريوهين الأولين، حيث أنهما الأكثر شمولاً.

\n\n

كتابة اختبار E2E لتطبيق ويب بلغة Kotlin (Selenide)

\n\n

لنفترض أن لدينا متجرًا بسيطًا عبر الإنترنت على Spring Boot + Kotlin. نحتاج إلى التحقق من السيناريو: يدخل المستخدم إلى الموقع، ويضيف منتجًا إلى سلة التسوق، ويقدم الطلب.

\n\n

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

\n\n
dependencies {\n    testImplementation("com.codeborne:selenide:6.19.1")\n    testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")\n    testImplementation("io.github.bonigarcia:webdrivermanager:5.6.2")\n}
\n\n

الآن لنكتب الاختبار نفسه. لاحظ: نستخدم دوال الامتداد (extension functions) في Kotlin لجعل الكود قابلاً للقراءة:

\n\n
import com.codeborne.selenide.Condition.visible\nimport com.codeborne.selenide.Selenide.`$`\nimport com.codeborne.selenide.Selenide.open\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass ShopE2ETest {\n\n    @BeforeEach\n    fun setUp() {\n        // فتح المتصفح قبل كل اختبار\n        open("https://test-shop.example.com")\n    }\n\n    @Test\n    fun `يمكن للمستخدم إضافة منتج إلى السلة وإتمام الشراء`() {\n        // الخطوة 1: العثور على المنتج وإضافته إلى السلة\n        `$`("[data-testid='product-1']").shouldBe(visible).click()\n        `$`("[data-testid='add-to-cart']").click()\n\n        // الخطوة 2: التحقق من أن السلة ليست فارغة\n        `$`("[data-testid='cart-badge']").shouldHave(text("1"))\n\n        // الخطوة 3: الانتقال إلى إتمام الشراء\n        `$`("[data-testid='checkout-btn']").click()\n\n        // الخطوة 4: ملء النموذج\n        `$`("[                

المدونات

توصيات الكتب