ปัญหาหลัก ๆ สำหรับ End-to-End testing ด้วย XCUITest
ประกอบไปด้วย
- Dependencies ซึ่งจัดการและควบคุมได้ยากมาก ๆ
- Concurrency คือการทดสอบพร้อม ๆ กัน
- Repeatability ไม่สามารถทดสอบซ้ำ ๆ ยิ่งกว่านั้นผลการทำงานไม่ค่อยเหมือนเดิมหรือไม่เสถียรเอาซะเลย
- ส่งผลให้ยากต่อการเขียนชุดการทดสอบ !!
จาก Pyramid Testing สามารถจับคู่กับการทดสอบใน iOS app ได้ดังนี้
- End-to-End test หรือ UI จะใช้งาน CXUITest
- Unit test จะใช้งาน XCTest
- Integration test จะใช้งาน Mobile contract test และ Mock response test เพื่อช่วยให้สามารถควบคุม dependency ต่าง ๆ ได้
แสดงดังรูป
ในส่วนของ Integration test นั่นเอง ที่ Localhost ถูกสร้างขึ้นมา
โดยพัฒนาด้วยภาษา Swift
การใช้งาน Localhost มีขั้นตอนดังนี้
- L คือ Localhost นั่นคือการ setup in-memory server และกำหนด port ของ server ได้เลย (random ก็ได้)
- A คือ API สำหรับทำการ redirect request ไปยัง in-memory server (ทำโดยไม่แก้ไข code ในส่วน production code)
- I คือ Info.plist ทำการ config ค่าต่าง ๆ ในไฟล์นี้ ช่วยทำให้ไม่ต้องแก้ไข production code และสามารถเรียก localhost ได้
- M คือ Mock ทำการ mock response ของ in-memory server ตาม test case ที่ต้องการ
จากนั้นก็เริ่มเขียน test กันไปเลย
โดย Localhost ที่สร้างขึ้นมาและปิดไปของแต่ละชุดการทดสอบ
การทำงานของ Localhost แสดงดังรูป
ส่วน code ตัวอย่างจะอยู่ที่ GitHub :: iOS Movie App
มาดู code ตัวอย่างนิดหน่อย
[gist id="b1a6a7e246f5dfddffcb8ca24a764823" file="MovieDetailsTest.swift"]จากที่ลองใช้งานหลังจากที่ฟัง
พบว่า ทำให้นักพัฒนาสามารถทดสอบ iOS app กับ API
เช่น RESTFul API ได้ง่ายขึ้น
เหมือนกับสามารถ Android ที่ใช้งาน MockWebServer เลย
มาลองใช้งานกันดูครับ