code-coverage
สำหรับ developer ที่เขียน automated test ในระดับ unit test
บางคนอาจจะบอกว่า

ถ้าค่าของ Code Coverage มันต่ำ
แสดงว่า ควรที่จะเขียน test เพิ่มเติม
ซึ่งเป็นสิ่งที่ถูกต้องแล้ว แต่ยังไม่ครบ !!

ถ้าค่าของ Code Coverage สูงล่ะ มันบอกอะไรเราบ้าง ?
มันบอกว่า จำนวน test เพียงพอแล้วหรือ ?
มันบอกว่า test ที่เขียนไปนั้นถูกต้องแล้วหรือ ?
บอกได้เลยว่า มันไม่ได้บอกเราเลย

มันเป็นเพียงการ execute code จาก test เท่านั้นเอง
มันไม่ได้บ่งบอกถึง คุณภาพ
มันไม่ได้ทำการตรวจสอบว่า
เรากำลังทำในสิ่งที่ถูกต้องอยู่หรือไม่ !!

ดังนั้นสิ่งที่เราขาดไป ก็คือ
สิ่งที่จะช่วยบอกเราว่า จุดไหนของ test ที่มันไม่ดี

โครงสร้างที่ดีของ test มีหลายแนวคิด เช่น แนวคิดของคุณ Gerard Meszaros

ประกอบไปด้วย 4 ขั้นตอน ดังนี้

  1. การ setup
  2. การ execute code จาก test
  3. การตรวจสอบพฤติกรรม และ ผลการทำงาน
  4. ทำการคืนสถานะต่าง ๆ ของระบบกลับสู่สภาวะเดิมก่อนทำการทดสอบ

คำถาม
เราสามารถเขียน test โดยให้มีค่า Code Coverage 100% แบบง่าย ๆ ได้อย่างไร ?
คำตอบ
ก็ทำการเขียน test โดยไม่ต้องทำขั้นตอนที่ 3 ไงล่ะ

นั่นคือ ไม่ต้องทำการตรวจสอบพฤติกรรม และ ผลการทำงาน
แต่เราก็ไม่รู้หรอกนะ ว่า ระบบทำงานถูกต้องหรือไม่ !!
ถ้า developer คนไหนทำแบบนี้ ขอบอกเลยว่า ใจร้ายสุด ๆ
น่าจะเน้นไปที่ KPI หรือ ค่า Code Coverage สูง ๆ เพียงอย่างเดียว

มาดูตัวอย่างการเขียน test แบบง่าย ๆ กันดีกว่า

จากตัวอย่างการทดสอบ
ถ้า method operation() มันมีค่าความซับซ้อนเท่ากับ 3 แล้ว
จำนวน test 3 test case มันก็สมเหตุสมผล
ซึ่งน่าจะเพียงพอสำหรับการทดสอบ และ เพิ่มความมั่นใจให้เรา
ตลอดจน เรื่องของ Code Coverage

แต่ถ้า method operation() มันทำงานร่วมกับระบบอื่น ๆ อีกล่ะ
แน่นอนว่า การทดสอบเพียง 3 test case มันย่อมไม่เพียงพอ
เนื่องจาก เราจะยังไม่ตรวจสอบพฤติกรรมการทำงาน
เมื่อต้องทำงานกับระบบอื่น ๆ เลยนะ
ว่ายังคงทำงานได้ถูกต้องตามที่คาดหวังหรือไม่

สุดท้ายแล้วค่า Code Coverage หรือ Matrix ต่าง ๆ มันสำคัญนะ

แต่ว่ามันมีความสำคัญเท่ากับ ความเข้าใจต่อ Code Coverage
ว่าอะไรคือสิ่งที่ต้องทำบ้าง ?
ว่าอะไรคือสิ่งที่ไม่จำเป็นต้องทำบ้าง ?

อย่าไปสนใจเพียงจำนวน Line of Code ที่ถูกทดสอบ แต่ให้คิดว่า

  • เราจะรู้ได้อย่างไร ว่าแต่ละงานมันเสร็จแล้วนะ
  • การทดสอบมันเพียงพอแล้วหรือยัง ?
  • ให้ทีมตัดสินใจร่วมกันว่า จำนวน coverage มันเพียงพอหรือยัง ?
  • ให้คำนึงถึงเรื่องความเสี่ยงต่าง ๆ โดยเฉพาะความเสี่ยงของเหตุการณ์ที่อาจจะเกิดขึ้นกับลูกค้า
  • ครอบคลุมการทำงานอย่างน้อยทุก ๆ feature แล้วหรือยัง ? (Minimal Feature Coverage)

มันหมายความว่า คุณในฐานะ developer
ให้ความสนใจ ใส่ใจต่อสิ่งที่กำลังสร้างมาก หรือ น้อยเพียงใด

ปล.
ผมเคยเขียนอธิบายเรื่อง Code Coveage หรือ Test Coverage ไว้ที่
blog เรื่อง Test Coverage สูงๆ มันดีจริงหรือไม่

Reference Websites
http://martinfowler.com/bliki/TestCoverage.html
https://dupdob.wordpress.com/2014/02/21/the-secret-for-100-test-coverage-remove-code/
http://www.renaissancesoftware.net/blog/archives/273
http://stackoverflow.com/questions/90002/what-is-a-reasonable-code-coverage-for-unit-tests-and-why