הפלאגין של Android Gradle (AGP) יכול ליצור דוחות על רמת הכיסוי של הקוד בבדיקות אינסטרומנטציה באמצעות סוכן כיסוי במכשיר. כברירת מחדל, הפלאגין של Android ל-Gradle (AGP) מוסיף למחלקות של האפליקציה את JaCoCo כשהוא יוצר את האפליקציה. כלומר, הוא מוסיף קוד שמתעד את החלקים באפליקציה שבהם הבדיקות פועלות. כשמשתמשים בסוכן הכיסוי במכשיר, AGP יוצר את האפליקציה בלי הקוד הנוסף הזה, והסוכן מנתח את המחלקות של האפליקציה במכשיר הבדיקה בזמן שהבדיקות פועלות. בדף הזה מוסבר איך להפעיל את רמת הכיסוי של הקוד במכשיר וליצור דוחות.
בהשוואה לרמת הכיסוי של הקוד בזמן ה-build, רמת הכיסוי של הקוד במכשיר מציעה את היתרונות הבאים:
- תהליכי build מהירים יותר: AGP לא מריץ את שלב האינסטרומנטציה של JaCoCo על המחלקות של האפליקציה והתלויות שלהן, מה שיכול לקצר את זמני ה-build ב-10% עד 20%.
- קובצי APK קטנים יותר לניפוי באגים: AGP לא מוסיף קוד למעקב אחרי כיסוי למחלקות של האפליקציה, וכך קובץ ה-APK לניפוי באגים יכול להיות קטן יותר ב-20-25%.
- אין מחלקות שנוצרו ולא נעשה בהן שימוש בדוחות: מחלקות שנוצרו ולא נעשה בהן שימוש בבדיקות לא מורידות את מספרי הכיסוי.
השיפורים בפועל בזמן ה-build ובגודל ה-APK תלויים בפרויקט שלכם.
דרישות מוקדמות
כדי להשתמש ברמת הכיסוי של הקוד במכשיר, צריך לוודא שהפרויקט ומכשירי הבדיקה עומדים בדרישות הבאות:
- AGP מגרסה 9.6.0-alpha01 ואילך.
- מכשיר או אמולטור עם Android מגרסה 9 (רמת API 28) ומעלה.
- סוג build שניתן לבצע בו ניפוי באגים לווריאנט שאתם בודקים, כמו סוג ה-build שמוגדר כברירת מחדל
debug. הסוכן יכול לצרף רק אפליקציות שניתן לבצע בהן ניפוי באגים. - בדיקות עם כלים שפועלות עם
AndroidJUnitRunnerאו עם כלי בדיקה בהתאמה אישית שמרחיב אותו.
הפעלת רמת הכיסוי של הקוד במכשיר
רמת הכיסוי של הקוד במכשיר משתמשת באותו מאפיין enableAndroidTestCoverage כמו רמת הכיסוי של הקוד בזמן ה-build. מגדירים את enableAndroidTestCoverage לערך true בקובצי ה-build ברמת המודול לכל וריאנט שרוצים לקבל עבורו דוחות כיסוי:
Kotlin
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage = true
}
}
}
מגניב
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage true
}
}
}
לאחר מכן, מפעילים את סוכן הכיסוי במכשיר ואת צבירת הדוחות בקובץ gradle.properties של הפרויקט:
android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true
דוח ה-HTML של רמת הכיסוי של הקוד במכשיר נוצר באמצעות אותו רכיב רינדור כמו דוחות מאוחדים של רמת הכיסוי של הקוד, ולכן נדרשים שני המאפיינים.
יצירת דוחות על רמת הכיסוי של הקוד במכשיר
כדי להריץ את בדיקות האינסטרומנטציה וליצור דוחות כיסוי, מחברים מכשיר או מפעילים אמולטור, ואז מריצים את המשימה הבאה:
| היקף הכיסוי | פקודה | דיווח על מיקום |
|---|---|---|
| וריאנט אחד | ./gradlew :module-name:createVariantNameAndroidTestCoverageReport |
path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html |
ההבדלים בין רמת הכיסוי של הקוד בזמן ה-build לבין רמת הכיסוי של הקוד בזמן הריצה
דוחות הכיסוי במכשיר ובזמן ה-build יכולים להציג תוצאות שונות לאותן בדיקות. חשוב לשים לב להבדלים הבאים כשמשווים בין שני הדוחות, או כשמעבירים את ספי הכיסוי מאחד לשני:
| אזור | רמת הכיסוי של הקוד בזמן ה-build | רמת הכיסוי של הקוד במכשיר |
|---|---|---|
| מתי מתבצעת מדידה של מחלקות | כש-AGP יוצר את האפליקציה באמצעות JaCoCo, | במכשיר הבדיקה בזמן שהבדיקות פועלות, באמצעות סוכן הכיסוי |
| הכיתות בדוח | כל הכיתות במודול | רק המחלקות במרחב השמות של המודול שנטענות בזמן שהבדיקות פועלות, כך שאחוזי הכיסוי יכולים להיות גבוהים יותר |
| מספר ההוראות | הוראות Java bytecode | הוראות לבייטקוד של DEX |
| מספר הסניפים | הסתעפויות בקוד בייט של Java | הסתעפויות בבייטקוד (bytecode) של DEX. D8 יכול לקמפל תנאים לענפים שונים, וכל כלי משמיט ענפים שונים שנוצרו על ידי הקומפיילר, כך שהספירות יכולות להיות שונות. |
| מונים | הוראות, הסתעפויות, שורות, מורכבות, שיטות ומחלקות | הוראות, הסתעפויות, שורות, שיטות ומחלקות. עדיין אין תמיכה במונים של מורכבות. |
| מכשירי בדיקה | כל רמות ה-API שהאפליקציה תומכת בהן | Android מגרסה 9 (רמת API 28) ואילך |
| נתוני כיסוי גולמיים | .ec קבצים |
coverage_metadata.pb ו-coverage_hits.pb קבצים |
כדי לחזור לרמת הכיסוי של הקוד בזמן ה-build, מגדירים את המאפיין android.experimental.androidTest.coverage.useOnDeviceAgent=false או מסירים אותו. אין צורך לשנות את קובצי ה-build או את המשימות שאתם מריצים.
בעיות מוכרות
אלה הבעיות המוכרות שקשורות לרמת הכיסוי של הקוד במכשיר:
- מחלקות שלא נטענות: מחלקות שלא נטענות אף פעם בזמן שהבדיקות פועלות לא מופיעות בדוח. בדוחות על רמת הכיסוי של הקוד בזמן ה-build, הם מופיעים עם 0% כיסוי.
- דוחות מצטברים: אם הפרויקט שלכם אוסף גם נתוני כיסוי מבדיקות מארח, כמו בדיקות יחידה, דוח הכיסוי המצטבר שנוצר על ידי המשימות
testAllSuitesו-testAllSuitesWithDependenciesמשלב את ספירות ה-bytecode של Java מהבדיקות האלה עם ספירות ה-bytecode של DEX מהסוכן. בגלל ההבדלים בין השניים, המספרים המצטברים של ההוראות וההסתעפויות יכולים להיות שונים מהמספרים בדוחות של רמת הכיסוי של הקוד בזמן ה-build.
לשלוח משוב ולדווח על בעיות אחרות דרך Issue Tracker.