UnitTest: XCTest Beginner’s Guide

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

การเขียน Test เป็นสิ่งสำคัญในการพัฒนาซอฟต์แวร์เป็นอย่างมากเพื่อให้แน่ใจว่า code ที่เราเขียนสามารถทำงานได้ดีและเชื่อถือได้ ใน Swift, XCTest คือ Framework ที่คนส่วนมากมักเลือกมาใช้ในการเขียนและ run test ถ้าคุณยังไม่คุ้นกับ XCTest หรือการเขียน test หวังว่าบทความนี้จะทำให้ทุกคนมีความเข้าใจใน XCTest และวิธีใช้มันในการพัฒนาโปรเจค Swift มากขึ้นนะครับ!

Why Test Matters?

ก่อนที่เราจะลงรายละเอียดในเรื่อง XCTest มาพูดถึงว่าทำไมต้องมี test กันก่อนดีกว่าครับ

  • Quality Assurance: test ช่วยหาและป้องกัน bug ที่อาจจะเกิดขึ้น หรือข้อผิดพลาดใน code ก่อนที่จะเอาไปใช้งานจริง ทำให้ product ที่เรา implement มีคุณภาพและมีประสิทธิภาพมากขึ้น
  • Code Maintenance: test เปรียบเสมือนเป็น document ของ code ที่จะทำให้ code อ่านง่ายและง่ายต่อความเข้าใจ แก้ไข และดูแลคุณภาพของ code ในระยะยาว
  • Confidence: การเขียน test ทำให้คุณมั่นใจได้ว่า code ที่คุณเขียนได้ทำงานตามที่คาดหวังไว้ แม้ว่าคุณจะทำการเปลี่ยนแปลงหรือ เพิ่มหรือลด feature ใหม่ในอนาคต็ตาม

ตอนนี้ที่เราเห็นถึงความสำคัญของการ test กันแล้ว เรามาทำความเข้าใจกับ XCTest กันเลย!

What is XCTest?

XCTest คือ built-in testing framework ที่ทาง Apple สร้างมาให้ใช้กับ Swift และ Objective-C มาพร้อมกับ tools กับ feature ครบครันให้เขียนและ run test สำหรับแอปลิเคชั่นต่างๆ อาทิเช่น iOS, macOS, tvOS และ watchOS ที่คุณได้ทำการพัฒนาขึ้น และยังสามารถสร้าง test cases ต่างๆ หรือทำ performance tests ที่สามารถช่วยให้คุณภาพและประสิทธิภาพของ code ดีขึ้นได้

ตัวอย่าง Key Aspect ของ XCTest:

  • Unit Testing: XCTest ช่วยให้ swift developer สามารถเขียน unit tests สำหรับโค้ด Swift ที่ developer เขียนได้, unit tests จะ test เป็น unit เล็กๆ focus ที่การกระทำของแต่ละ function หรือ method ของ code ที่เขียนขึ้นมาเพื่อเช็คว่าผลลัพธ์เป็นไปตามที่คาดหวังหรือไม่
  • Integration Testing: XCTest ยัง support integration test อีกด้วย สามารถ test การโต้ตอบ ระหว่าง component หรือ module ต่างๆ ในระบบหรือแอปพลิเคชันต่างๆของ developer ได้
  • Tests Cases: ในแต่ละ test ของ XCTest จะถูกแบ่งออกเป็น tests cases ต่างๆ ซึ่งจะเป็น class ที่ชื่อว่า XCTestCase class ละส่วนมากนิยมตั้งชื่อ method หรือ function ที่ใช้ test เริ่มต้นด้วยคำว่า “test” เพื่อจะได้รู้ว่านี่คือ method หรือ function test
  • Assertions: XCTest ยังมี assertion function เพื่อใช้ในการตรวจสอบความถูกต้องของ result กับ ผลลัพธ์ที่หวังไว้ของ code มี function อาทิเช่น XCTAssertEqual ที่เป็นการเปรียบเทียบระหว่างผลลัพธ์ที่เราาดว่าจะเป็น กับผลลัพธ์ที่ function output ออกมา ว่าตรงกันมั้ย, XCTAssertTrue ที่เป็นการเช็คว่าผลลัพธ์ที่ได้เป็นจริงใช่มั้ย, XCTAssertFalse ที่เป็นการเช็คว่าผลลัพธ์ที่ได้ไม่เป็นจริงใช่มั้ย, และ อื่นๆ
  • Test Lifecycle Methods: XCTest มี method ที่ช่วยให้เราสามารถติดตั้งค่า และลบหรือทำลายทรัพยากรเครื่องได้ ก่อนและหลังของการทดสอบ method (setUp() และ TearDown()) คือ สอง method ที่ช่วยทำสิ่งนี้ method เหล่านี้จะช่วยรักษาสถานะที่สะอาดและสม่ำเสมอสำหรับการทดสอบแต่ละครั้ง
  • UI Testing: นอกจาก unit testing แล้ว XCTest ยังรองรับการทำ UI Testing ของ iOS แอพพลิเคชั่นด้วย UI test จะจำลองการใช้งานของ user กับ UI ของแอพ และจะตรวจสอบการทำงานของแอพว่าทำงานถูกต้องหรือไม่
  • Xcode Integration: XCTest เป็น Framework ที่พัฒนาการขึ้นกับ Apple’s Development, Xcode เพราะฉะนั้น Dev สามารถทำการเท็สได้โดยตรงผ่าน Xcode และดูผลการทดสอบใน XCode test navigator และสามารถวิเคราะห์การครอบคลุมของโค็ดได้ เพื่อให้แน่ใจว่า test ครอบคลุมอย่างละเอียด

XCTest มีบทบาทสำคัญในการสนับสนุนหลักการของการพัฒนาที่ขับเคลื่อนด้วยการทดสอบ (TDD, Test-Driven Development) และการรวบรวมให้เข้ากันในระบบนิเวศของ Apple

Setting Up XCTest

ก่อนที่จะเริ่มเขียน test เราจะต้องไปตั้งค่า test target ใน Xcode ก่อนสะก่อน ลองทำตามขั้นตอนเหล่านี้:

  • ให้เปิด project ใน Xcode
  • เข้าไปเลือกที่ “File” แล้วเลือก “New” แล้วเลือก “Target”
  • ให้เลือก “iOS Unit Testing Bundle” หรือ “macOS Unit Testing Bundle” ขึ้นอยู่กับ project ของคุณ
  • จากนั้นคลิกที่ “Next” และเพิ่ม target ไปที่ project

ตอนนี้คุณจะมี test target และสามารถเริ่มเพิ่ม test class และ method ได้แล้ว!

Writing XCTest

มาเริ่มด้วยตัวอย่างฟังก์ชันง่ายๆ สมมติว่าคุณมีฟังก์ชัน Swift ที่เป็นผลบวกของสองเลขเข้าด้วยกัน:

ถ้าต้องการเขียน test สำหรับฟังก์ชันนี้ ลองสร้างไฟล์ Swift ใหม่ใน test target ของคุณและเขียน test case ต่อไปนี้:

สิ่งที่ test case นี้ทำ:

  • import XCTest มาใช้เพื่อช่วยในการ test
  • สร้าง test class ชื่อ MyTests ที่มาจาก XCTestCase
  • ใน class มันกำหนด method ที่จะทำการเท็สชื่อ test_add()
  • กำหนดค่า input constant ของ function ที่เราจะทำกาน test โดยในที่นี้ ให้ค่า a = 2 และ b = 3
  • จากนั้น ให้ method สร้าง constant (ในที่นี้คือ result) ที่เรียกใช้ function add()
  • สุดท้ายเราจะใช้ assertion function ที่ชื่อว่า XCTAssertEqual() เพื่อตรวจสอบว่าผลลัพธ์ของ constant result เท่ากับ ผลบวกของ a กับ b จะเท่ากับ 5 (a + b = 5) หรือไม่ ถ้าไม่เท่า test จะ fail ด้วยข้อความ “Addition Failed”
  • ถ้า test ผ่าน XCTest จะมี เครื่องหมายถูกต้องสีเขียวข้างๆ method test ของเรา แต่ถ้า fail เป็นเครื่องหมายกากบาทสีแดงข้างๆ method test ของเรา

How to Run Tests

เพื่อ run test ทำตามขั้นตอนเหล่านี้:

  • คลิกที่ไอคอนรูปทรง Diamond ข้างๆ test class (test ทั้ง class) หรือ method (test เฉพาะ แต่ละ method)
  • หรือจะเลือกที่ “Product” แล้วเลือก “Test” ในเมนู XCode ข้างบนสุด
  • หรือจะรูป Diamond ที่มีเครื่องหมายถูกต้อง ข้างซ้ายบนของ XCode จากนั้นให้เลือก class หรือ method ที่เราจะทำการ test ได้เลย

Xcode จะ run test และจะเห็นผลลัพธ์ใน test navigator

ยินดีด้วยครับ! คุณได้รู้จักพื้นฐานของ XCTest มาขึ้นแล้ว Test อาจจะเป็นการทำขั้นตอนเพิ่มขึ้น แต่มั้นจะคุ้มค่าในระยะยาวด้วยการให้ความมั่นใจในโค้ดเบสของคุณ การเขียน Test เป็นทักษะที่สำคัญสำหรับ developer มากๆ และ XCTest ที่ทำร่วม XCode ทำให้มันง่ายขึ้นในการให้คุณมั่นใจในคุณภาพ code ของคุณ

เมื่อไรที่ทำ project โดยใช้ Swift อย่าลืมเขียน test สำหรับ function และ class กันนะครับ จะได้ไม่เจอ bug กันบ่อยๆ ครับ! ><

--

--