افزونه Android Gradle (AGP) میتواند گزارشهای پوشش کد را برای آزمایشهای ابزاردار شما با عامل پوشش دروندستگاهی ایجاد کند. بهطور پیشفرض، AGP کلاسهای برنامهتان را با JaCoCo هنگام ساخت برنامهتان ابزارسازی میکند، به این معنی که کدی را اضافه میکند که ثبت میکند کدام بخشهای برنامهتان آزمایشهای شما را اجرا میکنند. با عامل پوشش دروندستگاهی، AGP برنامه شما را بدون این کد اضافی میسازد و عامل، کلاسهای برنامه شما را در دستگاه آزمایشی درحین اجرای آزمایشهای شما ابزاربندی میکند. این صفحه نحوه فعال کردن پوشش کد دروندستگاهی و تولید گزارش را شرح میدهد.
درمقایسه با پوشش کد زمان ساخت، پوشش کد دروندستگاهی مزایای زیر را ارائه میدهد:
- ساختهای سریعتر: AGP مرحله ابزار دقیق JaCoCo را در کلاسهای برنامهتان و وابستگیهای آنها اجرا نمیکند، که میتواند زمان ساخت را ۱۰ تا ۲۰ درصد کاهش دهد.
- فایلهای APK اشکالزدایی کوچکتر: AGP کد ردیابی پوشش را به کلاسهای برنامهتان اضافه نمیکند، که میتواند فایل APK اشکالزدایی شما را ۲۰ تا ۲۵ درصد کوچکتر کند.
- کلاسهای تولیدشده استفادهنشده در گزارشها وجود ندارد: کلاسهای تولیدشدهای که آزمایشهای شما از آنها استفاده نمیکنند، اعداد پوشش شما را کاهش نمیدهند.
زمان ساخت واقعی و بهبود اندازه APK به پروژه شما بستگی دارد.
پیشنیازها
برای استفاده از پوشش کد دروندستگاهی، مطمئن شوید که پروژه و دستگاههای آزمایشی شما پیشنیازهای زیر را داشته باشند:
- AGP 9.6.0-alpha01 یا بالاتر.
- دستگاه یا شبیهسازی که Android نسخه ۹ (سطح میانای برنامهسازی کاربردی ۲۸) یا بالاتر را اجرا میکند.
- نوع ساخت قابلاشکالزدایی برای متغیری که آزمایش میکنید، مثل نوع ساخت پیشفرض
debug. عامل فقط میتواند به برنامههای قابلاشکالزدایی متصل شود. - آزمایشهای ابزاری که با
AndroidJUnitRunnerیا اجراکننده آزمایش سفارشی که آن را گسترش میدهد اجرا میشوند.
فعال کردن پوشش کد دروندستگاهی
پوشش کد دروندستگاهی از همان ویژگی enableAndroidTestCoverage استفاده میکند که
پوشش کد زمان ساخت استفاده میکند. enableAndroidTestCoverage را روی true در
فایلهای ساخت سطح ماژول برای هر متغیری که میخواهید گزارشهای پوشش را برای آن دریافت کنید تنظیم کنید:
کاتلین
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 |
تفاوتها با پوشش کد زمان ساخت
گزارشهای پوشش دروندستگاهی و زمان ساخت میتوانند نتایج متفاوتی را برای آزمایشهای یکسان نشان دهند. هنگام مقایسه این دو گزارش یا هنگام انتقال آستانههای پوشش از یکی به دیگری، تفاوتهای زیر را درنظر داشته باشید:
| مساحت | پوشش کد زمان ساخت | پوشش کد دروندستگاهی |
|---|---|---|
| وقتی کلاسها ابزاربندی شده باشند | وقتی AGP بااستفاده از JaCoCo برنامه شما را میسازد | در دستگاه آزمایشی درحین اجرای آزمایشها، بااستفاده از عامل پوشش |
| کلاسهای موجود در گزارش | همه کلاسهای موجود در واحد شما | فقط کلاسهای موجود در فضای نام واحد شما که هنگام اجرای آزمایشهایتان بار میشوند، بنابراین درصد پوشش میتواند بالاتر باشد |
| تعداد دستورالعملها | دستورالعملهای بایتکد جاوا | دستورالعملهای بایتکد DEX |
| تعداد شعبه | شاخهها در بایتکد جاوا | شاخهها در بایتکد DEX. D8 میتواند شرایط را در شاخههای مختلف کامپایل کند و هر ابزار شاخههای مختلف تولیدشده توسط کامپایلر را حذف میکند، بنابراین تعداد میتواند متفاوت باشد. |
| شمارندهها | دستورالعملها، شاخهها، خطوط، پیچیدگی، روشها، و کلاسها | دستورالعملها، شاخهها، خطوط، روشها، و کلاسها. هنوز از شمارندههای پیچیدگی پشتیبانی نمیشود. |
| دستگاههای آزمایشی | همه سطوح میانای برنامهسازی کاربردی که برنامهتان پشتیبانی میکند | Android 9 (سطح API ۲۸) و بالاتر |
| دادههای پوشش خام | .ec فایل |
coverage_metadata.pb و coverage_hits.pb فایل |
برای برگشتن به پوشش کد زمان ساخت،
android.experimental.androidTest.coverage.useOnDeviceAgent=false را تنظیم کنید یا
ویژگی را بردارید. نیازی نیست فایلهای ساخت یا تکالیفی را که اجرا میکنید تغییر دهید.
مشکلات شناختهشده
پوشش کد دروندستگاهی مشکلات شناختهشده زیر را دارد:
- کلاسهایی که بار نمیشوند: کلاسهایی که هرگز درطول اجرای آزمایشهایتان بار نمیشوند در گزارش نشان داده نمیشوند. گزارشهای پوشش کد زمان ساخت آنها را با پوشش ۰٪ فهرست میکند.
- گزارشهای انبوهشی: اگر پروژه شما پوشش را از آزمایشهای میزبان (مثل آزمایشهای واحد) نیز جمعآوری میکند، گزارش پوشش انبوهشی که تکالیف
testAllSuitesوtestAllSuitesWithDependenciesایجاد میکنند، تعداد بایتکد Java از آن آزمایشها را با تعداد بایتکد DEX از عامل ترکیب میکند. بهدلیل تفاوتهای بین این دو، دستورالعمل انبوهشی و شمارههای شاخه میتوانند با شمارههای موجود در گزارشهای پوشش کد زمان ساخت متفاوت باشند.
هرگونه بازخورد و مشکل دیگر را ازطریق ردیاب مشکل گزارش کنید.