มีโอกาสได้อธิบายเรื่องเกี่ยวกับ Code coverage
จึงนำมาเขียนสรุปไว้นิดหน่อยว่า
คืออะไร ?
มีประโยชน์อะไร ?
แต่ละภาษามีเครื่องมืออะไรบ้าง ?
พร้อมตัวอย่าง code นิดหน่อย

Code coverage คืออะไร ?

ค่า metric หนึ่งที่ช่วยทำให้เราเข้าใจว่า
source code ถูกทดสอบมากน้อยเพียงใด
หรือ source code ถูกใช้งานจากการทดสอบนั่นเอง

ปล. ไม่ใช่ KPI นะ
มันคือสิ่งที่ช่วยทำให้เรารู้ว่าต้องปรับปรุงและทดสอบในส่วนไหน

แล้ว Code coverage ทำการคำนวณอะไรบ้าง ?

  • Function/method coverage จำนวนของ function/method ถูกเรียกใช้งาน
  • Statement coverage จำนวนของ statement ถูกเรียกใช้งาน
  • Branch coverage จำนวนของ branch หรือเงื่อนไขใน if statement ถูกเรียกใช้งานทั้ง true และ false
  • Line coverage จำนวนของบรรทัดที่ถูกเรียกใช้งาน

โดยแต่ละตัวจะสรุปเป็นตัวเลข 2 ค่าคือ source code ที่ถูกทดสอบ และ ไม่ถูกทดสอบ

อธิบายไปก็เข้าใจยาก !
ไม่ว่าจะเป็น statment คืออะไร ?
ไม่ว่าจะเป็น branch คืออะไร ?
ไม่ว่าจะเป็น Line หรือ Line of Code คืออะไร ?
ดังนั้นมาดูจาก code ตัวอย่างกันดีกว่า

โดยเครื่องมือที่ใช้มีสำหรับแต่ละภาษาโปรแกรมเช่น

  • Java มี Cobertura, Jacobo และ Clover
  • JavaScript มี Istanbul, Blanket.js
  • PHP มี PHPUnit
  • Python มี Coverage.py
  • Ruby มี SimpleCov

มาเริ่มดู code ตัวอย่างด้วยภาษา JavaScript กันนิดหน่อย

จากนั้นทำดูค่า Code Coverage ด้วย Istanbul ดังนี้

$istanbul cover coverage_01.js

ผลที่ได้เป็นดังนี้

ยังไม่พอนะ Istanbul ยังสร้างรายงานในรูปแบบ HTML ให้อีก
ซึ่งดูได้ทั้งภาพรวมของ Code coverage
และรายละเอียดในแต่ละบรรทัด
แสดงดังนี้

แต่เพื่อความเข้าใจลอง comment หรือ ลบ code ในบรรทัดที่ 8
นั่นคือ เราไม่ทดสอบหรือเรียกใช้งาน กรณีที่เป็น false
จะได้ผลของ Code coverage ดังนี้

คำอธิบาย
ค่าของ Function coverage ยังคงเป็น 100%
เนื่องจากยังถูกเรียกใช้งาน

ค่าของ statement และ line coverage จะลดลงเหลือ 80%
นั่นคือมีบางบรรทัดไม่ถูกทดสอบหรือเรียกใช้

ค่าของ Branch coverage ลดลงเหลือเพียง 50%
นั่นหมายความว่า
ในส่วนของการตรวจสอบเงื่อนไขใน if statement นั้น
ทำการทดสอบหรือเรียกใช้งานเพียง branch เดียวเท่านั้น
ซึ่งรายละเอียดแสดงดังรูป

เราเห็นประโยชน์อะไรจาก Code Coverage บ้าง ?

เป็นเครื่องมือที่ช่วยทำให้เรารู้ว่า
source code ส่วนไหนถูกเรียกใช้งานหรือทดสอบหรือไม่ ?
แต่ว่าทำงานถูกหรือไม่ ก็เป็นอีกเรื่อง !!
ดังนั้น Code coverage จึงบอกได้เพียงว่า
ส่วนไหนของ source code ถูกเรียกและยังไม่ถูกเรียกใช้
จากนั้นให้นำข้อมูลเหล่านี้มาช่วยตัดสินใจ ว่าจะทำอะไรต่อไป

ส่วนเรื่องความถูกต้องจำเป็นต้องทดสอบ
เช่น unit test, integration test และ acceptance test เป็นต้น

ที่สำคัญอย่านำค่าของ Code coverage มาเป็น KPI
เพื่อวัด performance ของทีมนะ
เนื่องจากจะทำให้ทีมกดดัน
และจะส่งผลต่อคุณภาพของ software อีก
เช่นสนใจแต่ค่า Code coverage มากเกินไป
จนไม่สนใจเรื่องความถูกต้อง !!!

สุดท้ายแล้วค่า Code coverage สูง ๆ

ไม่ได้บอกว่า software คุณดี
ไม่ได้บอกว่า software คุณมีการทดสอบที่ดี
แต่ใช้เพื่อให้เราเข้าใจสิ่งที่กำลังพัฒนา
ว่าควรจะ focus อะไร
ว่าควรจะใส่ใจอะไร ตรงไหน

แต่มันจะไม่ได้ช่วยอะไรเลย
ถ้าคุณมีชุดการทดสอบที่ดีและน่าเชื่อถือ

ลองกลับไปวัดค่า Code coverage ของระบบคุณดูสิ !!