![code-coverage]()
![code-coverage]()
สำหรับ developer ที่เขียน automated test ในระดับ unit test
บางคนอาจจะบอกว่า
ถ้าค่าของ Code Coverage มันต่ำ
แสดงว่า ควรที่จะเขียน test เพิ่มเติม
ซึ่งเป็นสิ่งที่ถูกต้องแล้ว แต่ยังไม่ครบ !!
ถ้าค่าของ Code Coverage สูงล่ะ มันบอกอะไรเราบ้าง ?
มันบอกว่า จำนวน test เพียงพอแล้วหรือ ?
มันบอกว่า test ที่เขียนไปนั้นถูกต้องแล้วหรือ ?
บอกได้เลยว่า มันไม่ได้บอกเราเลย
มันเป็นเพียงการ execute code จาก test เท่านั้นเอง
มันไม่ได้บ่งบอกถึง คุณภาพ
มันไม่ได้ทำการตรวจสอบว่า
เรากำลังทำในสิ่งที่ถูกต้องอยู่หรือไม่ !!
ดังนั้นสิ่งที่เราขาดไป ก็คือ
สิ่งที่จะช่วยบอกเราว่า จุดไหนของ test ที่มันไม่ดี
โครงสร้างที่ดีของ test มีหลายแนวคิด เช่น แนวคิดของคุณ Gerard Meszaros
ประกอบไปด้วย 4 ขั้นตอน ดังนี้
- การ setup
- การ execute code จาก test
- การตรวจสอบพฤติกรรม และ ผลการทำงาน
- ทำการคืนสถานะต่าง ๆ ของระบบกลับสู่สภาวะเดิมก่อนทำการทดสอบ
คำถาม
เราสามารถเขียน test โดยให้มีค่า Code Coverage 100% แบบง่าย ๆ ได้อย่างไร ?
คำตอบ
ก็ทำการเขียน test โดยไม่ต้องทำขั้นตอนที่ 3 ไงล่ะ
นั่นคือ ไม่ต้องทำการตรวจสอบพฤติกรรม และ ผลการทำงาน
แต่เราก็ไม่รู้หรอกนะ ว่า ระบบทำงานถูกต้องหรือไม่ !!
ถ้า developer คนไหนทำแบบนี้ ขอบอกเลยว่า ใจร้ายสุด ๆ
น่าจะเน้นไปที่ KPI หรือ ค่า Code Coverage สูง ๆ เพียงอย่างเดียว
มาดูตัวอย่างการเขียน test แบบง่าย ๆ กันดีกว่า
[gist id="135c238e25c52735634d" file="MyOperationTest.java"]
จากตัวอย่างการทดสอบ
ถ้า 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