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 ชนิด คือ

  1. Return value test
  2. State test
  3. Interaction test

1. Return value test คืออะไร

อธิบายด้วย AAA (Arrange-Act-Assert) ได้ดังนี้

  • Arrange = ทำการกำหนดค่าเริ่มต้นต่าง ๆ ของ object
  • Act = ทำการเรียก method/function ที่ทำการ return ผลลัพธ์กลับมา
  • Assert = ทำการตรวจสอบผลการทำงาน กับ สิ่งที่คาดหวังว่าตรงกันหรือไม่

แสดงการทดสอบดังรูป
Screen Shot 2559-02-05 at 4.46.14 PM

2. State test

อธิบายด้วย AAA (Arrange-Act-Assert) ได้ดังนี้

  • Arrange = ทำการกำหนดค่าเริ่มต้นต่าง ๆ ของ object
  • Act = ทำการเรียก method/function โดยไม่สนใจว่าจะส่งค่าอะไรกลับมา
  • Assert = ทำการดึงข้อมูล หรือ สถานะจาก object ที่ทำการทดสอบ ว่าทำงานตามที่ต้องการหรือไม่

แสดงการทดสอบดังรูป
Screen Shot 2559-02-05 at 4.48.50 PM

3. Interaction test

เป็นการทดสอบสำหรับการทำงานร่วมกันของ object ต่าง ๆ
ซึ่งเป็นชนิดการทดสอบที่ถูกใช้งานอย่างมาก
และแน่นอนว่าเป็นเรื่องหลักของ VDO นี้

แสดงการทำงานดังรูป
Screen Shot 2559-02-05 at 4.52.36 PM

จากรูปอาจดูไม่ค่อยเข้าใจเท่าไรนัก !!
ดังนั้นจึงทำการอธิบายด้วยการทำงานของร้านอาหาร
ซึ่งประกอบไปด้วย 3 ส่วน คือ

  1. ลูกค้า
  2. พนักงาน
  3. พ่อครัว

ซึ่งในการสั่งอาหารของลูกค้านั้น จะสั่งอาหารกับพนักงาน
โดยไม่ต้องสนใจว่า พ่อครัวเป็นใคร
นั่นคือ พนักงานต้องไม่ผูกติดกับพ่อครัวนะ (Isolated dependency)
แสดงดังรูป
Screen Shot 2559-02-05 at 4.55.45 PM

แต่ในการทำงานพบว่า
พนักงานต้องต้องทำงานร่วมกับพ่อครัวเสมอ (Interaction)
เพื่อทำอาหารตาม order จากลูกค้า

โดยในการทดสอบนั้น
เราสามารถทำงานจำลองพ่อครัวขึ้นมา
เพื่อทำงานตาม order ของลูกค้า

แต่เพียงแค่การจำลองอย่างเดียว ไม่สามารถทำงานร่วมกันได้
เพราะว่าทั้งพนักงาน และ พ่อครัวนั้นแยกออกจากกัน
ดังนั้น จึงต้องทำการ Injection Dependency หรือส่งพ่อครัวให้ไปทำงานร่วมกับพนักงาน
แสดงดังรูป
Screen Shot 2559-02-05 at 4.58.42 PM

วิธีการของ Dependency Injection มีหลายวิธี ดังนี้

  • Extract and Override method
  • Method injection
  • Property injection
  • Constructor injection
  • Ambient context

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

จากหนังสือ The Art of Unit Testing อธิบายเรื่องของ Stub และ Mock ไว้ดังรูป

ซึ่งผมคิดว่า มันเข้าใจได้ง่ายมาก ๆ ดังรูป

Screen Shot 2559-02-05 at 5.05.51 PM

 

Screen Shot 2559-02-05 at 5.07.01 PM

ยังไม่จบนะ ใน VDO ยังมี code ตัวอย่าง

สำหรับการทดสอบการทำงานกับ Network อีกด้วย
รวมทั้งการ refactor code เพื่อให้ทดสอบง่าย และ อ่านได้ง่ายอีกด้วย
ลองทำการอ่าน ฟัง ดู กันครับ
มันมีประโยชน์อย่างมากมาย

สามารถดู slide เพิ่มเติมได้ที่ PDF:: Slide

ดู VDO กันได้เลย