XCTest Unit Testing Integration with Clean Swift Architecture

Veerut Hengnopparatkul
Lotus’s IT
Published in
3 min readJan 24, 2024

สำหรับ Developer การรับรองความน่าเชื่อถือและความถูกต้องของโค้ดเป็นสิ่งที่สำคัญมาก หนึ่งในวิธีที่จะช่วยให้โค้ดมีประสิทธิภาพ คือการเขียน Unit Test ในบทความนี้เราจะมาเรียนรู้วิธีการเขียน Unit Test ด้วย XCTest กับ Clean Swift Architecture กันครับ!

Clean Swift Architecture คืออะไร?

Clean Swift หรือที่รู้จักในชื่อ VIP (View, Interactor, Presenter) เป็นรูปแบบ architecture ที่ส่งเสริมโครงสร้างที่เรียบง่าย และ scalable สำหรับโปรเจค iOS มันจะแบ่งความรับผิดชอบออกเป็นส่วนต่างๆ ทำให้โค้ดเบสเป็นแบบโมดูลาร์และง่ายต่อการบำรุงรักษา

  • View: จัดการกับองค์ประกอบของ interface ผู้ใช้และการป้อนข้อมูล, outlets และ IBAction ต่างๆ ต้องอยู่ในหน้านี้ View มีหน้าที่ในการส่ง action ต่างๆ ไปให้กับ Interactor
  • Interactor: ประกอบด้วย business logic และการจัดการข้อมูล Interactor จะรับ request มาจาก View และจะทำ response ไปให้ Presenter
  • Presenter: เตรียมข้อมูลสำหรับการนำเสนอและสื่อสารกับ View Presenter จะจัดรูป model ที่ได้รับมาจาก Interactor ให้เป็นในรูปของ ViewModel เพื่อที่จะส่งต่อไปให้กับ View เพื่อไปแสดงผลใน UI ต่อไป
  • Router: ดูแลการนำทางระหว่างหน้าจอต่างๆ

การตั้งค่าโปรเจคสำหรับ Test

ก่อนที่เราจะดำดิ่งลงไปกับ XCTest มาเตรียมโปรเจคของเราสำหรับการ test กันก่อนดีกว่าครับ

  • Testable Code (โค้ดที่สามารถ test ได้): ต้องมั่นใจว่าโค้ดของเราเขียนขึ้นมาให้สามารถ test ได้ ซึ่งอาจรวมถึงการแยก dependency, การใช้โปรโตคอล และการยึดถือหลักการของ Single Responsibility Principle
  • Test Target (เป้าหมายการ test): เป็นสิ่งจำเป็นที่เราต้องมี test target แบบเฉพาะตัวสำหรับแอปพลิเคชั่น เพื่อให้สามารถ test การทำงานต่างๆ ได้อย่างมีประสิทธิภาพ โดยสภาพแวดล้อมนี้จะแยกจากโค้ดหลักของแอป (production code) เพื่อไม่ให้มีการรบกวนหรือผลกระทบต่อการทำงานปกติของแอป
  • Dependency Injection: เทคนิคนี้มีความสำคัญมากในการ test เพราะช่วยให้เราสามารถแทนที่การใช้งานของ object จริงด้วย mock objects ซึ่งทำให้ test ของเรามีความน่าเชื่อถือมากขึ้นและพึ่งพา resource ภายนอกน้อยลง

การเขียน Clean Swift Unit Tests ด้วย XCTest

มาลองเขียน Unit test สำหรับโมดูล Clean Swift กันดีกว่า! สมมติว่าเรามีโมดูล Login พร้อมกับส่วนประกอบที่เกี่ยวข้อง

  • View Tests: ทดสอบความสามารถของ View ในการแสดงข้อมูลและจัดการกับการโต้ตอบของผู้ใช้
View Tests Example
View Tests Example
  • Interactor Tests: ทดสอบ logic ของธุรกิจและการจัดการข้อมูลภายใน Interactor
Interactor Tests Example
  • Presenter Tests: ตรวจสอบให้แน่ใจว่า Presenter จัดรูปแบบข้อมูลได้อย่างถูกต้องสำหรับ View
Presenter Tests Example
  • Router Tests: ทดสอบ logic ของการนำทางภายใน Router
Router Tests Example

การใช้งาน XCTest อย่างมีประสิทธิภาพ

การเขียน test ให้มีประสิทธิภาพไม่ใช่แค่การเขียนให้ผ่านเท่านั้น แต่ต้องเข้าใจว่ามันทำงานยังไงและทำไมถึงจำเป็น ข้างล่างนี้คือเทคนิคที่จะช่วยให้ใช้ XCTest ได้ดียิ่งขึ้น:

  • Testing Asynchronous Code: หลายครั้งเราต้องทดสอบโค้ดที่ทำงานแบบ asynchronous เช่นการเรียก API หรือการอ่านข้อมูลจากฐานข้อมูล XCTest มีเครื่องมือที่ช่วยให้การทำงานนี้ง่ายขึ้น เช่น XCTestExpectation
  • Performance Testing: XCTest ไม่เพียงแต่ช่วยในการ test การทำงานของโค้ดเท่านั้น แต่ยังช่วย test ประสิทธิภาพของโค้ดได้ด้วย เช่น การวัดเวลาที่ใช้ในการทำงานของฟังก์ชันหรือการดึงข้อมูล
  • Mocking และ Dependency Injection: อย่างที่ผมได้บอกไปว่า การใช้ mock objects เป็นสิ่งสำคัญในการ test เพราะช่วยให้เราสามารถ test โค้ดโดยไม่ต้องพึ่งพา resource ภายนอก ซึ่งทำให้ test รวดเร็วและเสถียรมากขึ้น

การทำ Continuous Integration กับ XCTest

นอกจากนี้ เราควรพิจารณาตั้งค่า pipeline การรวมการทดสอบอัตโนมัติ (CI) โดยใช้เครื่องมือเช่น Jenkins, Travis CI หรือ GitHub Actions เพื่อรัน test โดยอัตโนมัติในทุกครั้งที่มีการ commit โค้ด ซึ่งอาจช่วยเจอ bug ได้เร็วขึ้น

สรุป

การทำ Unit Test โดยรวม XCTest กับ Clean Swift Architecture จะทำให้การ maintain code และความน่าเชื่อถือของแอปพลิเคชัน iOS ดีขึ้น เราจะมั่นใจได้ว่า feature หรือ code แต่ละส่วนทำงานได้อย่างที่คาดหวังและทำให้การ refactor และการพัฒนา code base ง่ายขึ้น ลองเริ่มเขียน test กันดูนะครับ ! ><

--

--