Code Coverage ในการพัฒนาแอปมือถือ: คืออะไร ตัวชี้วัด และวิธีวัด

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-04-09 เวลาอ่าน: 9 นาที

Code Coverage (ความครอบคลุมโค้ด) เป็นตัวชี้วัดที่แสดงเปอร์เซ็นต์ของซอร์สโค้ดของแอปพลิเคชันที่ถูกดำเนินการระหว่างการทดสอบ ช่วยกำหนดคุณภาพของการทดสอบ ระบุส่วนที่ไม่ได้รับการตรวจสอบ และจัดลำดับความสำคัญในการเขียนทดสอบใหม่ ตามข้อมูลของ Atlassian, 2025 ระดับความครอบคลุมที่เหมาะสมที่สุด คือ 70–80% — เหนือเกณฑ์นี้ ต้นทุนการทดสอบเริ่มเกินกว่าผลประโยชน์

ประเด็นสำคัญ

  • Code Coverage — ตัวชี้วัดที่วัดเปอร์เซ็นต์ของโค้ดที่ดำเนินการโดยการทดสอบ
  • ตัวชี้วัดความครอบคลุม รวมถึงบรรทัด (line), สาขา (branch), ฟังก์ชัน, เงื่อนไข และเส้นทาง
  • เครื่องมือ: JaCoCo สำหรับ Android, XCCov สำหรับ iOS, SonarQube สำหรับการวิเคราะห์โค้ด
  • ความครอบคลุมเป้าหมาย 70–80% — ความสมดุลระหว่างคุณภาพและต้นทุนการทดสอบ
  • การบูรณาการ CI/CD ช่วยให้บล็อกบิลด์เมื่อความครอบคลุมลดลงต่ำกว่าเกณฑ์

Code Coverage คืออะไร

Code Coverage (ความครอบคลุมโค้ด) เป็นตัวชี้วัดเชิงปริมาณที่กำหนดว่าส่วนใดของซอร์สโค้ดของแอปพลิเคชันถูกดำเนินการระหว่างการทดสอบ โดยแสดงเป็นเปอร์เซ็นต์และคำนวณเป็นอัตราส่วนของบรรทัด/สาขาที่ดำเนินการต่อทั้งหมด ความครอบคลุมสูงไม่ได้รับประกันว่าไม่มีบัก แต่ลดความเสี่ยงของข้อผิดพลาดที่ไม่ถูกตรวจพบ

ทำไมต้องวัดความครอบคลุม

ความครอบคลุมโค้ดช่วยทีมในการ: ค้นหา ส่วนที่ไม่ได้ทดสอบ ของโค้ด ตัดสินใจเกี่ยวกับลำดับความสำคัญในการเขียนทดสอบ และติดตามพลวัตของคุณภาพการทดสอบใน CI/CD ในการพัฒนาแอปมือถือ ความครอบคลุมมีความสำคัญเป็นพิเศษสำหรับตรรกะทางธุรกิจ โมเดลข้อมูล และพื้นที่เก็บข้อมูล — ชั้นที่มีความน่าจะเป็นของข้อผิดพลาดสูงที่สุด

ความเข้าใจผิดเกี่ยวกับ Code Coverage

ความเข้าใจผิดที่พบบ่อย: “100% ความครอบคลุม = คุณภาพที่สมบูรณ์แบบ” ในทางปฏิบัติ ความครอบคลุม 100% นั้นหายากมากและมักได้มาด้วยต้นทุนของการทดสอบผิวเผิน ความครอบคลุมที่มีประสิทธิภาพ ไม่ใช่การแข่งขันเพื่อเปอร์เซ็นต์ แต่เป็นการครอบคลุมเชิงกลยุทธ์ของเส้นทางวิกฤตและกรณีขอบเขต ความครอบคลุมไม่ได้บอกอะไรเกี่ยวกับคุณภาพของการทดสอบเอง: การทดสอบอาจผ่านแต่ไม่ตรวจสอบความถูกต้องของผลลัพธ์

ตัวชี้วัดความครอบคลุมโค้ด

มีตัวชี้วัด Code Coverage หลายตัว แต่ละตัววัดแง่มุมต่างๆ ของการทดสอบ Line coverage (ความครอบคลุมบรรทัด) เป็นตัวชี้วัดที่ง่ายที่สุด แสดงเปอร์เซ็นต์ของบรรทัดโค้ดที่ดำเนินการ Branch coverage (ความครอบคลุมสาขา) วัดว่าสาขา if-else และ switch ใดบ้างที่ถูกทดสอบ

ความครอบคลุมบรรทัด (Line Coverage)

Line coverage นับแต่ละบรรทัดของซอร์สโค้ดว่าดำเนินการหรือไม่ หากบรรทัดมีโอเปอเรเตอร์แบบมีเงื่อนไขหรือลูป บรรทัดนั้นถือว่าดำเนินการหากการควบคุมมาถึงบรรทัดนั้น แม้ว่าจะไม่ใช่ทุกสาขาที่ถูกประมวลผล นี่เป็นตัวชี้วัดที่ เข้มงวดน้อยที่สุด แต่เข้าใจง่ายที่สุดสำหรับการประเมินด้วยสายตา

ความครอบคลุมสาขา (Branch Coverage)

Branch coverage ประเมินว่า สาขา ที่เป็นไปได้ทั้งหมดในโค้ดถูกทดสอบหรือไม่ สำหรับแต่ละ if-else ทั้งสองสาขาจะถูกพิจารณา: true และ false สำหรับ switch แต่ละ case จะถูกพิจารณา Branch coverage ถือเป็นตัวชี้วัดที่เข้มงวดกว่า line coverage และมักเปิดเผยสถานการณ์ที่ไม่ได้รับการทดสอบมากกว่า

ตัวชี้วัดวัดอะไรความยากในการบรรลุ
Lineเปอร์เซ็นต์ของบรรทัดโค้ดที่ดำเนินการต่ำ
Branchเปอร์เซ็นต์ของสาขาที่ดำเนินการ (if/else, switch)ปานกลาง
Functionเปอร์เซ็นต์ของฟังก์ชันและเมธอดที่ถูกเรียกต่ำ
Conditionเปอร์เซ็นต์ของนิพจน์ย่อยเชิงตรรกะ (&&, ||)สูง

ความครอบคลุมเส้นทาง (Path Coverage)

Path coverage เป็นตัวชี้วัดที่เข้มงวดที่สุด ซึ่งต้องการการตรวจสอบ การรวมกัน ที่เป็นไปได้ทั้งหมดของสาขาในฟังก์ชัน ในทางปฏิบัติ path coverage ไม่ค่อยถูกใช้เนื่องจากการเติบโตแบบทวีคูณของจำนวนการรวมกัน: ฟังก์ชันที่มี 10 สาขามี 1024 เส้นทางที่เป็นไปได้

เครื่องมือวัดความครอบคลุม

ในการพัฒนาแอปมือถือ มีการใช้เครื่องมือต่างๆ เพื่อวัด Code Coverage ขึ้นอยู่กับแพลตฟอร์ม สำหรับ Android มาตรฐานคือ JaCoCo (Java Code Coverage) ซึ่งทำงานร่วมกับ Gradle และรองรับทั้งการทดสอบหน่วยและการทดสอบเครื่องมือวัด สำหรับ iOS จะใช้ XCCov ซึ่งอยู่ใน Xcode

JaCoCo สำหรับ Android

JaCoCo สร้างรายงานในรูปแบบ HTML, XML และ CSV รายงาน HTML จะเน้นบรรทัดด้วยสี: สีเขียว — ดำเนินการแล้ว, สีแดง — ข้ามไป, สีเหลือง — ดำเนินการบางส่วน รายงาน XML เข้ากันได้กับ SonarQube และระบบวิเคราะห์โค้ดอื่นๆ JaCoCo รองรับการกรองคลาส: สามารถยกเว้นโค้ดที่สร้างขึ้น, databinding และ BuildConfig

groovy
// build.gradle — การกำหนดค่า JaCoCo
android {
    buildTypes {
        debug {
            testCoverageEnabled = true
        }
    }
}

// สร้างรายงาน JaCoCo
task jacocoTestReport(type: JacocoReport) {
    dependsOn 'testDebugUnitTest'
    reports {
        xml.enabled = true
        html.enabled = true
    }
}

XCCov สำหรับ iOS

XCCov เป็นเครื่องมือใน Xcode สำหรับวัดความครอบคลุมโค้ด เปิดใช้งานผ่าน Gather coverage data ในสคีมาการทดสอบ XCCov รองรับความครอบคลุมสำหรับ Swift และ Objective-C สร้างรายงานในรูปแบบ .xccovreport และทำงานร่วมกับ CI ผ่าน xcodebuild -enableCodeCoverage YES ข้อมูลจะแสดงในคอนโซลและสามารถส่งออกเป็น JSON

SonarQube และ Codecov

สำหรับการตรวจสอบความครอบคลุมแบบรวมศูนย์ จะใช้แพลตฟอร์มเช่น SonarQube (การวิเคราะห์คุณภาพโค้ด + ความครอบคลุม), Codecov และ Coveralls บริการเหล่านี้รวบรวมข้อมูลจาก JaCoCo และ XCCov แสดงแนวโน้ม ประตูคุณภาพ และการบูรณาการกับ GitHub/GitLab ผ่านความคิดเห็น PR

วิธีปรับปรุงความครอบคลุมโค้ด

การปรับปรุง Code Coverage ต้องใช้แนวทางที่เป็นระบบ: ไม่ใช่ “เพิ่มเปอร์เซ็นต์” แต่ ครอบคลุมความเสี่ยง ขั้นตอนแรกคือการวิเคราะห์รายงาน JaCoCo หรือ XCCov — ระบุคลาสสีแดง (ที่ไม่ครอบคลุม) ลำดับความสำคัญ: ตรรกะทางธุรกิจ → พื้นที่เก็บข้อมูล → ViewModel → ส่วนประกอบ UI

กลยุทธ์ TDD

การพัฒนาที่ขับเคลื่อนด้วยการทดสอบ (TDD) ช่วยให้มีความครอบคลุมสูงโดยอัตโนมัติ เนื่องจากการทดสอบถูกเขียนก่อนการดำเนินการ กระบวนการ: สีแดง (เขียนทดสอบที่ล้มเหลว) → สีเขียว (เขียนโค้ดน้อยที่สุด) → รีแฟกเตอร์ TDD สร้างวินัยให้กับนักพัฒนา บังคับให้ครอบคลุมกรณีขอบเขตและสถานการณ์พิเศษที่มักไม่ได้รับการทดสอบ

การทดสอบแบบกำหนดพารามิเตอร์

การทดสอบแบบกำหนดพารามิเตอร์หนึ่งรายการแทนที่การทดสอบทั่วไปหลายสิบรายการ JUnit และ XCTest รองรับการกำหนดพารามิเตอร์: @ParameterizedTest ใน JUnit 5, XCTestCase กับ testPerformanceExample ใน XCTest การกำหนดพารามิเตอร์ช่วยให้ตรวจสอบ ข้อมูลนำเข้า หลายรายการโดยไม่ต้องทำโค้ดซ้ำ ซึ่งขยายความครอบคลุมของสาขาและเงื่อนไขได้อย่างมาก

kotlin
// การทดสอบแบบกำหนดพารามิเตอร์ใน Kotlin ด้วย JUnit 5
@ParameterizedTest
@ValueSource(strings = ["user@test.com", "admin@test.com", "test@example.com"])
fun `validate email returns true for valid addresses`(email: String) {
    val result = EmailValidator.isValid(email)
    Assertions.assertTrue(result)
}

ข้อผิดพลาดในการทำงานกับ Code Coverage

ข้อผิดพลาดที่พบบ่อยที่สุดคือ การไล่ตามเปอร์เซ็นต์ โดยไม่วิเคราะห์คุณภาพของการทดสอบ ทีมเริ่มเขียนทดสอบเพื่อการทดสอบ: ตรวจสอบ getter และ setter ทำซ้ำความครอบคลุมในระดับต่างๆ ทดสอบเมธอดเล็กน้อย สิ่งนี้ให้เปอร์เซ็นต์สูงแต่ไม่ปรับปรุงคุณภาพที่แท้จริง

ความรู้สึกปลอดภัยที่ผิดพลาด

Code Coverage สูงสามารถสร้างความรู้สึกผิดพลาดว่าแอปพลิเคชันได้รับการทดสอบอย่างดี การทดสอบอาจดำเนินการบรรทัดโค้ดแต่ไม่ตรวจสอบ ความถูกต้องของผลลัพธ์ ตัวอย่างเช่น: การทดสอบเรียกเมธอดคำนวณส่วนลดแต่ไม่ตรวจสอบจำนวนเงิน — บรรทัดถูกดำเนินการ ความครอบคลุมเพิ่มขึ้น แต่บักไม่ถูกพบ

การละเลยกรณีขอบเขต

ข้อผิดพลาดทั่วไปคือการทดสอบเฉพาะ “เส้นทางแห่งความสุข” (happy path) และละเลย กรณีขอบเขต: รายการว่าง ค่า null จำนวนสูงสุด รูปแบบที่ไม่ถูกต้อง บักส่วนใหญ่เกิดขึ้นที่ขอบเขตและข้อยกเว้น Branch coverage ช่วยระบุสาขาที่พลาดไป แต่ไม่รับประกันการตรวจสอบค่าขอบเขต

การทดสอบมิวเทชัน — การตรวจสอบคุณภาพการทดสอบ

การทดสอบมิวเทชัน (Mutation Testing) เป็นวิธีการประเมินคุณภาพการทดสอบโดยการนำมิวเทชัน (ข้อผิดพลาดเทียม) เข้าไปในซอร์สโค้ดและตรวจสอบว่าการทดสอบล้มเหลวหรือไม่ Pitest เป็นเครื่องมือทดสอบมิวเทชันยอดนิยมสำหรับ Java และ Kotlin หากการทดสอบไม่ล้มเหลวเมื่อมีการมิวเทชัน แสดงว่าการทดสอบไม่ได้ตรวจสอบเงื่อนไขนั้น

หลักการทำงานของ Pitest

Pitest สร้างมิวแทนต์ — สำเนาที่แก้ไขของซอร์สโค้ดที่ เช่น > ถูกแทนที่ด้วย >=, true ถูกแทนที่ด้วย false หรือการเรียกเมธอดถูกลบออก จากนั้นสำหรับแต่ละมิวแทนต์ การทดสอบจะถูกเรียกใช้ หากการทดสอบ ผ่าน — มิวแทนต์รอดชีวิต หมายความว่าการทดสอบไม่ครอบคลุมสถานการณ์นั้น หากการทดสอบล้มเหลว — มิวแทนต์ถูกฆ่า การทดสอบถูกต้อง

groovy
// build.gradle — การกำหนดค่า Pitest
plugins {
    id 'info.solidsoft.pitest' version '1.15.0'
}

pitest {
    targetClasses = ['com.example.app.*']
    targetTests = ['com.example.app.*Test']
    threads = 4
    outputFormats = ['HTML', 'XML']
    mutationThreshold = 80
    coverageThreshold = 85
}

ประเภทของมิวเทชัน

Pitest รองรับมิวเทชันหลายประเภท: การเปลี่ยนโอเปอเรเตอร์แบบมีเงื่อนไข (== → !=, < → <=), การลบการเรียกเมธอด, การแทนที่ค่าที่ส่งคืน (true → false), การเปลี่ยนการดำเนินการทางคณิตศาสตร์ (+ → -), มิวเทชันการเพิ่มค่า (i++ → i--) ยิ่งประเภทของมิวเทชันถูกฆ่าโดยการทดสอบมากเท่าใด ชุดการทดสอบก็ยิ่ง น่าเชื่อถือ มากขึ้นเท่านั้น

เป้าหมายคะแนนมิวเทชัน

คะแนนมิวเทชันเป้าหมายคือ 80% ขึ้นไป ซึ่งหมายความว่า 80% ของข้อผิดพลาดเทียมถูกตรวจพบโดยการทดสอบ ความครอบคลุมโค้ด (Code Coverage) 90% ไม่ได้รับประกันว่าการทดสอบจะพบบัก — การทดสอบมิวเทชันให้การประเมินที่เป็นกลางมากขึ้น Pitest สามารถบูรณาการใน CI เป็นประตูคุณภาพ โดยบล็อกบิลด์เมื่อคะแนนมิวเทชันลดลงต่ำกว่าเกณฑ์

การบูรณาการ Code Coverage ใน CI/CD

สำหรับการควบคุม Code Coverage อัตโนมัติใน CI/CD จะใช้ประตูคุณภาพ (Quality Gate) — ค่าเกณฑ์ที่เมื่อถูกละเมิด บิลด์จะถูกทำเครื่องหมายว่าไม่เสถียรหรือถูกปฏิเสธ SonarQube อนุญาตให้กำหนดค่าประตูคุณภาพตามการรวมกันของตัวชี้วัด: ความครอบคลุม (≥80%), จำนวนบัก, ช่องโหว่ และโค้ดที่ซ้ำกัน

การตั้งค่าประตูคุณภาพใน GitHub Actions

ใน GitHub Actions Code Coverage ถูกรวมผ่านขั้นตอนการดำเนินการ: เรียกใช้การทดสอบด้วยความครอบคลุม → อัปโหลดรายงานไปยัง Codecov → ตรวจสอบเกณฑ์ Codecov จะแสดงความคิดเห็นใน PR โดยอัตโนมัติพร้อมความแตกต่างของความครอบคลุม แสดงว่าบรรทัดใดเปลี่ยนแปลงและส่งผลต่อเปอร์เซ็นต์โดยรวมอย่างไร หากความครอบคลุมลดลง PR จะถูกบล็อกจนกว่าจะมีการเขียนทดสอบเพิ่มเติม

yaml
# GitHub Actions — อัปโหลดความครอบคลุมไปยัง Codecov
- name: Run Tests with Coverage
  run: ./gradlew testDebugUnitTest jacocoTestReport

- name: Upload to Codecov
  uses: codecov/codecov-action@v4
  with:
    files: ./app/build/reports/jacoco/jacocoTestReport.xml
    flags: unittests
    fail_ci_if_error: true

- name: Check Coverage Threshold
  run: |
    coverage=$(grep -oP 'branchCoverage="\K[0-9.]+' report.xml)
    if (( $(echo "$coverage < 80" | bc -l) )); then
      echo "Coverage $coverage% is below 80% threshold"
      exit 1
    fi

การรายงานและการแสดงผล

รายงาน HTML จาก JaCoCo และ XCCov มีการเน้นความครอบคลุมด้วยสี: สีเขียว — บรรทัดที่ดำเนินการ, สีแดง — ยังไม่ได้ดำเนินการ SonarQube แสดงเพิ่มเติมถึงความครอบคลุมในระดับไฟล์ คลาส เมธอด และบรรทัด รวมถึงประวัติการเปลี่ยนแปลงความครอบคลุมตามสปรินต์ สิ่งนี้ช่วยในการตัดสินใจเกี่ยวกับการรีแฟกเตอร์และการเพิ่มการทดสอบ

คำถามที่พบบ่อย

เปอร์เซ็นต์ของ Code Coverage เท่าใดที่ถือว่าดี?

สำหรับโปรเจกต์มือถือ ความครอบคลุม 70–80% สำหรับตรรกะทางธุรกิจและ 50–60% สำหรับส่วนประกอบ UI ถือว่าดี สูงกว่า 80% ต้นทุนการทดสอบเริ่มเกินกว่าผลประโยชน์ สิ่งสำคัญคือต้องจำไว้ว่าเปอร์เซ็นต์ไม่ใช่เป้าหมาย แต่เป็นตัวบ่งชี้ และโมดูลต่างๆ อาจมีระดับเป้าหมายที่แตกต่างกัน

ความแตกต่างระหว่าง Line และ Branch Coverage คืออะไร?

Line Coverage แสดงจำนวน บรรทัดโค้ด ที่ถูกดำเนินการ Branch Coverage แสดงจำนวนสาขา (if-else, switch) ที่ถูกทดสอบ บรรทัดที่มี if อาจถูกดำเนินการ แต่เฉพาะสาขา true ที่อาจถูกทดสอบ ไม่ใช่ false Branch Coverage เข้มงวดกว่าและเปิดเผยสถานการณ์ที่พลาดไปมากกว่า

จะบูรณาการ Code Coverage ใน CI/CD ได้อย่างไร?

ใน CI/CD ความครอบคลุมถูกรวมผ่าน ประตูคุณภาพ (Quality Gate): บิลด์จะถูกบล็อกหากความครอบคลุมต่ำกว่าเกณฑ์ สำหรับ Android ใช้ JaCoCo + SonarQube สำหรับ iOS — xcodebuild -enableCodeCoverage กับการแยกวิเคราะห์ .xccovreport GitHub Actions มีการดำเนินการพร้อมสำหรับ Codecov

สามารถวัดความครอบคลุมสำหรับ Jetpack Compose ได้หรือไม่?

ได้ JaCoCo รองรับ Jetpack Compose ผ่านกลไกความครอบคลุม JVM มาตรฐาน อย่างไรก็ตาม โค้ด Compose มีนิพจน์ lambda ที่สร้างขึ้นจำนวนมากซึ่ง JaCoCo อาจไม่ครอบคลุมทั้งหมด แนะนำให้ยกเว้นโค้ด Compose ที่สร้างขึ้นจากรายงานผ่านตัวกรอง

จะหลีกเลี่ยงความครอบคลุมปลอมได้อย่างไร?

ความครอบคลุมปลอมเกิดขึ้นเมื่อการทดสอบดำเนินการโค้ดแต่ไม่ตรวจสอบ ผลลัพธ์ วิธีแก้ไข: เขียนการตรวจสอบ assert สำหรับทุกสถานการณ์สำคัญ ใช้การทดสอบมิวเทชัน (Pitest) เพื่อตรวจสอบคุณภาพการทดสอบ วิเคราะห์ไม่เพียงแค่เปอร์เซ็นต์แต่รวมถึงสาขาที่ครอบคลุม

สรุป

  • Code Coverage — ตัวชี้วัดที่แสดงเปอร์เซ็นต์ของโค้ดที่ดำเนินการโดยการทดสอบ แต่ไม่รับประกันว่าไม่มีบัก
  • Line และ Branch coverage — ตัวชี้วัดหลัก; Branch เข้มงวดกว่าและเปิดเผยสาขาที่ไม่ได้รับการทดสอบ
  • JaCoCo — เครื่องมือมาตรฐานสำหรับ Android, XCCov — สำหรับ iOS ทั้งสองทำงานร่วมกับ Gradle และ Xcode
  • ความครอบคลุมเป้าหมาย 70–80% สำหรับตรรกะทางธุรกิจ — ความสมดุลที่เหมาะสมระหว่างคุณภาพและต้นทุน
  • TDD และการกำหนดพารามิเตอร์ — วิธีที่มีประสิทธิภาพในการเพิ่มความครอบคลุมโดยไม่ทำการทดสอบซ้ำ
  • SonarQube และ Codecov — แพลตฟอร์มสำหรับการตรวจสอบแบบรวมศูนย์และประตูคุณภาพใน CI/CD
  • กฎหลัก: อย่าไล่ตามเปอร์เซ็นต์ แต่ครอบคลุมความเสี่ยงที่สำคัญและกรณีขอบเขต

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม