ios-testing
บทความเรื่อง 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 กลุ่มคือ

  1. Unit test
  2. Layout test
  3. Scenario test หรือ UI test

และทำการทดสอบบน iOS device หลากหลาย version
เมื่อผ่านการทดสอบจะทำการ publih app ไว้ใน Alpha release เสมอ

กลุ่มของการทดสอบแสดงดังรูป Test Pyramid

testpyramid1

คำอธิบาย
จำนวนของการทดสอบกลุ่ม Unit test และ Layout test จะมีจำนวนมากกว่า Scenario test
เนื่องจากเวลาในการทดสอบจะน้อยกว่า Scenario test อย่างมาก
ไม่ใช่แค่ทดสอบเร็วเท่านั้น
แต่ยังทำให้ทีมพัฒนารู้ปัญหาได้อย่างรวดเร็ว
เพื่อลดการ debug ลงไป
ทำให้การทำงานมีประสิทธิภาพมากยิ่งขึ้น

จากแนวทางในทดสอบส่งผลต่อโครงสร้างของระบบงาน

ไม่ว่าจะเป็น MVC, MVP, MVVM
ซึ่งสามารถสรุปการทดสอบในแต่ละส่วนการทำงานออกมาได้ดังรูป

testpyramid2

คำอธิบาย
Model มีหน้าที่จัดการข้อมูล หรือเรียกว่า DAL (Data Abstraction Layyer)
โดยข้อมูลทั้งจากภายในและภายนอก

Presenter มีหน้าที่ทำงานระหว่าง Model กับ View
มีขั้นตอนการทำงานดังนี้

  • ทำงานตามการกระทำต่าง ๆ ของผู้ใช้งานผ่าน view
  • ทำการการดึงข้อมูลจาก Model
  • ทำการจัดการรูปแบบข้อมูลก่อนแสดงที่ View
  • สั่งให้ View แสดงผลตามข้อมูล

View ทำการแสดงผล
สามารถแสดงได้เอง หรือ ถูกสั่งจาก Presenter
รวมทั้งดักจับการกระทำต่าง ๆ จากผู้ใช้งาน

ViewController เป็นส่วนการทำงานหลักของ iOS app
ซึ่งเชื่อมระหว่าง View และ Model เข้าด้วยกัน

ViewModel ทำหน้าที่อยู่ระหว่าง View กับ Model

มาดูรายละเอียดของการทดสอบแต่ละกลุ่ม

1. Unit test
เป็นส่วนที่สำคัญมาก ๆ ในการพัฒนา app
ทำให้มีความมั่นใจต่อ code ที่สร้างขึ้นมา
ทำให้ code มีความน่าเชื่อถือ ปลอดภัย
รวมทั้งง่ายต่อการ debug หรือหาจุดที่ผิดพลาด
และทำให้รู้ปัญหาหรือ bug ได้อย่างรวดเร็ว

โดยที่ unit test นั้นจะทำการทดสอบส่วนการทำงานเล็ก ๆ
ที่ทำงานอยู่ในส่วนต่าง ๆ ไม่ว่าจะเป็น

  • Business logic
  • ViewModel เช่นการ convert ข้อมูลในรูปแบบต่าง ๆ
  • การทำงานต่าง ๆ ใน ViewController
  • ทำการตรวจสอบสถานะต่าง ๆ ของข้อมูล

2. Layout test
เป็น unit test ชนิดหนึ่ง แต่เน้นไปที่การทดสอบส่วนของ layout ของ View
ใน device หรือ configuration ที่แตกต่างกัน
รวมไปถึงขนาดของหน้าจอที่แตกต่างกัน

โดยที่ในการทดสอบต้องทำการจำลองข้อมูลต่าง ๆ ที่ใช้งาน
เช่นจำลองการทำงานของ ViewModel
เพื่อทดสอบว่า View สามารถแสดงผลจากข้อมูลรูปแบบต่าง ๆ ได้ถูกต้องหรือไม่
เช่นข้อมูลที่มีความยาวมาก ๆ น้อย ๆ หรือเป็น Null หรือ Empty string
รวมทั้งข้อมูลในภาษาต่าง ๆ สีสัน แสดงรูปภาพอีกด้วย

3. Scenario test หรือ UI test
ในการทดสอบจะใช้ทั้ง XCTest และ KIF (Keep It Function)
สำหรับทดสอบ function การทำงานต่าง ๆ ของ app
ในมุมมองของผู้ใช้งาน (Customer testing) เช่น

  • การ swipe, scroll
  • การ validate ข้อมูลและการทำงานต่าง ๆ ตาม function การทำงาน
  • การตรวจสอบการทำงานผ่านระบบ network
  • การบันทึกหน้าจอการทำงาน

โดยในการทดสอบกลุ่มนี้ ต้องทำการ mock ค่าต่าง ๆ ขึ้นมาด้วย
เช่น Mock Network, Mock HTTP Server เป็นต้น
สำหรับการจำลอง network
สำหรับการจำลอง response จาก HTTP Server
ทำให้เราสามารถจำลองสถานการณ์ต่าง ๆ ได้
เพื่อทำการทดสอบว่าระบบงานได้ตามที่คาดหวังหรือไม่ ?

ปิดท้ายด้วย Case Study ของทีมพัฒนา ซึ่งน่าสนใจอย่างมาก

แสดงดังรูปสำหรับการก่อนและหลังการ refactor
หรือปรับปรุงการทดสอบให้เป็นไปตามแนวคิดข้างต้น

testpyramid3

คำอธิบาย
ก่อนจะทำการแก้ไขนั้น พบว่า
ชุดการทดสอบมันไม่น่าเชื่อถือและเสถียรเลย
แถมทำงานช้า
แถมไม่ครอบคลุม business logic
แถมดูแลรักษายากอีก
เนื่องจากทดสอบในระดับ UI หรือ Scenario test เท่านั้น
ผลที่ตามมาคือ
เวลาการทำงานตั้งแต่ commit code ถึง publish app ขึ้น App Store
มันไม่เสถียรเลย แน่นอนว่าทำให้ไม่มีใครเชื่อถือเลย !!

จากปัญหาเหล่านี้จึงกลายเป็นเป้าหมายสำคัญ
ในการแก้ไขและปรับปรุงรูปแบบการทดสอบ
ซึ่งพยายามแยกการทดสอบในส่วนต่าง ๆ
ออกไปยังกลุ่มการทดสอบทั้ง Unit test, Layout test และ UI test
ผลที่ออกมาคือ
ทำให้มีความมั่นใจในส่วนการทำงานต่าง ๆ มากขึ้น
ลดเวลาการทดสอบลงไปอย่างมาก
ทำให้กระบวนการโดยรวมมีความน่าเชื่อถือ
รวมทั้งทำให้รู้เวลาของการทดสอบชัดเจน

คำถามสำหรับ iOS Developer คือ
ปัจจุบันเราทดสอบกันอย่างไร ?