ในงาน WWDC 2018 นั้นมี session ที่น่าสนใจเกี่ยวกับการทดสอบ app ด้วย
ซึ่งที่เห็นมามีอยู่ 2 session คือ

จึงทำการสรุปแบบสั้น ๆ ไว้นิดหน่อย

เรื่องแรกคือ What’s new in Testing ?

มาดูว่ามีอะไรใหม่ ๆ เกี่ยวกับการทดสอบบ้าง ประกอบไปด้วย

  • ​Code coverage
  • การจัดการชุดการทดสอบ (Test selection)
  • การกำหนดลำดับการทดสอบ (Test ordering)
  • Parallel testing

เรื่องของ Code coverage นั้น
มีทั้งเรื่องการปรับปรุง performance และความถูกต้องมากขึ้น
โดยขนาดของไฟล์ coverage นั้นจะเล็กลง
ดังนั้นการ load และการทำงานจึงรวดเร็วขึ้น
เราสามารถแยก code coverage ออกตาม target ที่ต้องการได้

ในส่วนของ Editor ก็แสดงผล code coverage ได้ดียิ่งขึ้น
ถ้าเราเปิด feature นะ แสดงดังรูป

มี command line ใหม่คือ xccov
ช่วยทำให้สามารถง่ายต่อการ integrate เข้ากับระบบอื่น ๆ
รวมทั้งสามารถออก report ในรูปแบบต่าง ๆ ได้ เช่น text และ JSON เป็นต้น
ยกตัวอย่างเช่น Continuous Integration Server นั่นเอง
ไปต้องไปใช้ 3-party tool อีกต่อไปแล้ว
ทำไมเพิ่งคิดได้นะ แต่ก็ยังดีที่มา !!
ตัวอย่างการใช้งาน

มีเรื่องที่น่าสนใจคือ สามารถทดสอบแบบ random ได้
นั่นคือ จะไม่ทดสอบแบบเรียงลำดับเหมือนเดิมแล้ว
เพราะว่า บางคนเข้าใจว่า
การทดสอบจะทำจากบนลงล่าง หรือ ตามตัวอักษร
ซึ่งไม่ดีเลย
เพราะว่า มักจะเขียนชุดการทดสอบแต่ละตัวผูกกันไปมา
ส่งผลให้การทดสอบไม่เสถียรและช้ามาก ๆ
ดังนั้น การที่มีการทดสอบแบบ random เข้ามา
ก็น่าจะช่วยให้ชุดการทดสอบมีคุณภาพมากยิ่งขึ้น

ปิดท้ายด้วย Parallel Testing
ปกติการทดสอบทำได้ทีละ device
ที่สำคัญ device ที่กำลังทดสอบนั้น ไม่สามารถใช้งานได้
ส่งผลให้การทดสอบช้ามาก ๆ

ดังนั้นใน Xcode 9 จึงเปลี่ยนใหม่ให้ทำการทดสอบแบบขนาน
แต่ใช้ได้กับการทดสอบต่าง device เท่านั้นนะ !!
อีกทั้งใช้งานผ่าน xcodebuild เท่านั้นนะเออ

เมื่อมาถึง Xcode 10 จึงยกเครื่องเป็น Parallel Distributed Testing ใหม่
ซึ่งใช้เทคนิคการ clone simulator หรือ container
ทำให้ทดสอบแบบ parallel ได้ง่ายขึ้น

เรื่องที่สองคือ Testing tips and tricks

เนื้อหาใน session นี้จะเป็น technical session
สำหรับการทดสอบและ code ที่ทดสอบได้ง่าย (Testable app)
รวมไปถึงเทคนิคการทดสอบ
เช่นการ mocking และการนำ protocol มาใช้แยกการทำงานส่วนต่าง ๆออกจากกัน
เพื่อให้สามารถทดสอบได้ง่าย
ซึ่งการแนวทางในการทดสอบจะตามแนวคิดของ Pyramid Testing นั่นเอง
ประกอบไปด้วย

  • ​End-to-End testing
  • Integration testing
  • Unit testing

แน่นอนว่า มี code ตัวอย่างให้ดูอีกด้วย
ลองไปดูกัน น่าจะมีประโยชน์
ทั้งการทดสอบพวก REST API
ทั้งการทดสอบพวก Notification

ในช่วงท้าย พูดถึงเทคนิคให้การทดสอบรวดเร็วอีกด้วย
ซึ่งการทดสอบที่ช้านั้น
มันส่งผลต่อ productivity ของนักพัฒนาอย่างมาก
ถ้าช้ามาก ๆ แล้วสุดท้ายก็ไม่มีใครอยากจะทำ
ดังนั้นต้องทำให้การทดสอบมีความรวดเร็ว

อีกอย่างในการทดสอบต้องไม่มีการ delay รอด้วยนะ
ใครทำลงไปแล้วบ้าง ยกมือขึ้น ?
สิ่งที่ควรทำมากกว่าคือ Timer และ DispatchQueue.asyncAfter
รวมถึงการ mocking

เรามักใช้งาน XCTNSPredicateExpectation
ซึ่งมันช้า และเหมาะกับการใช้ในส่วนของ UI Testing เท่านั้น
ในส่วนของ Unit Testing ไม่ควรใช้นะ
แนะนำให้ใช้

  • ​XCTestExpectation
  • XCTNSNotificationExpectation
  • XCTKVOExpectation

ในการทดสอบนั้น ขั้นตอนการ launch app ก็สำคัญ
ควรมีขั้นตอนการทำงานที่น้อย ๆ
อะไรที่ไม่จำเป็นก็เอาออกไป
เพราะว่า การทดสอบจะเริ่มได้เมื่อ app ถูก launch แล้วเท่านั้น
หรือบางครั้งต้องกำหนด environment variable
สำหรับการ launch argument เพื่อข้ามบางขั้นตอนไป

วันนี้เขียนชุดการทดสอบหรือยัง ?
วันนี้ app ของเรานั้นง่ายต่อการทดสอบหรือไม่ ?
ขอให้สนุกกับการ coding นะครับ