![Screen Shot 2559-02-05 at 5.22.49 PM]()
![Screen Shot 2559-02-05 at 5.22.49 PM]()
จาก VDO เรื่อง
Test Driven Development(TDD) for iOS (and anything) ของคุณ Jon Reid
ได้พูดถึงเรื่องการจัดการ dependency
เพื่อทำให้ code ของเรานั้นมันไม่ผูกติดกันมากไป (Loose coupling)
และสามารถทดสอบได้ง่าย
จึงทำการสรุปไว้นิดหน่อย
สิ่งที่ developer ทุกคนควรทำความเข้าใจกับ TDD ก่อนเสมอ
ซึ่งมี resources ที่ต้องอ่าน คือ
มาถึงเนื้อหาที่น่าสนใจกันบ้าง
เริ่มจากอธิบายเกี่ยวกับ Unit test มี 3 ชนิด คือ
- Return value test
- State test
- Interaction test
1. Return value test คืออะไร
อธิบายด้วย AAA (Arrange-Act-Assert) ได้ดังนี้
- Arrange = ทำการกำหนดค่าเริ่มต้นต่าง ๆ ของ object
- Act = ทำการเรียก method/function ที่ทำการ return ผลลัพธ์กลับมา
- Assert = ทำการตรวจสอบผลการทำงาน กับ สิ่งที่คาดหวังว่าตรงกันหรือไม่
แสดงการทดสอบดังรูป
2. State test
อธิบายด้วย AAA (Arrange-Act-Assert) ได้ดังนี้
- Arrange = ทำการกำหนดค่าเริ่มต้นต่าง ๆ ของ object
- Act = ทำการเรียก method/function โดยไม่สนใจว่าจะส่งค่าอะไรกลับมา
- Assert = ทำการดึงข้อมูล หรือ สถานะจาก object ที่ทำการทดสอบ ว่าทำงานตามที่ต้องการหรือไม่
แสดงการทดสอบดังรูป
3. Interaction test
เป็นการทดสอบสำหรับการทำงานร่วมกันของ object ต่าง ๆ
ซึ่งเป็นชนิดการทดสอบที่ถูกใช้งานอย่างมาก
และแน่นอนว่าเป็นเรื่องหลักของ VDO นี้
แสดงการทำงานดังรูป
จากรูปอาจดูไม่ค่อยเข้าใจเท่าไรนัก !!
ดังนั้นจึงทำการอธิบายด้วยการทำงานของร้านอาหาร
ซึ่งประกอบไปด้วย 3 ส่วน คือ
- ลูกค้า
- พนักงาน
- พ่อครัว
ซึ่งในการสั่งอาหารของลูกค้านั้น จะสั่งอาหารกับพนักงาน
โดยไม่ต้องสนใจว่า พ่อครัวเป็นใคร
นั่นคือ พนักงานต้องไม่ผูกติดกับพ่อครัวนะ (Isolated dependency)
แสดงดังรูป
แต่ในการทำงานพบว่า
พนักงานต้องต้องทำงานร่วมกับพ่อครัวเสมอ (Interaction)
เพื่อทำอาหารตาม order จากลูกค้า
โดยในการทดสอบนั้น
เราสามารถทำงานจำลองพ่อครัวขึ้นมา
เพื่อทำงานตาม order ของลูกค้า
แต่เพียงแค่การจำลองอย่างเดียว ไม่สามารถทำงานร่วมกันได้
เพราะว่าทั้งพนักงาน และ พ่อครัวนั้นแยกออกจากกัน
ดังนั้น จึงต้องทำการ Injection Dependency หรือส่งพ่อครัวให้ไปทำงานร่วมกับพนักงาน
แสดงดังรูป
วิธีการของ Dependency Injection มีหลายวิธี ดังนี้
- Extract and Override method
- Method injection
- Property injection
- Constructor injection
- Ambient context
จากรูปจะเห็นว่า เราทำการจำลองพ่อครัวขึ้นมา
คำถามที่เกิดขึ้นมาเลย คือ จำลองแบบไหน อย่างไร ?
คำตอบคือ ใช้ Stub และ Mock ไงล่ะ !!
จากหนังสือ The Art of Unit Testing อธิบายเรื่องของ Stub และ Mock ไว้ดังรูป
ซึ่งผมคิดว่า มันเข้าใจได้ง่ายมาก ๆ ดังรูป
ยังไม่จบนะ ใน VDO ยังมี code ตัวอย่าง
สำหรับการทดสอบการทำงานกับ Network อีกด้วย
รวมทั้งการ refactor code เพื่อให้ทดสอบง่าย และ อ่านได้ง่ายอีกด้วย
ลองทำการอ่าน ฟัง ดู กันครับ
มันมีประโยชน์อย่างมากมาย
สามารถดู slide เพิ่มเติมได้ที่
PDF:: Slide
ดู VDO กันได้เลย
https://www.youtube.com/watch?v=Jzlz3Bx-NzM