أشارك في تطوير مشروع Apache Ignite مفتوح المصدر ، أثناء العمل على المشروع ، أصبح من المثير للاهتمام بالنسبة لي تقييم تغطية الاختبار وهذا ما جاء به.

تغطية الاختبارات هي المقياس الأكثر شيوعًا المستخدم في تقييم جودة اختبار المنتج.
هذا أحد المقاييس القليلة التي تسمح لك بتحديد المجالات التي تتطلب الانتباه بسبب خطر عدم وجود خطأ ، وكذلك إعطاء الأولوية للعمل على الوحدات أو مكونات المشروع.
إن أسهل طريقة للحصول على تقرير كامل حول تقييم التغطية الاختبارية لمشروع Java هي استخدام عداء التغطية المدمج في IntelliJ IDEA . يسمح لك بتكوين مجموعة من المقاييس ببضع نقرات وتشغيل الاختبارات مع إنشاء التقارير اللاحقة.
الاختبار في مشروع Apache Ignite
يستخدم مشروع Apache Ignite إطار الاختبار الخاص به للاختبار ، والذي تم تنفيذه على أساس JUnit 3. في وقت كتابة هذا التقرير ، تحتوي وحدة المشروع الأساسية على ما يقرب من 82 ألف اختبار ، معظمها مكونات مكونة وتتطلب رفع مجموعة من عدة عقد ، بما في ذلك JVMs مختلفة. مع ما يصاحب ذلك من إعداد للبيئة.
من الجدير بالذكر أن ضمان تشغيل مثل قاعدة الانحدار الضخمة هذه ليست مهمة سهلة. يراقب المجتمع باستمرار حالة المنتج ويصحح الأخطاء الموجودة كجزء من مبادرة Make Teamcity Green Again .
لا تسمح ميزات المشروع المشار إليها بتشغيل جميع الاختبارات مرة واحدة في JVM واحد للأسباب التالية:
- خطأ محتمل OutOfMemoryError ؛
- احتمال تحطم JVM ؛
- الجمود المحتمل ؛
- عدم القدرة على بدء الاختبار بسبب عقدة غير متوقفة في الاختبار السابق ؛
- سيستغرق التشغيل ثلاثة أيام على جهاز كمبيوتر واحد.
كل هذا يجعل من المستحيل استخدام IntelliJ IDEA للحصول على تقرير حول جميع اختبارات المشروع ويتطلب نهجًا خاصًا لحل المشكلة.
إعداد وإجراء تقييم تغطية الاختبار
بناءً على العمل المنجز ، تم اختيار الطريقة الأكثر موثوقية لإكمال المهمة ، والتي تحتوي على الخطوات التالية:
- تحديد مجموعة من فئات الاختبار ؛
- التنفيذ لكل صف اختبار:
2.1. بدء وتشغيل مجموعة من الاختبارات الصفية في JVM منفصلة مع جهاز توقيت للرقابة التي ستنهي الخيط في حالة تجميد أو مشاكل في الاختبارات ؛
2.2. عمليات الحصول على مقاييس تغطية الاختبار وحفظها ؛
2.3. تنظيف البيئة عند الانتهاء من الاختبارات ؛ - دمج جميع المقاييس التي تم الحصول عليها في الفقرة 2 ؛
- إنشاء تقرير كامل.
هناك العديد من الأدوات لتقييم تغطية الاختبار ، وأكثرها شيوعًا هي:
لن أسهب في الحديث عن اختلافاتهم ؛ حيث يتم عرض جدول مرئي يقارن قدرات أدوات تقييم تغطية الاختبار هنا .
لحل المشكلة ، تم اختيار مكتبة JaCoCo لتتمكن من تضمين الحل في TeamCity ، والذي تقوم عليه البنية التحتية الاختبارية الحالية لمشروع Apache Ignite . يمكن TeamCity العمل خارج منطقة الجزاء مع JaCoCo .
لأتمتة الخوارزمية الموصوفة ، تم استخدام نص bash و Maven . يتم تنفيذ تكوين البرنامج المساعد Jacoco Maven من خلال ملف تعريف Maven منفصل في pom.xml.
ملف تعريف تكوين البرنامج المساعد JaCoCo موضح أدناه وينطوي على فصل إلى بدايتين منفصلتين:
- أجرِ الاختبارات مع وكيل JaCoCo (وكيل التجهيز ) المتصل لجمع مقاييس تغطية الاختبار. سيتم تمرير خاصية "runDirectory" بواسطة البرنامج النصي عند بدء التشغيل ، مما سيسمح بحفظ نتائج عمليات التشغيل بشكل منفصل ؛
- دمج نتائج التشغيل ( الدمج ) وإنشاء التقرير ( التقرير ).
تكوين مخضرم JaCoCo<profile> <id>coverage</id> <properties> <argLine> -ea \ -server \ -Xms1g \ -Xmx6g \ -XX:+HeapDumpOnOutOfMemoryError \ -XX:+AggressiveOpts \ -DIGNITE_UPDATE_NOTIFIER=false \ -DIGNITE_NO_DISCO_ORDER=true \ -DIGNITE_PERFORMANCE_SUGGESTIONS_DISABLED=true \ -DIGNITE_QUIET=false \ -Djava.net.preferIPv4Stack=true \ </argLine> <coverage.dataFile>${runDirectory}/coverage-reports/jacoco-ut.exec</coverage.dataFile> <coverage.outputDir>${runDirectory}/jacoco-ut</coverage.outputDir> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> </configuration> <executions> <execution> <id>default-test</id> <phase>test</phase> <goals> <goal>test</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.1</version> <executions> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${coverage.dataFile}</destFile> </configuration> </execution> <execution> <id>post-merge</id> <phase>validate</phase> <goals> <goal>merge</goal> </goals> <configuration> <fileSets> <fileSet> <directory>${basedir}</directory> <includes> <include>results/*/coverage-reports/jacoco-ut.exec</include> </includes> </fileSet> </fileSets> <destFile>merged.exe</destFile> </configuration> </execution> <execution> <id>generate-report</id> <phase>validate</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>${basedir}/merged.exe</dataFile> <outputDirectory>${basedir}/coverage-report</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>
يوجد أدناه برنامج نصي يقوم بتنفيذ الخطوات الموضحة سابقًا.
استغرق تشغيل جميع الاختبارات مع تقييم التغطية حوالي 50 ساعة على خادم مخصص: 4 vCPU ، 8RAM ، 50 SSD ، Ubuntu x64 16.04 .
يمكن بسهولة موازنة النهج الموصوف مع العديد من المواقف ، إذا كانت الموارد متاحة ، مما سيقلل بشكل كبير من الوقت الذي يستغرقه التشغيل والحصول على تقييم لتغطية الاختبار. بعد تضمين هذا الحل في TeamCity ، يجب أن يستغرق وقت تقييم تغطية الاختبار حوالي ساعتين.
النتائج
وبحسب نتائج التقرير فإن تغطية تعليمات المشروع تبلغ حوالي 61٪.
تغطية التعليمات للمكونات الرئيسية:
- ذاكرة التخزين المؤقت - 66٪
- الاكتشاف - 57٪
- حوسبة - 60٪
- تيار - 51٪
- ثنائي - 68٪
- المعاملات - 71٪
بعد تحليل النتائج ، أصبح من الواضح أن كل الرمز الساخن قد تم تغطيته ، وكذلك رمز لإصلاح المشاكل النموذجية. مع وجود مجموعة أدوات كهذه ، سيكون من الممكن توسيع التغطية إلى حالات نادرة وغير نمطية ، مما يجعل المنتج أكثر موثوقية.
تقرير PS الكامل للمراجعة .