مقدمة: لماذا الاختبارات "الخضراء" مجرد وهم؟
\n\nتقوم بتشغيل الاختبارات، وترى الشريط الأخضر المنشود وتشعر وكأنك بطل خارق. ولكن ماذا لو أخبرتك أن اختباراتك قد تكون عديمة الفائدة؟ أنها تختبر سطرًا واحدًا فقط من كل عشرة، بينما التسعة الأخرى هي "منطقة ميتة" تعيش فيها الأخطاء؟ هنا يأتي دور تغطية الكود بالاختبارات (code coverage). إنها ليست مجرد أرقام للتقرير، بل هي رادارك الشخصي الذي يوضح مدى جودة "تغطية" الاختبارات لشفرة Kotlin الخاصة بك.
\n\nفي هذه المقالة، سنشرح كيفية تحويل تغطية الكود في Kotlin من مقياس ممل إلى أداة قوية. ستتعرف على الأدوات التي تعمل حقًا، ومعنى النسب المئوية، وكيف لا تقع في فخ "تغطية 100%". هيا بنا!
\n\nما هي تغطية الكود ولماذا هي مهمة لـ Kotlin؟
\n\nتخيل أن شفرتك هي ملعب جولف، والاختبارات هي اللاعبون. تغطية الكود هي خريطة توضح المناطق التي مر بها اللاعبون في الملعب. إذا تجنب اللاعبون حفرة رملية خطيرة (خوارزمية معقدة)، فستعرف ذلك.
\n\nفي عالم Kotlin، حيث نستخدم غالبًا coroutines وsealed classes وextension-functions، يمكن للاختبارات الساذجة أن تفوت بسهولة فروعًا كاملة من المنطق. تساعد مقاييس التغطية في الإجابة على ثلاثة أسئلة:
\n- \n
- ما هي النسبة المئوية لأسطر الكود التي تم تنفيذها أثناء الاختبارات؟ \n
- ما هي الشروط (if/else, when) التي تم اختبارها؟ \n
- ما هي الدوال التي بقيت دون اهتمام؟ \n
بدون هذه المقاييس، فإنك تخاطر بإصدار كود إلى الإنتاج يعمل "فقط أيام الاثنين".
\n\nأدوات قياس التغطية في Kotlin: أفضل 3 أدوات
\n\nفي نظام Kotlin البيئي، هناك ثلاثة أبطال رئيسيين سيساعدونك في قياس code coverage. دعنا نتعرف على كل منهم.
\n\n1. JaCoCo (Java Code Coverage) — المخضرم
\nالأداة الأكثر شيوعًا. تعمل على مستوى byte-code، لذا فهي مناسبة لكل من Java وKotlin. ميزتها الرئيسية هي الإحصائيات الغنية والتكامل مع CI/CD.
\n\nكيفية إضافته في Gradle (Kotlin DSL):
\nplugins {\n id("jacoco")\n}\n\ntasks.jacocoTestReport {\n dependsOn(tasks.test) // تشغيل الاختبارات قبل التقرير\n reports {\n xml.required.set(true)\n html.required.set(true) // إنشاء تقرير HTML جميل\n }\n}\n\nبعد تشغيل ./gradlew jacocoTestReport، ستحصل على ملف HTML حيث يتم تمييز الأسطر غير المغطاة باللون الأحمر. مريح، أليس كذلك؟
2. Kover — اللاعب الحديث
\nمصمم خصيصًا لـ Kotlin. على عكس JaCoCo، يعمل Kover على مستوى AST (شجرة التركيب المجرد)، مما يجعله أكثر دقة للبنى الخاصة بـ Kotlin (مثل الدوال المضمنة).
\n\nإضافة Kover:
\nplugins {\n id("org.jetbrains.kotlinx.kover") version "0.7.3"\n}\n\nkover {\n excludeSourceSets {\n names("test") // استبعاد الاختبارات نفسها من التقرير\n }\n}\n\nينشئ Kover تقارير بتنسيقات HTML وXML وحتى شارات لـ GitHub. إنه الخيار الأمثل لمشروع Kotlin الخالص.
\n\n3. IntelliJ IDEA Coverage — للفحص السريع
\nأداة مدمجة. تقوم بتشغيل الاختبارات مع التغطية (الأيقونة الخضراء "Run with Coverage") وترى الكود ملونًا مباشرة في IDE. مريحة للتطوير المحلي، ولكن ليس لـ CI.
\n\nنصيحة: استخدم IntelliJ للتكرار السريع، وJaCoCo أو Kover للتقرير النهائي.
\n\nمقاييس تغطية الكود: ماذا تعني هذه النسب المئوية؟
\n\nعندما ترى "تغطية 80%"، يبدو هذا رائعًا. ولكن 80% من ماذا؟ دعنا نشرح المقاييس الرئيسية التي تقدمها جميع الأدوات.
\n\nLine Coverage (تغطية الأسطر)
\nأبسط مقياس. كم عدد أسطر الكود المصدري التي تم تنفيذها بواسطة الاختبارات. إذا لم يتم تنفيذ السطر ولو مرة واحدة، فإنه يعتبر غير مغطى.
\nمثال:
\nfun process(value: Int): String {\n if (