Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

[แปล] iOS Test Pyramid จากทีมพัฒนาของ LinkedIn

$
0
0

ios-testing

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 คือ ปัจจุบันเราทดสอบกันอย่างไร ?

Viewing all articles
Browse latest Browse all 1997

Trending Articles