ดูรายงานการครอบคลุมของโค้ด (ด้วย Agent ในอุปกรณ์)

ปลั๊กอิน 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