ปลั๊กอิน Android Gradle (AGP) สามารถสร้างรายงานการครอบคลุมของโค้ดสำหรับการทดสอบการวัดคุมด้วยเอเจนต์การครอบคลุมในอุปกรณ์ โดยค่าเริ่มต้น AGP จะใช้เครื่องมือวัดคลาสของแอปด้วย JaCoCo เมื่อสร้างแอป ซึ่งหมายความว่าจะเพิ่มโค้ดที่บันทึกส่วนต่างๆ ของแอปที่การทดสอบทำงาน เมื่อใช้เอเจนต์ความครอบคลุมในอุปกรณ์ AGP จะสร้างแอปโดยไม่มีโค้ดเพิ่มเติมนี้ และเอเจนต์จะวัดคลาสของแอปในอุปกรณ์ทดสอบขณะที่การทดสอบทำงาน หน้านี้อธิบายวิธีเปิดใช้การครอบคลุมของโค้ดในอุปกรณ์และสร้างรายงาน
เมื่อเทียบกับการครอบคลุมของโค้ดในเวลาบิลด์ การครอบคลุมของโค้ดในอุปกรณ์มีข้อดีดังต่อไปนี้
- บิลด์เร็วขึ้น: AGP ไม่เรียกใช้ขั้นตอนการวัด JaCoCo ในคลาสของแอปและทรัพยากร Dependency ซึ่งช่วยลดเวลาในการบิลด์ได้ 10-20%
- APK สำหรับแก้ไขข้อบกพร่องที่มีขนาดเล็กลง: AGP จะไม่เพิ่มโค้ดติดตามความครอบคลุมลงในคลาสของแอป ซึ่งจะทำให้ APK สำหรับแก้ไขข้อบกพร่องมีขนาดเล็กลง 20-25%
- ไม่มีคลาสที่สร้างขึ้นที่ไม่ได้ใช้ในรายงาน: คลาสที่สร้างขึ้นซึ่งการทดสอบของคุณไม่ได้ใช้จะไม่ลดตัวเลขความครอบคลุม
เวลาในการสร้างและขนาด APK ที่ลดลงจริงจะขึ้นอยู่กับโปรเจ็กต์ของคุณ
สิ่งที่ต้องมีก่อน
หากต้องการใช้การครอบคลุมของโค้ดในอุปกรณ์ โปรดตรวจสอบว่าโปรเจ็กต์และอุปกรณ์ทดสอบเป็นไปตามข้อกำหนดต่อไปนี้
- AGP 9.6.0-alpha01 ขึ้นไป
- อุปกรณ์หรือโปรแกรมจำลองที่ใช้ Android 9 (ระดับ API 28) ขึ้นไป
- ประเภทบิลด์ที่แก้ไขข้อบกพร่องได้สำหรับตัวแปรที่คุณทดสอบ เช่น ประเภทบิลด์
debugเริ่มต้น Agent จะแนบได้เฉพาะกับแอปที่แก้ไขข้อบกพร่องได้เท่านั้น - การทดสอบที่มีการวัดคุมซึ่งทำงานด้วย
AndroidJUnitRunnerหรือ Test Runner ที่กำหนดเองซึ่งขยายการทดสอบดังกล่าว
เปิดใช้การครอบคลุมของโค้ดในอุปกรณ์
การครอบคลุมของโค้ดในอุปกรณ์ใช้พร็อพเพอร์ตี้ enableAndroidTestCoverage เดียวกับการครอบคลุมของโค้ดในเวลาบิลด์ ตั้งค่า enableAndroidTestCoverage เป็น true ในไฟล์บิลด์ระดับโมดูลสำหรับแต่ละตัวแปรที่คุณต้องการรับรายงานความครอบคลุม ดังนี้
Kotlin
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage = true
}
}
}
ดึงดูด
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage true
}
}
}
จากนั้นเปิดใช้ Agent ความครอบคลุมในอุปกรณ์และการรวมรายงานในไฟล์ gradle.properties ของโปรเจ็กต์
android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true
การครอบคลุมของโค้ดในอุปกรณ์จะสร้างรายงาน HTML ด้วยโปรแกรมแสดงผลเดียวกับรายงานการครอบคลุมของโค้ดแบบรวม จึงต้องใช้พร็อพเพอร์ตี้ทั้ง 2 รายการ
สร้างรายงานการครอบคลุมของโค้ดในอุปกรณ์
หากต้องการเรียกใช้การทดสอบการวัดคุมและสร้างรายงานความครอบคลุม ให้เชื่อมต่ออุปกรณ์หรือเริ่มโปรแกรมจำลอง แล้วเรียกใช้งานต่อไปนี้
| ขอบเขตความครอบคลุม | คำสั่ง | ตำแหน่งที่รายงาน |
|---|---|---|
| 1 ตัวแปร | ./gradlew :module-name:createVariantNameAndroidTestCoverageReport |
path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html |
ความแตกต่างจากการครอบคลุมของโค้ดในเวลาบิลด์
รายงานความครอบคลุมในอุปกรณ์และเวลาบิลด์อาจแสดงผลลัพธ์ที่แตกต่างกันสำหรับการทดสอบเดียวกัน โปรดคำนึงถึงความแตกต่างต่อไปนี้เมื่อเปรียบเทียบรายงานทั้ง 2 รายงาน หรือเมื่อย้ายเกณฑ์ความครอบคลุมจากรายงานหนึ่งไปยังอีกรายงานหนึ่ง
| พื้นที่ | การครอบคลุมของโค้ดในเวลาบิลด์ | การครอบคลุมของโค้ดในอุปกรณ์ |
|---|---|---|
| เมื่อมีการใช้คลาส | เมื่อ AGP สร้างแอปโดยใช้ JaCoCo | ในอุปกรณ์ทดสอบขณะที่การทดสอบทำงานอยู่ โดยใช้เอเจนต์ความครอบคลุม |
| ชั้นเรียนในรายงาน | คลาสทั้งหมดในโมดูล | เฉพาะคลาสในเนมสเปซของโมดูลที่โหลดขณะที่การทดสอบทำงานอยู่ เพื่อให้เปอร์เซ็นต์ความครอบคลุมสูงขึ้น |
| จำนวนคำสั่ง | วิธีการเกี่ยวกับไบต์โค้ดของ Java | วิธีการเกี่ยวกับ DEX ไบต์โค้ด |
| Branch counts | Branch ในไบต์โค้ด Java | Branch ในไบต์โค้ด DEX D8 สามารถคอมไพล์เงื่อนไขเป็นสาขาต่างๆ และเครื่องมือแต่ละรายการจะละเว้นสาขาที่คอมไพเลอร์สร้างขึ้นแตกต่างกัน ดังนั้นจำนวนจึงอาจแตกต่างกัน |
| ตัวนับ | คำสั่ง, Branch, บรรทัด, ความซับซ้อน, เมธอด และคลาส | คำสั่ง, Branch, บรรทัด, เมธอด และคลาส ยังไม่รองรับตัวนับความซับซ้อน |
| อุปกรณ์ทดสอบ | ระดับ API ทั้งหมดที่แอปรองรับ | Android 9 (ระดับ API 28) ขึ้นไป |
| ข้อมูลดิบเกี่ยวกับการครอบคลุม | .ec ไฟล์ |
coverage_metadata.pb และไฟล์ coverage_hits.pb รายการ |
หากต้องการเปลี่ยนกลับไปใช้การครอบคลุมของโค้ดในเวลาบิลด์ ให้ตั้งค่า android.experimental.androidTest.coverage.useOnDeviceAgent=false หรือนำพร็อพเพอร์ตี้ออก คุณไม่จำเป็นต้องเปลี่ยนไฟล์บิลด์หรือภารกิจที่เรียกใช้
ปัญหาที่ทราบแล้ว
การครอบคลุมของโค้ดในอุปกรณ์มีปัญหาที่ทราบดังต่อไปนี้
- คลาสที่ไม่โหลด: คลาสที่ไม่เคยโหลดขณะที่การทดสอบทำงานจะไม่ปรากฏในรายงาน รายงานการครอบคลุมของโค้ดในเวลาบิลด์จะแสดงไฟล์เหล่านั้นโดยมีการครอบคลุม 0%
- รายงานที่รวบรวม: หากโปรเจ็กต์ของคุณรวบรวมความครอบคลุมจากการทดสอบโฮสต์ด้วย เช่น Unit Test รายงานความครอบคลุมที่รวบรวมซึ่งงาน
testAllSuitesและtestAllSuitesWithDependenciesสร้างขึ้นจะรวมจำนวนไบต์โค้ด Java จากการทดสอบเหล่านั้นกับจำนวนไบต์โค้ด DEX จาก Agent เนื่องจากความแตกต่างระหว่างทั้ง 2 อย่าง จำนวนคำสั่งและสาขาที่รวบรวมจึงอาจแตกต่างจากจำนวนในรายงานการครอบคลุมของโค้ดเวลาบิลด์
รายงานความคิดเห็นและปัญหาอื่นๆ ผ่านIssue Tracker