Code Coverage (ความครอบคลุมโค้ด) เป็นตัวชี้วัดที่แสดงเปอร์เซ็นต์ของซอร์สโค้ดของแอปพลิเคชันที่ถูกดำเนินการระหว่างการทดสอบ ช่วยกำหนดคุณภาพของการทดสอบ ระบุส่วนที่ไม่ได้รับการตรวจสอบ และจัดลำดับความสำคัญในการเขียนทดสอบใหม่ ตามข้อมูลของ Atlassian, 2025 ระดับความครอบคลุมที่เหมาะสมที่สุด คือ 70–80% — เหนือเกณฑ์นี้ ต้นทุนการทดสอบเริ่มเกินกว่าผลประโยชน์
ประเด็นสำคัญ
Code Coverage (ความครอบคลุมโค้ด) เป็นตัวชี้วัดเชิงปริมาณที่กำหนดว่าส่วนใดของซอร์สโค้ดของแอปพลิเคชันถูกดำเนินการระหว่างการทดสอบ โดยแสดงเป็นเปอร์เซ็นต์และคำนวณเป็นอัตราส่วนของบรรทัด/สาขาที่ดำเนินการต่อทั้งหมด ความครอบคลุมสูงไม่ได้รับประกันว่าไม่มีบัก แต่ลดความเสี่ยงของข้อผิดพลาดที่ไม่ถูกตรวจพบ
ความครอบคลุมโค้ดช่วยทีมในการ: ค้นหา ส่วนที่ไม่ได้ทดสอบ ของโค้ด ตัดสินใจเกี่ยวกับลำดับความสำคัญในการเขียนทดสอบ และติดตามพลวัตของคุณภาพการทดสอบใน CI/CD ในการพัฒนาแอปมือถือ ความครอบคลุมมีความสำคัญเป็นพิเศษสำหรับตรรกะทางธุรกิจ โมเดลข้อมูล และพื้นที่เก็บข้อมูล — ชั้นที่มีความน่าจะเป็นของข้อผิดพลาดสูงที่สุด
ความเข้าใจผิดที่พบบ่อย: “100% ความครอบคลุม = คุณภาพที่สมบูรณ์แบบ” ในทางปฏิบัติ ความครอบคลุม 100% นั้นหายากมากและมักได้มาด้วยต้นทุนของการทดสอบผิวเผิน ความครอบคลุมที่มีประสิทธิภาพ ไม่ใช่การแข่งขันเพื่อเปอร์เซ็นต์ แต่เป็นการครอบคลุมเชิงกลยุทธ์ของเส้นทางวิกฤตและกรณีขอบเขต ความครอบคลุมไม่ได้บอกอะไรเกี่ยวกับคุณภาพของการทดสอบเอง: การทดสอบอาจผ่านแต่ไม่ตรวจสอบความถูกต้องของผลลัพธ์
มีตัวชี้วัด Code Coverage หลายตัว แต่ละตัววัดแง่มุมต่างๆ ของการทดสอบ Line coverage (ความครอบคลุมบรรทัด) เป็นตัวชี้วัดที่ง่ายที่สุด แสดงเปอร์เซ็นต์ของบรรทัดโค้ดที่ดำเนินการ Branch coverage (ความครอบคลุมสาขา) วัดว่าสาขา if-else และ switch ใดบ้างที่ถูกทดสอบ
Line coverage นับแต่ละบรรทัดของซอร์สโค้ดว่าดำเนินการหรือไม่ หากบรรทัดมีโอเปอเรเตอร์แบบมีเงื่อนไขหรือลูป บรรทัดนั้นถือว่าดำเนินการหากการควบคุมมาถึงบรรทัดนั้น แม้ว่าจะไม่ใช่ทุกสาขาที่ถูกประมวลผล นี่เป็นตัวชี้วัดที่ เข้มงวดน้อยที่สุด แต่เข้าใจง่ายที่สุดสำหรับการประเมินด้วยสายตา
Branch coverage ประเมินว่า สาขา ที่เป็นไปได้ทั้งหมดในโค้ดถูกทดสอบหรือไม่ สำหรับแต่ละ if-else ทั้งสองสาขาจะถูกพิจารณา: true และ false สำหรับ switch แต่ละ case จะถูกพิจารณา Branch coverage ถือเป็นตัวชี้วัดที่เข้มงวดกว่า line coverage และมักเปิดเผยสถานการณ์ที่ไม่ได้รับการทดสอบมากกว่า
| ตัวชี้วัด | วัดอะไร | ความยากในการบรรลุ |
|---|---|---|
| Line | เปอร์เซ็นต์ของบรรทัดโค้ดที่ดำเนินการ | ต่ำ |
| Branch | เปอร์เซ็นต์ของสาขาที่ดำเนินการ (if/else, switch) | ปานกลาง |
| Function | เปอร์เซ็นต์ของฟังก์ชันและเมธอดที่ถูกเรียก | ต่ำ |
| Condition | เปอร์เซ็นต์ของนิพจน์ย่อยเชิงตรรกะ (&&, ||) | สูง |
Path coverage เป็นตัวชี้วัดที่เข้มงวดที่สุด ซึ่งต้องการการตรวจสอบ การรวมกัน ที่เป็นไปได้ทั้งหมดของสาขาในฟังก์ชัน ในทางปฏิบัติ path coverage ไม่ค่อยถูกใช้เนื่องจากการเติบโตแบบทวีคูณของจำนวนการรวมกัน: ฟังก์ชันที่มี 10 สาขามี 1024 เส้นทางที่เป็นไปได้
ในการพัฒนาแอปมือถือ มีการใช้เครื่องมือต่างๆ เพื่อวัด Code Coverage ขึ้นอยู่กับแพลตฟอร์ม สำหรับ Android มาตรฐานคือ JaCoCo (Java Code Coverage) ซึ่งทำงานร่วมกับ Gradle และรองรับทั้งการทดสอบหน่วยและการทดสอบเครื่องมือวัด สำหรับ iOS จะใช้ XCCov ซึ่งอยู่ใน Xcode
JaCoCo สร้างรายงานในรูปแบบ HTML, XML และ CSV รายงาน HTML จะเน้นบรรทัดด้วยสี: สีเขียว — ดำเนินการแล้ว, สีแดง — ข้ามไป, สีเหลือง — ดำเนินการบางส่วน รายงาน XML เข้ากันได้กับ SonarQube และระบบวิเคราะห์โค้ดอื่นๆ JaCoCo รองรับการกรองคลาส: สามารถยกเว้นโค้ดที่สร้างขึ้น, databinding และ BuildConfig
// build.gradle — การกำหนดค่า JaCoCo
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
// สร้างรายงาน JaCoCo
task jacocoTestReport(type: JacocoReport) {
dependsOn 'testDebugUnitTest'
reports {
xml.enabled = true
html.enabled = true
}
}
XCCov เป็นเครื่องมือใน Xcode สำหรับวัดความครอบคลุมโค้ด เปิดใช้งานผ่าน Gather coverage data ในสคีมาการทดสอบ XCCov รองรับความครอบคลุมสำหรับ Swift และ Objective-C สร้างรายงานในรูปแบบ .xccovreport และทำงานร่วมกับ CI ผ่าน xcodebuild -enableCodeCoverage YES ข้อมูลจะแสดงในคอนโซลและสามารถส่งออกเป็น JSON
สำหรับการตรวจสอบความครอบคลุมแบบรวมศูนย์ จะใช้แพลตฟอร์มเช่น SonarQube (การวิเคราะห์คุณภาพโค้ด + ความครอบคลุม), Codecov และ Coveralls บริการเหล่านี้รวบรวมข้อมูลจาก JaCoCo และ XCCov แสดงแนวโน้ม ประตูคุณภาพ และการบูรณาการกับ GitHub/GitLab ผ่านความคิดเห็น PR
การปรับปรุง Code Coverage ต้องใช้แนวทางที่เป็นระบบ: ไม่ใช่ “เพิ่มเปอร์เซ็นต์” แต่ ครอบคลุมความเสี่ยง ขั้นตอนแรกคือการวิเคราะห์รายงาน JaCoCo หรือ XCCov — ระบุคลาสสีแดง (ที่ไม่ครอบคลุม) ลำดับความสำคัญ: ตรรกะทางธุรกิจ → พื้นที่เก็บข้อมูล → ViewModel → ส่วนประกอบ UI
การพัฒนาที่ขับเคลื่อนด้วยการทดสอบ (TDD) ช่วยให้มีความครอบคลุมสูงโดยอัตโนมัติ เนื่องจากการทดสอบถูกเขียนก่อนการดำเนินการ กระบวนการ: สีแดง (เขียนทดสอบที่ล้มเหลว) → สีเขียว (เขียนโค้ดน้อยที่สุด) → รีแฟกเตอร์ TDD สร้างวินัยให้กับนักพัฒนา บังคับให้ครอบคลุมกรณีขอบเขตและสถานการณ์พิเศษที่มักไม่ได้รับการทดสอบ
การทดสอบแบบกำหนดพารามิเตอร์หนึ่งรายการแทนที่การทดสอบทั่วไปหลายสิบรายการ JUnit และ XCTest รองรับการกำหนดพารามิเตอร์: @ParameterizedTest ใน JUnit 5, XCTestCase กับ testPerformanceExample ใน XCTest การกำหนดพารามิเตอร์ช่วยให้ตรวจสอบ ข้อมูลนำเข้า หลายรายการโดยไม่ต้องทำโค้ดซ้ำ ซึ่งขยายความครอบคลุมของสาขาและเงื่อนไขได้อย่างมาก
// การทดสอบแบบกำหนดพารามิเตอร์ใน 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)
}
ข้อผิดพลาดที่พบบ่อยที่สุดคือ การไล่ตามเปอร์เซ็นต์ โดยไม่วิเคราะห์คุณภาพของการทดสอบ ทีมเริ่มเขียนทดสอบเพื่อการทดสอบ: ตรวจสอบ getter และ setter ทำซ้ำความครอบคลุมในระดับต่างๆ ทดสอบเมธอดเล็กน้อย สิ่งนี้ให้เปอร์เซ็นต์สูงแต่ไม่ปรับปรุงคุณภาพที่แท้จริง
Code Coverage สูงสามารถสร้างความรู้สึกผิดพลาดว่าแอปพลิเคชันได้รับการทดสอบอย่างดี การทดสอบอาจดำเนินการบรรทัดโค้ดแต่ไม่ตรวจสอบ ความถูกต้องของผลลัพธ์ ตัวอย่างเช่น: การทดสอบเรียกเมธอดคำนวณส่วนลดแต่ไม่ตรวจสอบจำนวนเงิน — บรรทัดถูกดำเนินการ ความครอบคลุมเพิ่มขึ้น แต่บักไม่ถูกพบ
ข้อผิดพลาดทั่วไปคือการทดสอบเฉพาะ “เส้นทางแห่งความสุข” (happy path) และละเลย กรณีขอบเขต: รายการว่าง ค่า null จำนวนสูงสุด รูปแบบที่ไม่ถูกต้อง บักส่วนใหญ่เกิดขึ้นที่ขอบเขตและข้อยกเว้น Branch coverage ช่วยระบุสาขาที่พลาดไป แต่ไม่รับประกันการตรวจสอบค่าขอบเขต
การทดสอบมิวเทชัน (Mutation Testing) เป็นวิธีการประเมินคุณภาพการทดสอบโดยการนำมิวเทชัน (ข้อผิดพลาดเทียม) เข้าไปในซอร์สโค้ดและตรวจสอบว่าการทดสอบล้มเหลวหรือไม่ Pitest เป็นเครื่องมือทดสอบมิวเทชันยอดนิยมสำหรับ Java และ Kotlin หากการทดสอบไม่ล้มเหลวเมื่อมีการมิวเทชัน แสดงว่าการทดสอบไม่ได้ตรวจสอบเงื่อนไขนั้น
Pitest สร้างมิวแทนต์ — สำเนาที่แก้ไขของซอร์สโค้ดที่ เช่น > ถูกแทนที่ด้วย >=, true ถูกแทนที่ด้วย false หรือการเรียกเมธอดถูกลบออก จากนั้นสำหรับแต่ละมิวแทนต์ การทดสอบจะถูกเรียกใช้ หากการทดสอบ ผ่าน — มิวแทนต์รอดชีวิต หมายความว่าการทดสอบไม่ครอบคลุมสถานการณ์นั้น หากการทดสอบล้มเหลว — มิวแทนต์ถูกฆ่า การทดสอบถูกต้อง
// 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 จะใช้ประตูคุณภาพ (Quality Gate) — ค่าเกณฑ์ที่เมื่อถูกละเมิด บิลด์จะถูกทำเครื่องหมายว่าไม่เสถียรหรือถูกปฏิเสธ SonarQube อนุญาตให้กำหนดค่าประตูคุณภาพตามการรวมกันของตัวชี้วัด: ความครอบคลุม (≥80%), จำนวนบัก, ช่องโหว่ และโค้ดที่ซ้ำกัน
ใน GitHub Actions Code Coverage ถูกรวมผ่านขั้นตอนการดำเนินการ: เรียกใช้การทดสอบด้วยความครอบคลุม → อัปโหลดรายงานไปยัง Codecov → ตรวจสอบเกณฑ์ Codecov จะแสดงความคิดเห็นใน PR โดยอัตโนมัติพร้อมความแตกต่างของความครอบคลุม แสดงว่าบรรทัดใดเปลี่ยนแปลงและส่งผลต่อเปอร์เซ็นต์โดยรวมอย่างไร หากความครอบคลุมลดลง PR จะถูกบล็อกจนกว่าจะมีการเขียนทดสอบเพิ่มเติม
# 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 แสดงเพิ่มเติมถึงความครอบคลุมในระดับไฟล์ คลาส เมธอด และบรรทัด รวมถึงประวัติการเปลี่ยนแปลงความครอบคลุมตามสปรินต์ สิ่งนี้ช่วยในการตัดสินใจเกี่ยวกับการรีแฟกเตอร์และการเพิ่มการทดสอบ
คำถามที่พบบ่อย
สำหรับโปรเจกต์มือถือ ความครอบคลุม 70–80% สำหรับตรรกะทางธุรกิจและ 50–60% สำหรับส่วนประกอบ UI ถือว่าดี สูงกว่า 80% ต้นทุนการทดสอบเริ่มเกินกว่าผลประโยชน์ สิ่งสำคัญคือต้องจำไว้ว่าเปอร์เซ็นต์ไม่ใช่เป้าหมาย แต่เป็นตัวบ่งชี้ และโมดูลต่างๆ อาจมีระดับเป้าหมายที่แตกต่างกัน
Line Coverage แสดงจำนวน บรรทัดโค้ด ที่ถูกดำเนินการ Branch Coverage แสดงจำนวนสาขา (if-else, switch) ที่ถูกทดสอบ บรรทัดที่มี if อาจถูกดำเนินการ แต่เฉพาะสาขา true ที่อาจถูกทดสอบ ไม่ใช่ false Branch Coverage เข้มงวดกว่าและเปิดเผยสถานการณ์ที่พลาดไปมากกว่า
ใน CI/CD ความครอบคลุมถูกรวมผ่าน ประตูคุณภาพ (Quality Gate): บิลด์จะถูกบล็อกหากความครอบคลุมต่ำกว่าเกณฑ์ สำหรับ Android ใช้ JaCoCo + SonarQube สำหรับ iOS — xcodebuild -enableCodeCoverage กับการแยกวิเคราะห์ .xccovreport GitHub Actions มีการดำเนินการพร้อมสำหรับ Codecov
ได้ JaCoCo รองรับ Jetpack Compose ผ่านกลไกความครอบคลุม JVM มาตรฐาน อย่างไรก็ตาม โค้ด Compose มีนิพจน์ lambda ที่สร้างขึ้นจำนวนมากซึ่ง JaCoCo อาจไม่ครอบคลุมทั้งหมด แนะนำให้ยกเว้นโค้ด Compose ที่สร้างขึ้นจากรายงานผ่านตัวกรอง
ความครอบคลุมปลอมเกิดขึ้นเมื่อการทดสอบดำเนินการโค้ดแต่ไม่ตรวจสอบ ผลลัพธ์ วิธีแก้ไข: เขียนการตรวจสอบ assert สำหรับทุกสถานการณ์สำคัญ ใช้การทดสอบมิวเทชัน (Pitest) เพื่อตรวจสอบคุณภาพการทดสอบ วิเคราะห์ไม่เพียงแค่เปอร์เซ็นต์แต่รวมถึงสาขาที่ครอบคลุม
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ