บทความเรื่อง iOS Test Pyramid จากทีมพัฒนาของ LinkedIn
ทำการอธิบายวิธีการทดสอบของ iOS app
เป็นขั้นตอนการทำงานที่สำคัญในกระบวนการ 3X3 iOS Release
ซึ่งทำให้ทีมพัฒนาสามารถ release iOS app ภายใน 3 ชั่วโมงได้
ตั้งแต่การ commit code จนถึงการ publish ขึ้น App Store กันเลย
หัวในหลักของการ Release นั่นก็คือ
กระบวนการทดสอบแบบอัตโนมัตินั่นเอง
โดยเน้นทั้งจำนวน code coverage
และเวลาของการทำงานตั้งแต่การ commit จนถึงการ publish app
ดังนั้นจึงนำบทความนี้มาแปลและสรุปตามความเข้าใจไว้นิดหน่อย
แนวทางการแก้ไขปัญหาเรื่องการทดสอบ
ทำการแบ่งการทดสอบออกเป็น 3 กลุ่มคือ- Unit test
- Layout test
- Scenario test หรือ UI test
กลุ่มของการทดสอบแสดงดังรูป Test Pyramid
คำอธิบาย จำนวนของการทดสอบกลุ่ม Unit test และ Layout test จะมีจำนวนมากกว่า Scenario test เนื่องจากเวลาในการทดสอบจะน้อยกว่า Scenario test อย่างมาก ไม่ใช่แค่ทดสอบเร็วเท่านั้น แต่ยังทำให้ทีมพัฒนารู้ปัญหาได้อย่างรวดเร็ว เพื่อลดการ debug ลงไป ทำให้การทำงานมีประสิทธิภาพมากยิ่งขึ้นจากแนวทางในทดสอบส่งผลต่อโครงสร้างของระบบงาน
ไม่ว่าจะเป็น MVC, MVP, MVVM ซึ่งสามารถสรุปการทดสอบในแต่ละส่วนการทำงานออกมาได้ดังรูป คำอธิบาย Model มีหน้าที่จัดการข้อมูล หรือเรียกว่า DAL (Data Abstraction Layyer) โดยข้อมูลทั้งจากภายในและภายนอก Presenter มีหน้าที่ทำงานระหว่าง Model กับ View มีขั้นตอนการทำงานดังนี้- ทำงานตามการกระทำต่าง ๆ ของผู้ใช้งานผ่าน view
- ทำการการดึงข้อมูลจาก Model
- ทำการจัดการรูปแบบข้อมูลก่อนแสดงที่ View
- สั่งให้ View แสดงผลตามข้อมูล
มาดูรายละเอียดของการทดสอบแต่ละกลุ่ม
1. Unit test เป็นส่วนที่สำคัญมาก ๆ ในการพัฒนา app ทำให้มีความมั่นใจต่อ code ที่สร้างขึ้นมา ทำให้ code มีความน่าเชื่อถือ ปลอดภัย รวมทั้งง่ายต่อการ debug หรือหาจุดที่ผิดพลาด และทำให้รู้ปัญหาหรือ bug ได้อย่างรวดเร็ว โดยที่ unit test นั้นจะทำการทดสอบส่วนการทำงานเล็ก ๆ ที่ทำงานอยู่ในส่วนต่าง ๆ ไม่ว่าจะเป็น- Business logic
- ViewModel เช่นการ convert ข้อมูลในรูปแบบต่าง ๆ
- การทำงานต่าง ๆ ใน ViewController
- ทำการตรวจสอบสถานะต่าง ๆ ของข้อมูล
- การ swipe, scroll
- การ validate ข้อมูลและการทำงานต่าง ๆ ตาม function การทำงาน
- การตรวจสอบการทำงานผ่านระบบ network
- การบันทึกหน้าจอการทำงาน
ปิดท้ายด้วย Case Study ของทีมพัฒนา ซึ่งน่าสนใจอย่างมาก
แสดงดังรูปสำหรับการก่อนและหลังการ refactor หรือปรับปรุงการทดสอบให้เป็นไปตามแนวคิดข้างต้น คำอธิบาย ก่อนจะทำการแก้ไขนั้น พบว่า ชุดการทดสอบมันไม่น่าเชื่อถือและเสถียรเลย แถมทำงานช้า แถมไม่ครอบคลุม business logic แถมดูแลรักษายากอีก เนื่องจากทดสอบในระดับ UI หรือ Scenario test เท่านั้น ผลที่ตามมาคือ เวลาการทำงานตั้งแต่ commit code ถึง publish app ขึ้น App Store มันไม่เสถียรเลย แน่นอนว่าทำให้ไม่มีใครเชื่อถือเลย !! จากปัญหาเหล่านี้จึงกลายเป็นเป้าหมายสำคัญ ในการแก้ไขและปรับปรุงรูปแบบการทดสอบ ซึ่งพยายามแยกการทดสอบในส่วนต่าง ๆ ออกไปยังกลุ่มการทดสอบทั้ง Unit test, Layout test และ UI test ผลที่ออกมาคือ ทำให้มีความมั่นใจในส่วนการทำงานต่าง ๆ มากขึ้น ลดเวลาการทดสอบลงไปอย่างมาก ทำให้กระบวนการโดยรวมมีความน่าเชื่อถือ รวมทั้งทำให้รู้เวลาของการทดสอบชัดเจนคำถามสำหรับ iOS Developer คือ ปัจจุบันเราทดสอบกันอย่างไร ?